updates.
[runtime.git] / apps / silcd / server.c
1 /*
2
3   server.c
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 1997 - 2002 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19 */
20 /*
21  * This is the actual SILC server than handles everything relating to
22  * servicing the SILC connections. This is also a SILC router as a router
23  * is also normal server.
24  */
25 /* $Id$ */
26
27 #include "serverincludes.h"
28 #include "server_internal.h"
29
30 /* Static prototypes */
31 SILC_TASK_CALLBACK(silc_server_connect_to_router_retry);
32 SILC_TASK_CALLBACK(silc_server_connect_router);
33 SILC_TASK_CALLBACK(silc_server_connect_to_router);
34 SILC_TASK_CALLBACK(silc_server_connect_to_router_second);
35 SILC_TASK_CALLBACK(silc_server_connect_to_router_final);
36 SILC_TASK_CALLBACK(silc_server_accept_new_connection);
37 SILC_TASK_CALLBACK(silc_server_accept_new_connection_second);
38 SILC_TASK_CALLBACK(silc_server_accept_new_connection_final);
39 SILC_TASK_CALLBACK(silc_server_packet_process);
40 SILC_TASK_CALLBACK(silc_server_packet_parse_real);
41 SILC_TASK_CALLBACK(silc_server_close_connection_final);
42 SILC_TASK_CALLBACK(silc_server_free_client_data_timeout);
43 SILC_TASK_CALLBACK(silc_server_timeout_remote);
44 SILC_TASK_CALLBACK(silc_server_channel_key_rekey);
45 SILC_TASK_CALLBACK(silc_server_failure_callback);
46 SILC_TASK_CALLBACK(silc_server_rekey_callback);
47 SILC_TASK_CALLBACK(silc_server_get_stats);
48
49 /* Allocates a new SILC server object. This has to be done before the server
50    can be used. After allocation one must call silc_server_init to initialize
51    the server. The new allocated server object is returned to the new_server
52    argument. */
53
54 int silc_server_alloc(SilcServer *new_server)
55 {
56   SilcServer server;
57
58   SILC_LOG_DEBUG(("Allocating new server object"));
59
60   server = silc_calloc(1, sizeof(*server));
61   server->server_type = SILC_SERVER;
62   server->standalone = TRUE;
63   server->local_list = silc_calloc(1, sizeof(*server->local_list));
64   server->global_list = silc_calloc(1, sizeof(*server->global_list));
65   server->pending_commands = silc_dlist_init();
66 #ifdef SILC_SIM
67   server->sim = silc_dlist_init();
68 #endif
69
70   *new_server = server;
71
72   return TRUE;
73 }
74
75 /* Free's the SILC server object. This is called at the very end before
76    the program ends. */
77
78 void silc_server_free(SilcServer server)
79 {
80   if (server) {
81 #ifdef SILC_SIM
82     SilcSim sim;
83
84     while ((sim = silc_dlist_get(server->sim)) != SILC_LIST_END) {
85       silc_dlist_del(server->sim, sim);
86       silc_sim_free(sim);
87     }
88     silc_dlist_uninit(server->sim);
89 #endif
90
91     silc_server_config_unref(&server->config_ref);
92     if (server->rng)
93       silc_rng_free(server->rng);
94     if (server->pkcs)
95       silc_pkcs_free(server->pkcs);
96     if (server->public_key)
97       silc_pkcs_public_key_free(server->public_key);
98     if (server->private_key)
99       silc_pkcs_private_key_free(server->private_key);
100     if (server->pending_commands)
101       silc_dlist_uninit(server->pending_commands);
102     if (server->id_entry)
103       silc_idlist_del_server(server->local_list, server->id_entry);
104
105     silc_idcache_free(server->local_list->clients);
106     silc_idcache_free(server->local_list->servers);
107     silc_idcache_free(server->local_list->channels);
108     silc_idcache_free(server->global_list->clients);
109     silc_idcache_free(server->global_list->servers);
110     silc_idcache_free(server->global_list->channels);
111     silc_hash_table_free(server->watcher_list);
112
113     silc_free(server->sockets);
114     silc_free(server);
115   }
116 }
117
118 /* Opens a listening port.
119    XXX This function will become more general and will support multiple
120    listening ports */
121
122 static bool silc_server_listen(SilcServer server, int *sock)
123 {
124
125   *sock = silc_net_create_server(server->config->server_info->port,
126                                 server->config->server_info->server_ip);
127   if (*sock < 0) {
128     SILC_LOG_ERROR(("Could not create server listener: %s on %hu",
129                     server->config->server_info->server_ip,
130                     server->config->server_info->port));
131     return FALSE;
132   }
133   return TRUE;
134 }
135
136 /* Initializes the entire SILC server. This is called always before running
137    the server. This is called only once at the initialization of the program.
138    This binds the server to its listenning port. After this function returns
139    one should call silc_server_run to start the server. This returns TRUE
140    when everything is ok to run the server. Configuration file must be
141    read and parsed before calling this. */
142
143 bool silc_server_init(SilcServer server)
144 {
145   int sock;
146   SilcServerID *id;
147   SilcServerEntry id_entry;
148   SilcIDListPurge purge;
149   SilcSocketConnection newsocket = NULL;
150
151   SILC_LOG_DEBUG(("Initializing server"));
152
153   server->starttime = time(NULL);
154
155   /* Take config object for us */
156   silc_server_config_ref(&server->config_ref, server->config, 
157                          server->config);
158
159   /* Steal public and private key from the config object */
160   server->public_key = server->config->server_info->public_key;
161   server->private_key = server->config->server_info->private_key;
162   server->config->server_info->public_key = NULL;
163   server->config->server_info->private_key = NULL;
164
165   /* Register all configured ciphers, PKCS and hash functions. */
166   if (!silc_server_config_register_ciphers(server))
167     silc_cipher_register_default();
168   if (!silc_server_config_register_pkcs(server))
169     silc_pkcs_register_default();
170   if (!silc_server_config_register_hashfuncs(server))
171     silc_hash_register_default();
172   if (!silc_server_config_register_hmacs(server))
173     silc_hmac_register_default();
174
175   /* Initialize random number generator for the server. */
176   server->rng = silc_rng_alloc();
177   silc_rng_init(server->rng);
178   silc_rng_global_init(server->rng);
179
180   /* Initialize hash functions for server to use */
181   silc_hash_alloc("md5", &server->md5hash);
182   silc_hash_alloc("sha1", &server->sha1hash);
183
184   /* Allocate PKCS context for local public and private keys */
185   if (!silc_pkcs_alloc(server->public_key->name, &server->pkcs))
186     goto err;
187   silc_pkcs_public_key_set(server->pkcs, server->public_key);
188   silc_pkcs_private_key_set(server->pkcs, server->private_key);
189
190   /* Initialize the scheduler */
191   server->schedule = silc_schedule_init(server->config->param.connections_max);
192   if (!server->schedule)
193     goto err;
194
195   /* First, register log files configuration for error output */
196   silc_server_config_setlogfiles(server);
197
198   /* Initialize ID caches */
199   server->local_list->clients =
200     silc_idcache_alloc(0, SILC_ID_CLIENT, silc_idlist_client_destructor);
201   server->local_list->servers = silc_idcache_alloc(0, SILC_ID_SERVER, NULL);
202   server->local_list->channels = silc_idcache_alloc(0, SILC_ID_CHANNEL, NULL);
203
204   /* These are allocated for normal server as well as these hold some
205      global information that the server has fetched from its router. For
206      router these are used as they are supposed to be used on router. */
207   server->global_list->clients =
208     silc_idcache_alloc(0, SILC_ID_CLIENT, silc_idlist_client_destructor);
209   server->global_list->servers = silc_idcache_alloc(0, SILC_ID_SERVER, NULL);
210   server->global_list->channels = silc_idcache_alloc(0, SILC_ID_CHANNEL, NULL);
211
212   /* Init watcher list */
213   server->watcher_list = 
214     silc_hash_table_alloc(1, silc_hash_client_id_hash, NULL,
215                           silc_hash_data_compare, (void *)CLIENTID_HASH_LEN,
216                           NULL, NULL, TRUE);
217   if (!server->watcher_list)
218     goto err;
219
220   /* Create a listening server */
221   if (!silc_server_listen(server, &sock))
222     goto err;
223
224   /* Set socket to non-blocking mode */
225   silc_net_set_socket_nonblock(sock);
226   server->sock = sock;
227
228   /* Allocate the entire socket list that is used in server. Eventually
229      all connections will have entry in this table (it is a table of
230      pointers to the actual object that is allocated individually
231      later). */
232   server->sockets = silc_calloc(server->config->param.connections_max,
233                                 sizeof(*server->sockets));
234   if (!server->sockets)
235     goto err;
236
237   /* Add ourselves also to the socket table. The entry allocated above
238      is sent as argument for fast referencing in the future. */
239   silc_socket_alloc(sock, SILC_SOCKET_TYPE_SERVER, NULL, &newsocket);
240   server->sockets[sock] = newsocket;
241
242   /* Perform name and address lookups to resolve the listenning address
243      and port. */
244   if (!silc_net_check_local_by_sock(sock, &newsocket->hostname,
245                                     &newsocket->ip)) {
246     if ((server->config->require_reverse_lookup && !newsocket->hostname) ||
247         !newsocket->ip) {
248       SILC_LOG_ERROR(("IP/DNS lookup failed for local host %s",
249                       newsocket->hostname ? newsocket->hostname :
250                       newsocket->ip ? newsocket->ip : ""));
251       server->stat.conn_failures++;
252       goto err;
253     }
254     if (!newsocket->hostname)
255       newsocket->hostname = strdup(newsocket->ip);
256   }
257   newsocket->port = silc_net_get_local_port(sock);
258
259   /* Create a Server ID for the server. */
260   silc_id_create_server_id(newsocket->ip, newsocket->port, server->rng, &id);
261   if (!id)
262     goto err;
263
264   server->id = id;
265   server->id_string = silc_id_id2str(id, SILC_ID_SERVER);
266   server->id_string_len = silc_id_get_len(id, SILC_ID_SERVER);
267   server->id_type = SILC_ID_SERVER;
268   server->server_name = server->config->server_info->server_name;
269   server->config->server_info->server_name = NULL;
270
271   /* Add ourselves to the server list. We don't have a router yet
272      beacuse we haven't established a route yet. It will be done later.
273      For now, NULL is sent as router. This allocates new entry to
274      the ID list. */
275   id_entry =
276     silc_idlist_add_server(server->local_list, strdup(server->server_name),
277                            server->server_type, server->id, NULL, NULL);
278   if (!id_entry) {
279     SILC_LOG_ERROR(("Could not add ourselves to cache"));
280     goto err;
281   }
282   id_entry->data.status |= SILC_IDLIST_STATUS_REGISTERED;
283
284   /* Put the allocated socket pointer also to the entry allocated above
285      for fast back-referencing to the socket list. */
286   newsocket->user_data = (void *)id_entry;
287   id_entry->connection = (void *)newsocket;
288   server->id_entry = id_entry;
289
290   /* Register protocols */
291   silc_server_protocols_register();
292
293   /* Add the first task to the scheduler. This is task that is executed by
294      timeout. It expires as soon as the caller calls silc_server_run. This
295      task performs authentication protocol and key exchange with our
296      primary router. */
297   silc_schedule_task_add(server->schedule, 0,
298                          silc_server_connect_to_router,
299                          (void *)server, 0, 1,
300                          SILC_TASK_TIMEOUT,
301                          SILC_TASK_PRI_NORMAL);
302
303   /* Add listener task to the scheduler. This task receives new connections
304      to the server. This task remains on the queue until the end of the
305      program. */
306   silc_schedule_task_add(server->schedule, sock,
307                          silc_server_accept_new_connection,
308                          (void *)server, 0, 0,
309                          SILC_TASK_FD,
310                          SILC_TASK_PRI_NORMAL);
311   server->listenning = TRUE;
312
313   /* If server connections has been configured then we must be router as
314      normal server cannot have server connections, only router connections. */
315   if (server->config->servers) {
316     SilcServerConfigServer *ptr = server->config->servers;
317
318     server->server_type = SILC_ROUTER;
319     while (ptr) {
320       if (ptr->backup_router) {
321         server->server_type = SILC_BACKUP_ROUTER;
322         server->backup_router = TRUE;
323         server->id_entry->server_type = SILC_BACKUP_ROUTER;
324         break;
325       }
326       ptr = ptr->next;
327     }
328   }
329
330   /* Register the ID Cache purge task. This periodically purges the ID cache
331      and removes the expired cache entries. */
332
333   /* Clients local list */
334   purge = silc_calloc(1, sizeof(*purge));
335   purge->cache = server->local_list->clients;
336   purge->schedule = server->schedule;
337   purge->timeout = 600;
338   silc_schedule_task_add(purge->schedule, 0,
339                          silc_idlist_purge,
340                          (void *)purge, purge->timeout, 0,
341                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
342
343   /* Clients global list */
344   purge = silc_calloc(1, sizeof(*purge));
345   purge->cache = server->global_list->clients;
346   purge->schedule = server->schedule;
347   purge->timeout = 300;
348   silc_schedule_task_add(purge->schedule, 0,
349                          silc_idlist_purge,
350                          (void *)purge, purge->timeout, 0,
351                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
352
353   /* If we are normal server we'll retrieve network statisticial information
354      once in a while from the router. */
355   if (server->server_type == SILC_SERVER)
356     silc_schedule_task_add(purge->schedule, 0, silc_server_get_stats,
357                            server, 10, 0, SILC_TASK_TIMEOUT,
358                            SILC_TASK_PRI_LOW);
359
360   SILC_LOG_DEBUG(("Server initialized"));
361
362   /* We are done here, return succesfully */
363   return TRUE;
364
365  err:
366   silc_server_config_unref(&server->config_ref);
367   silc_net_close_server(sock);
368   return FALSE;
369 }
370
371 /* This function basically reads the config file again and switches the config
372    object pointed by the server object. After that, we have to fix various
373    things such as the server_name and the listening ports.
374    Keep in mind that we no longer have the root privileges at this point. */
375
376 bool silc_server_rehash(SilcServer server)
377 {
378   SilcServerConfig newconfig;
379
380   SILC_LOG_INFO(("Rehashing server"));
381
382   /* Reset the logging system */
383   silc_log_quick = TRUE;
384   silc_log_flush_all();
385
386   /* Start the main rehash phase (read again the config file) */
387   newconfig = silc_server_config_alloc(server->config_file);
388   if (!newconfig) {
389     SILC_LOG_ERROR(("Rehash FAILED."));
390     return FALSE;
391   }
392
393   /* Reinit scheduler if necessary */
394   if (newconfig->param.connections_max > server->config->param.connections_max)
395     if (!silc_schedule_reinit(server->schedule, 
396                               newconfig->param.connections_max))
397       return FALSE;
398
399   /* Fix the server_name field */
400   if (strcmp(server->server_name, newconfig->server_info->server_name)) {
401     silc_free(server->server_name);
402     server->server_name = newconfig->server_info->server_name;
403     newconfig->server_info->server_name = NULL;
404
405     /* Update the idcache list with a fresh pointer */
406     silc_free(server->id_entry->server_name);
407     server->id_entry->server_name = strdup(server->server_name);
408     if (!silc_idcache_del_by_context(server->local_list->servers, 
409                                      server->id_entry))
410       return FALSE;
411     if (!silc_idcache_add(server->local_list->servers,
412                           server->id_entry->server_name,
413                           server->id_entry->id, server->id_entry, 0, NULL))
414       return FALSE;
415   }
416
417   /* Set logging */
418   silc_server_config_setlogfiles(server);
419
420   /* Change new key pair if necessary */
421   if (newconfig->server_info->public_key &&
422       !silc_pkcs_public_key_compare(server->public_key,
423                                     newconfig->server_info->public_key)) {
424     silc_pkcs_public_key_free(server->public_key);
425     silc_pkcs_private_key_free(server->private_key);
426     server->public_key = newconfig->server_info->public_key;
427     server->private_key = newconfig->server_info->private_key;
428     newconfig->server_info->public_key = NULL;
429     newconfig->server_info->private_key = NULL;
430
431     /* Allocate PKCS context for local public and private keys */
432     silc_pkcs_free(server->pkcs);
433     if (!silc_pkcs_alloc(server->public_key->name, &server->pkcs))
434       return FALSE;
435     silc_pkcs_public_key_set(server->pkcs, server->public_key);
436     silc_pkcs_private_key_set(server->pkcs, server->private_key);
437   }
438
439   /* Go through all configured routers after rehash */
440   silc_schedule_task_add(server->schedule, 0,
441                          silc_server_connect_to_router,
442                          (void *)server, 0, 1,
443                          SILC_TASK_TIMEOUT,
444                          SILC_TASK_PRI_NORMAL);
445
446   /* Check whether our router status has changed */
447   if (newconfig->servers) {
448     SilcServerConfigServer *ptr = newconfig->servers;
449
450     server->server_type = SILC_ROUTER;
451     while (ptr) {
452       if (ptr->backup_router) {
453         server->server_type = SILC_BACKUP_ROUTER;
454         server->backup_router = TRUE;
455         server->id_entry->server_type = SILC_BACKUP_ROUTER;
456         break;
457       }
458       ptr = ptr->next;
459     }
460   }
461
462   /* Our old config is gone now. We'll unreference our reference made in
463      silc_server_init and then destroy it since we are destroying it
464      underneath the application (layer which called silc_server_init). */
465   silc_server_config_unref(&server->config_ref);
466   silc_server_config_destroy(server->config);
467
468   /* Take new config context */
469   server->config = newconfig;
470   silc_server_config_ref(&server->config_ref, server->config, server->config);
471
472   SILC_LOG_DEBUG(("Server rehashed"));
473
474   return TRUE;
475 }
476
477 /* The heart of the server. This runs the scheduler thus runs the server.
478    When this returns the server has been stopped and the program will
479    be terminated. */
480
481 void silc_server_run(SilcServer server)
482 {
483   SILC_LOG_INFO(("SILC Server started"));
484
485   /* Start the scheduler, the heart of the SILC server. When this returns
486      the program will be terminated. */
487   silc_schedule(server->schedule);
488 }
489
490 /* Stops the SILC server. This function is used to shutdown the server.
491    This is usually called after the scheduler has returned. After stopping
492    the server one should call silc_server_free. */
493
494 void silc_server_stop(SilcServer server)
495 {
496   SILC_LOG_DEBUG(("Stopping server"));
497
498   if (server->schedule) {
499     silc_schedule_stop(server->schedule);
500     silc_schedule_uninit(server->schedule);
501     server->schedule = NULL;
502   }
503
504   silc_server_protocols_unregister();
505
506   SILC_LOG_DEBUG(("Server stopped"));
507 }
508
509 /* Function that is called when the network connection to a router has
510    been established.  This will continue with the key exchange protocol
511    with the remote router. */
512
513 void silc_server_start_key_exchange(SilcServer server,
514                                     SilcServerConnection sconn,
515                                     int sock)
516 {
517   SilcSocketConnection newsocket;
518   SilcProtocol protocol;
519   SilcServerKEInternalContext *proto_ctx;
520   SilcServerConfigRouter *conn =
521     (SilcServerConfigRouter *) sconn->conn.ref_ptr;
522   void *context;
523
524   /* Cancel any possible retry timeouts */
525   silc_schedule_task_del_by_callback(server->schedule,
526                                      silc_server_connect_router);
527
528   /* Set socket options */
529   silc_net_set_socket_nonblock(sock);
530   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
531
532   /* Create socket connection for the connection. Even though we
533      know that we are connecting to a router we will mark the socket
534      to be unknown connection until we have executed authentication
535      protocol. */
536   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
537   server->sockets[sock] = newsocket;
538   newsocket->hostname = strdup(sconn->remote_host);
539   newsocket->ip = strdup(sconn->remote_host);
540   newsocket->port = sconn->remote_port;
541   sconn->sock = newsocket;
542
543   /* Allocate internal protocol context. This is sent as context
544      to the protocol. */
545   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
546   proto_ctx->server = (void *)server;
547   proto_ctx->context = (void *)sconn;
548   proto_ctx->sock = newsocket;
549   proto_ctx->rng = server->rng;
550   proto_ctx->responder = FALSE;
551
552   /* Set Key Exchange flags from configuration, but fall back to global
553      settings too. */
554   SILC_GET_SKE_FLAGS(conn, proto_ctx);
555   if (server->config->param.key_exchange_pfs)
556     proto_ctx->flags |= SILC_SKE_SP_FLAG_PFS;
557
558   /* Perform key exchange protocol. silc_server_connect_to_router_second
559      will be called after the protocol is finished. */
560   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE,
561                       &protocol, proto_ctx,
562                       silc_server_connect_to_router_second);
563   newsocket->protocol = protocol;
564
565   /* Register a timeout task that will be executed if the protocol
566      is not executed within set limit. */
567   proto_ctx->timeout_task =
568     silc_schedule_task_add(server->schedule, sock,
569                            silc_server_timeout_remote,
570                            server, server->config->key_exchange_timeout, 0,
571                            SILC_TASK_TIMEOUT,
572                            SILC_TASK_PRI_LOW);
573
574   /* Register the connection for network input and output. This sets
575      that scheduler will listen for incoming packets for this connection
576      and sets that outgoing packets may be sent to this connection as
577      well. However, this doesn't set the scheduler for outgoing traffic,
578      it will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
579      later when outgoing data is available. */
580   context = (void *)server;
581   SILC_REGISTER_CONNECTION_FOR_IO(sock);
582
583   /* Run the protocol */
584   silc_protocol_execute(protocol, server->schedule, 0, 0);
585 }
586
587 /* Timeout callback that will be called to retry connecting to remote
588    router. This is used by both normal and router server. This will wait
589    before retrying the connecting. The timeout is generated by exponential
590    backoff algorithm. */
591
592 SILC_TASK_CALLBACK(silc_server_connect_to_router_retry)
593 {
594   SilcServerConnection sconn = (SilcServerConnection)context;
595   SilcServer server = sconn->server;
596   SilcServerConfigRouter *conn = sconn->conn.ref_ptr;
597   SilcServerConfigConnParams *param =
598                 (conn->param ? conn->param : &server->config->param);
599
600   SILC_LOG_INFO(("Retrying connecting to a router"));
601
602   /* Calculate next timeout */
603   if (sconn->retry_count >= 1) {
604     sconn->retry_timeout = sconn->retry_timeout * SILC_SERVER_RETRY_MULTIPLIER;
605     if (sconn->retry_timeout > param->reconnect_interval_max)
606       sconn->retry_timeout = param->reconnect_interval_max;
607   } else {
608     sconn->retry_timeout = param->reconnect_interval;
609   }
610   sconn->retry_count++;
611   sconn->retry_timeout = sconn->retry_timeout +
612     silc_rng_get_rn32(server->rng) % SILC_SERVER_RETRY_RANDOMIZER;
613
614   /* If we've reached max retry count, give up. */
615   if ((sconn->retry_count > param->reconnect_count) &&
616       !param->reconnect_keep_trying) {
617     SILC_LOG_ERROR(("Could not connect to router, giving up"));
618     silc_server_config_unref(&sconn->conn);
619     silc_free(sconn->remote_host);
620     silc_free(sconn->backup_replace_ip);
621     silc_free(sconn);
622     return;
623   }
624
625   /* We will lookup a fresh pointer later */
626   silc_server_config_unref(&sconn->conn);
627
628   /* Wait one before retrying */
629   silc_schedule_task_add(server->schedule, 0, silc_server_connect_router,
630                          context, sconn->retry_timeout, 0,
631                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
632 }
633
634 /* Generic routine to use connect to a router. */
635
636 SILC_TASK_CALLBACK(silc_server_connect_router)
637 {
638   SilcServerConnection sconn = (SilcServerConnection)context;
639   SilcServer server = sconn->server;
640   SilcServerConfigRouter *rconn;
641   int sock;
642
643   SILC_LOG_INFO(("Connecting to the %s %s on port %d",
644                  (sconn->backup ? "backup router" : "router"),
645                  sconn->remote_host, sconn->remote_port));
646
647   server->router_connect = time(NULL);
648   rconn = silc_server_config_find_router_conn(server, sconn->remote_host,
649                                               sconn->remote_port);
650   if (!rconn) {
651     SILC_LOG_INFO(("Unconfigured %s connection %s:%d, cannot connect",
652                    (sconn->backup ? "backup router" : "router"),
653                    sconn->remote_host, sconn->remote_port));
654     silc_free(sconn->remote_host);
655     silc_free(sconn->backup_replace_ip);
656     silc_free(sconn);
657     return;
658   }
659   silc_server_config_ref(&sconn->conn, server->config, (void *)rconn);
660
661   /* Connect to remote host */
662   sock = silc_net_create_connection(server->config->server_info->server_ip,
663                                     sconn->remote_port,
664                                     sconn->remote_host);
665   if (sock < 0) {
666     SILC_LOG_ERROR(("Could not connect to router %s:%d",
667                     sconn->remote_host, sconn->remote_port));
668     if (!sconn->no_reconnect)
669       silc_schedule_task_add(server->schedule, 0,
670                              silc_server_connect_to_router_retry,
671                              context, 0, 1, SILC_TASK_TIMEOUT,
672                              SILC_TASK_PRI_NORMAL);
673     else
674       silc_server_config_unref(&sconn->conn);
675     return;
676   }
677
678   /* Continue with key exchange protocol */
679   silc_server_start_key_exchange(server, sconn, sock);
680 }
681
682 /* This function connects to our primary router or if we are a router this
683    establishes all our primary routes. This is called at the start of the
684    server to do authentication and key exchange with our router - called
685    from schedule. */
686
687 SILC_TASK_CALLBACK(silc_server_connect_to_router)
688 {
689   SilcServer server = (SilcServer)context;
690   SilcServerConnection sconn;
691   SilcServerConfigRouter *ptr;
692
693   SILC_LOG_DEBUG(("Connecting to router(s)"));
694
695   if (server->server_type == SILC_SERVER) {
696     SILC_LOG_DEBUG(("We are normal server"));
697   } else if (server->server_type == SILC_ROUTER) {
698     SILC_LOG_DEBUG(("We are router"));
699   } else {
700     SILC_LOG_DEBUG(("We are backup router/normal server"));
701   }
702
703   if (!server->config->routers) {
704     /* There wasn't a configured router, we will continue but we don't
705        have a connection to outside world.  We will be standalone server. */
706     SILC_LOG_DEBUG(("No router(s), server will be standalone"));
707     server->standalone = TRUE;
708     return;
709   }
710
711   /* Cancel any possible retry timeouts */
712   silc_schedule_task_del_by_callback(server->schedule,
713                                      silc_server_connect_router);
714   silc_schedule_task_del_by_callback(server->schedule,
715                                      silc_server_connect_to_router_retry);
716
717   /* Create the connections to all our routes */
718   for (ptr = server->config->routers; ptr; ptr = ptr->next) {
719
720     SILC_LOG_DEBUG(("%s connection [%s] %s:%d",
721                     ptr->backup_router ? "Backup router" : "Router",
722                     ptr->initiator ? "Initiator" : "Responder",
723                     ptr->host, ptr->port));
724
725     if (ptr->initiator) {
726       /* Check whether we are connected to this host already */
727       if (silc_server_num_sockets_by_remote(server, 
728                                             silc_net_is_ip(ptr->host) ?
729                                             ptr->host : NULL,
730                                             silc_net_is_ip(ptr->host) ?
731                                             NULL : ptr->host, ptr->port,
732                                             SILC_SOCKET_TYPE_ROUTER)) {
733         SILC_LOG_DEBUG(("We are already connected to this router"));
734         continue;
735       }
736
737       /* Allocate connection object for hold connection specific stuff. */
738       sconn = silc_calloc(1, sizeof(*sconn));
739       sconn->server = server;
740       sconn->remote_host = strdup(ptr->host);
741       sconn->remote_port = ptr->port;
742       sconn->backup = ptr->backup_router;
743       if (sconn->backup) {
744         sconn->backup_replace_ip = strdup(ptr->backup_replace_ip);
745         sconn->backup_replace_port = ptr->backup_replace_port;
746       }
747
748       if (!server->router_conn && !sconn->backup)
749         server->router_conn = sconn;
750
751       silc_schedule_task_add(server->schedule, 0,
752                              silc_server_connect_router,
753                              (void *)sconn, 0, 1, SILC_TASK_TIMEOUT,
754                              SILC_TASK_PRI_NORMAL);
755     }
756   }
757 }
758
759 /* Second part of connecting to router(s). Key exchange protocol has been
760    executed and now we will execute authentication protocol. */
761
762 SILC_TASK_CALLBACK(silc_server_connect_to_router_second)
763 {
764   SilcProtocol protocol = (SilcProtocol)context;
765   SilcServerKEInternalContext *ctx =
766     (SilcServerKEInternalContext *)protocol->context;
767   SilcServer server = (SilcServer)ctx->server;
768   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
769   SilcSocketConnection sock = ctx->sock;
770   SilcServerConnAuthInternalContext *proto_ctx;
771   SilcServerConfigRouter *conn = NULL;
772
773   SILC_LOG_DEBUG(("Start"));
774
775   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
776       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
777     /* Error occured during protocol */
778     silc_protocol_free(protocol);
779     sock->protocol = NULL;
780     silc_ske_free_key_material(ctx->keymat);
781     if (ctx->packet)
782       silc_packet_context_free(ctx->packet);
783     if (ctx->ske)
784       silc_ske_free(ctx->ske);
785     silc_free(ctx->dest_id);
786     silc_free(ctx);
787     silc_server_config_unref(&sconn->conn);
788     silc_free(sconn->remote_host);
789     silc_free(sconn->backup_replace_ip);
790     silc_free(sconn);
791     silc_schedule_task_del_by_callback(server->schedule,
792                                        silc_server_failure_callback);
793     silc_server_disconnect_remote(server, sock, 
794                                   SILC_STATUS_ERR_KEY_EXCHANGE_FAILED, NULL);
795     return;
796   }
797
798   /* We now have the key material as the result of the key exchange
799      protocol. Take the key material into use. Free the raw key material
800      as soon as we've set them into use. */
801   if (!silc_server_protocol_ke_set_keys(server, ctx->ske,
802                                         ctx->sock, ctx->keymat,
803                                         ctx->ske->prop->cipher,
804                                         ctx->ske->prop->pkcs,
805                                         ctx->ske->prop->hash,
806                                         ctx->ske->prop->hmac,
807                                         ctx->ske->prop->group,
808                                         ctx->responder)) {
809     silc_protocol_free(protocol);
810     sock->protocol = NULL;
811     silc_ske_free_key_material(ctx->keymat);
812     if (ctx->packet)
813       silc_packet_context_free(ctx->packet);
814     if (ctx->ske)
815       silc_ske_free(ctx->ske);
816     silc_free(ctx->dest_id);
817     silc_free(ctx);
818     silc_server_config_unref(&sconn->conn);
819     silc_free(sconn->remote_host);
820     silc_free(sconn->backup_replace_ip);
821     silc_free(sconn);
822     silc_schedule_task_del_by_callback(server->schedule,
823                                        silc_server_failure_callback);
824     silc_server_disconnect_remote(server, sock, 
825                                   SILC_STATUS_ERR_KEY_EXCHANGE_FAILED, NULL);
826     return;
827   }
828   silc_ske_free_key_material(ctx->keymat);
829
830   /* Allocate internal context for the authentication protocol. This
831      is sent as context for the protocol. */
832   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
833   proto_ctx->server = (void *)server;
834   proto_ctx->context = (void *)sconn;
835   proto_ctx->sock = sock;
836   proto_ctx->ske = ctx->ske;       /* Save SKE object from previous protocol */
837   proto_ctx->dest_id_type = ctx->dest_id_type;
838   proto_ctx->dest_id = ctx->dest_id;
839
840   /* Resolve the authentication method used in this connection. Check if
841      we find a match from user configured connections */
842   if (!sconn->conn.ref_ptr)
843     conn = silc_server_config_find_router_conn(server, sock->hostname,
844                                                sock->port);
845   else
846     conn = sconn->conn.ref_ptr;
847
848   if (conn) {
849     /* Match found. Use the configured authentication method. Take only
850        the passphrase, since for public key auth we automatically use
851        our local key pair. */
852     if (conn->passphrase) {
853       if (conn->publickeys && !server->config->prefer_passphrase_auth) {
854         proto_ctx->auth_meth = SILC_AUTH_PUBLIC_KEY;
855       } else {
856         proto_ctx->auth_data = strdup(conn->passphrase);
857         proto_ctx->auth_data_len = strlen(conn->passphrase);
858         proto_ctx->auth_meth = SILC_AUTH_PASSWORD;
859       }
860     } else if (conn->publickeys) {
861       proto_ctx->auth_meth = SILC_AUTH_PUBLIC_KEY;
862     } else {
863       proto_ctx->auth_meth = SILC_AUTH_NONE;
864     }
865   } else {
866     SILC_LOG_ERROR(("Could not find connection data for %s (%s) on port",
867                     sock->hostname, sock->ip, sock->port));
868     silc_protocol_free(protocol);
869     sock->protocol = NULL;
870     if (ctx->packet)
871       silc_packet_context_free(ctx->packet);
872     if (ctx->ske)
873       silc_ske_free(ctx->ske);
874     silc_free(ctx->dest_id);
875     silc_free(ctx);
876     silc_server_config_unref(&sconn->conn);
877     silc_free(sconn->remote_host);
878     silc_free(sconn->backup_replace_ip);
879     silc_free(sconn);
880     silc_schedule_task_del_by_callback(server->schedule,
881                                        silc_server_failure_callback);
882     silc_server_disconnect_remote(server, sock, 
883                                   SILC_STATUS_ERR_KEY_EXCHANGE_FAILED, NULL);
884     return;
885   }
886
887   /* Free old protocol as it is finished now */
888   silc_protocol_free(protocol);
889   if (ctx->packet)
890     silc_packet_context_free(ctx->packet);
891   silc_free(ctx);
892   sock->protocol = NULL;
893
894   /* Allocate the authentication protocol. This is allocated here
895      but we won't start it yet. We will be receiving party of this
896      protocol thus we will wait that connecting party will make
897      their first move. */
898   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH,
899                       &sock->protocol, proto_ctx,
900                       silc_server_connect_to_router_final);
901
902   /* Register timeout task. If the protocol is not executed inside
903      this timelimit the connection will be terminated. */
904   proto_ctx->timeout_task =
905     silc_schedule_task_add(server->schedule, sock->sock,
906                            silc_server_timeout_remote,
907                            (void *)server,
908                            server->config->conn_auth_timeout, 0,
909                            SILC_TASK_TIMEOUT,
910                            SILC_TASK_PRI_LOW);
911
912   /* Run the protocol */
913   silc_protocol_execute(sock->protocol, server->schedule, 0, 0);
914 }
915
916 /* Finalizes the connection to router. Registers a server task to the
917    queue so that we can accept new connections. */
918
919 SILC_TASK_CALLBACK(silc_server_connect_to_router_final)
920 {
921   SilcProtocol protocol = (SilcProtocol)context;
922   SilcServerConnAuthInternalContext *ctx =
923     (SilcServerConnAuthInternalContext *)protocol->context;
924   SilcServer server = (SilcServer)ctx->server;
925   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
926   SilcSocketConnection sock = ctx->sock;
927   SilcServerEntry id_entry;
928   SilcBuffer packet;
929   SilcServerHBContext hb_context;
930   unsigned char *id_string;
931   SilcUInt32 id_len;
932   SilcIDListData idata;
933   SilcServerConfigRouter *conn = NULL;
934   SilcServerConfigConnParams *param = NULL;
935
936   SILC_LOG_DEBUG(("Start"));
937
938   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
939       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
940     /* Error occured during protocol */
941     silc_free(ctx->dest_id);
942     silc_server_disconnect_remote(server, sock, SILC_STATUS_ERR_AUTH_FAILED,
943                                   NULL);
944     goto out;
945   }
946
947   /* Add a task to the queue. This task receives new connections to the
948      server. This task remains on the queue until the end of the program. */
949   if (!server->listenning && !sconn->backup) {
950     silc_schedule_task_add(server->schedule, server->sock,
951                            silc_server_accept_new_connection,
952                            (void *)server, 0, 0,
953                            SILC_TASK_FD,
954                            SILC_TASK_PRI_NORMAL);
955     server->listenning = TRUE;
956   }
957
958   /* Send NEW_SERVER packet to the router. We will become registered
959      to the SILC network after sending this packet. */
960   id_string = silc_id_id2str(server->id, SILC_ID_SERVER);
961   id_len = silc_id_get_len(server->id, SILC_ID_SERVER);
962   packet = silc_buffer_alloc(2 + 2 + id_len + strlen(server->server_name));
963   silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
964   silc_buffer_format(packet,
965                      SILC_STR_UI_SHORT(id_len),
966                      SILC_STR_UI_XNSTRING(id_string, id_len),
967                      SILC_STR_UI_SHORT(strlen(server->server_name)),
968                      SILC_STR_UI_XNSTRING(server->server_name,
969                                           strlen(server->server_name)),
970                      SILC_STR_END);
971
972   /* Send the packet */
973   silc_server_packet_send(server, ctx->sock, SILC_PACKET_NEW_SERVER, 0,
974                           packet->data, packet->len, TRUE);
975   silc_buffer_free(packet);
976   silc_free(id_string);
977
978   SILC_LOG_INFO(("Connected to router %s", sock->hostname));
979
980   /* Check that we do not have this ID already */
981   id_entry = silc_idlist_find_server_by_id(server->local_list,
982                                            ctx->dest_id, TRUE, NULL);
983   if (id_entry) {
984     silc_idcache_del_by_context(server->local_list->servers, id_entry);
985   } else {
986     id_entry = silc_idlist_find_server_by_id(server->global_list,
987                                              ctx->dest_id, TRUE, NULL);
988     if (id_entry)
989       silc_idcache_del_by_context(server->global_list->servers, id_entry);
990   }
991
992   SILC_LOG_DEBUG(("New server id(%s)",
993                   silc_id_render(ctx->dest_id, SILC_ID_SERVER)));
994
995   /* Add the connected router to global server list */
996   id_entry = silc_idlist_add_server(server->global_list,
997                                     strdup(sock->hostname),
998                                     SILC_ROUTER, ctx->dest_id, NULL, sock);
999   if (!id_entry) {
1000     silc_free(ctx->dest_id);
1001     SILC_LOG_ERROR(("Cannot add new server entry to cache"));
1002     silc_server_disconnect_remote(server, sock, SILC_STATUS_ERR_AUTH_FAILED,
1003                                   NULL);
1004     goto out;
1005   }
1006
1007   silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
1008   silc_free(sock->user_data);
1009   sock->user_data = (void *)id_entry;
1010   sock->type = SILC_SOCKET_TYPE_ROUTER;
1011   idata = (SilcIDListData)sock->user_data;
1012   idata->status |= SILC_IDLIST_STATUS_REGISTERED;
1013
1014   conn = sconn->conn.ref_ptr;
1015   param = &server->config->param;
1016   if (conn && conn->param)
1017     param = conn->param;
1018
1019   /* Perform keepalive. The `hb_context' will be freed automatically
1020      when finally calling the silc_socket_free function. */
1021   hb_context = silc_calloc(1, sizeof(*hb_context));
1022   hb_context->server = server;
1023   silc_socket_set_heartbeat(sock, param->keepalive_secs, hb_context,
1024                             silc_server_perform_heartbeat,
1025                             server->schedule);
1026
1027   /* Register re-key timeout */
1028   idata->rekey->timeout = param->key_exchange_rekey;
1029   idata->rekey->context = (void *)server;
1030   silc_schedule_task_add(server->schedule, sock->sock,
1031                          silc_server_rekey_callback,
1032                          (void *)sock, idata->rekey->timeout, 0,
1033                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
1034
1035   if (!sconn->backup) {
1036     /* Mark this router our primary router if we're still standalone */
1037     if (server->standalone) {
1038       server->id_entry->router = id_entry;
1039       server->router = id_entry;
1040       server->standalone = FALSE;
1041
1042       /* If we are router then announce our possible servers. */
1043       if (server->server_type == SILC_ROUTER)
1044         silc_server_announce_servers(server, FALSE, 0,
1045                                      server->router->connection);
1046
1047       /* Announce our clients and channels to the router */
1048       silc_server_announce_clients(server, 0, server->router->connection);
1049       silc_server_announce_channels(server, 0, server->router->connection);
1050     }
1051   } else {
1052     /* Add this server to be our backup router */
1053     silc_server_backup_add(server, id_entry, sconn->backup_replace_ip,
1054                            sconn->backup_replace_port, FALSE);
1055   }
1056
1057   sock->protocol = NULL;
1058
1059   /* Call the completion callback to indicate that we've connected to
1060      the router */
1061   if (sconn->callback)
1062     (*sconn->callback)(server, id_entry, sconn->callback_context);
1063
1064  out:
1065   /* Free the temporary connection data context */
1066   if (sconn) {
1067     silc_server_config_unref(&sconn->conn);
1068     silc_free(sconn->remote_host);
1069     silc_free(sconn->backup_replace_ip);
1070     silc_free(sconn);
1071   }
1072   if (sconn == server->router_conn)
1073     server->router_conn = NULL;
1074
1075   /* Free the protocol object */
1076   if (sock->protocol == protocol)
1077     sock->protocol = NULL;
1078   silc_protocol_free(protocol);
1079   if (ctx->packet)
1080     silc_packet_context_free(ctx->packet);
1081   if (ctx->ske)
1082     silc_ske_free(ctx->ske);
1083   if (ctx->auth_meth == SILC_AUTH_PASSWORD)
1084     silc_free(ctx->auth_data);
1085   silc_free(ctx);
1086 }
1087
1088 /* Host lookup callback that is called after the incoming connection's
1089    IP and FQDN lookup is performed. This will actually check the acceptance
1090    of the incoming connection and will register the key exchange protocol
1091    for this connection. */
1092
1093 static void
1094 silc_server_accept_new_connection_lookup(SilcSocketConnection sock,
1095                                          void *context)
1096 {
1097   SilcServer server = (SilcServer)context;
1098   SilcServerKEInternalContext *proto_ctx;
1099   SilcServerConfigClient *cconfig = NULL;
1100   SilcServerConfigServer *sconfig = NULL;
1101   SilcServerConfigRouter *rconfig = NULL;
1102   SilcServerConfigDeny *deny;
1103   int port;
1104
1105   SILC_LOG_DEBUG(("Start"));
1106
1107   /* Check whether we could resolve both IP and FQDN. */
1108   if (!sock->ip || (!strcmp(sock->ip, sock->hostname) &&
1109                     server->config->require_reverse_lookup)) {
1110     SILC_LOG_ERROR(("IP/DNS lookup failed %s",
1111                     sock->hostname ? sock->hostname :
1112                     sock->ip ? sock->ip : ""));
1113     server->stat.conn_failures++;
1114     silc_server_disconnect_remote(server, sock,
1115                                   SILC_STATUS_ERR_INCOMPLETE_INFORMATION,
1116                                   "Unknown host or IP");
1117     return;
1118   }
1119
1120   /* Register the connection for network input and output. This sets
1121      that scheduler will listen for incoming packets for this connection
1122      and sets that outgoing packets may be sent to this connection as well.
1123      However, this doesn't set the scheduler for outgoing traffic, it
1124      will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
1125      later when outgoing data is available. */
1126   SILC_REGISTER_CONNECTION_FOR_IO(sock->sock);
1127
1128   SILC_LOG_INFO(("Incoming connection %s (%s)", sock->hostname,
1129                  sock->ip));
1130
1131   port = server->sockets[server->sock]->port; /* Listenning port */
1132
1133   /* Check whether this connection is denied to connect to us. */
1134   deny = silc_server_config_find_denied(server, sock->ip);
1135   if (!deny)
1136     deny = silc_server_config_find_denied(server, sock->hostname);
1137   if (deny) {
1138     /* The connection is denied */
1139     SILC_LOG_INFO(("Connection %s (%s) is denied",
1140                    sock->hostname, sock->ip));
1141     silc_server_disconnect_remote(server, sock, 
1142                                   SILC_STATUS_ERR_BANNED_FROM_SERVER,
1143                                   deny->reason);
1144     server->stat.conn_failures++;
1145     return;
1146   }
1147
1148   /* Check whether we have configured this sort of connection at all. We
1149      have to check all configurations since we don't know what type of
1150      connection this is. */
1151   if (!(cconfig = silc_server_config_find_client(server, sock->ip)))
1152     cconfig = silc_server_config_find_client(server, sock->hostname);
1153   if (!(sconfig = silc_server_config_find_server_conn(server, sock->ip)))
1154     sconfig = silc_server_config_find_server_conn(server, sock->hostname);
1155   if (server->server_type == SILC_ROUTER) {
1156     if (!(rconfig = silc_server_config_find_router_conn(server,
1157                                                         sock->ip, port)))
1158       rconfig = silc_server_config_find_router_conn(server, sock->hostname,
1159                                                     sock->port);
1160   }
1161   if (!cconfig && !sconfig && !rconfig) {
1162     SILC_LOG_INFO(("Connection %s (%s) is not allowed", sock->hostname,
1163                    sock->ip));
1164     silc_server_disconnect_remote(server, sock,
1165                                   SILC_STATUS_ERR_BANNED_FROM_SERVER);
1166     server->stat.conn_failures++;
1167     return;
1168   }
1169
1170   /* The connection is allowed */
1171
1172   /* Allocate internal context for key exchange protocol. This is
1173      sent as context for the protocol. */
1174   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
1175   proto_ctx->server = context;
1176   proto_ctx->sock = sock;
1177   proto_ctx->rng = server->rng;
1178   proto_ctx->responder = TRUE;
1179   silc_server_config_ref(&proto_ctx->cconfig, server->config, cconfig);
1180   silc_server_config_ref(&proto_ctx->sconfig, server->config, sconfig);
1181   silc_server_config_ref(&proto_ctx->rconfig, server->config, rconfig);
1182
1183   /* Take flags for key exchange. Since we do not know what type of connection
1184      this is, we go through all found configurations and use the global ones
1185      as well. This will result always into strictest key exchange flags. */
1186   SILC_GET_SKE_FLAGS(cconfig, proto_ctx);
1187   SILC_GET_SKE_FLAGS(sconfig, proto_ctx);
1188   SILC_GET_SKE_FLAGS(rconfig, proto_ctx);
1189   if (server->config->param.key_exchange_pfs)
1190     proto_ctx->flags |= SILC_SKE_SP_FLAG_PFS;
1191
1192   /* Prepare the connection for key exchange protocol. We allocate the
1193      protocol but will not start it yet. The connector will be the
1194      initiator of the protocol thus we will wait for initiation from
1195      there before we start the protocol. */
1196   server->stat.auth_attempts++;
1197   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE,
1198                       &sock->protocol, proto_ctx,
1199                       silc_server_accept_new_connection_second);
1200
1201   /* Register a timeout task that will be executed if the connector
1202      will not start the key exchange protocol within specified timeout
1203      and the connection will be closed. */
1204   proto_ctx->timeout_task =
1205     silc_schedule_task_add(server->schedule, sock->sock,
1206                            silc_server_timeout_remote,
1207                            context, server->config->key_exchange_timeout, 0,
1208                            SILC_TASK_TIMEOUT,
1209                            SILC_TASK_PRI_LOW);
1210 }
1211
1212 /* Accepts new connections to the server. Accepting new connections are
1213    done in three parts to make it async. */
1214
1215 SILC_TASK_CALLBACK(silc_server_accept_new_connection)
1216 {
1217   SilcServer server = (SilcServer)context;
1218   SilcSocketConnection newsocket;
1219   int sock;
1220
1221   SILC_LOG_DEBUG(("Accepting new connection"));
1222
1223   server->stat.conn_attempts++;
1224
1225   sock = silc_net_accept_connection(server->sock);
1226   if (sock < 0) {
1227     SILC_LOG_ERROR(("Could not accept new connection: %s", strerror(errno)));
1228     server->stat.conn_failures++;
1229     return;
1230   }
1231
1232   /* Check for maximum allowed connections */
1233   if (sock > server->config->param.connections_max) {
1234     SILC_LOG_ERROR(("Refusing connection, server is full"));
1235     server->stat.conn_failures++;
1236     silc_net_close_connection(sock);
1237     return;
1238   }
1239
1240   /* Set socket options */
1241   silc_net_set_socket_nonblock(sock);
1242   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
1243
1244   /* We don't create a ID yet, since we don't know what type of connection
1245      this is yet. But, we do add the connection to the socket table. */
1246   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
1247   server->sockets[sock] = newsocket;
1248
1249   /* Perform asynchronous host lookup. This will lookup the IP and the
1250      FQDN of the remote connection. After the lookup is done the connection
1251      is accepted further. */
1252   silc_socket_host_lookup(newsocket, TRUE,
1253                           silc_server_accept_new_connection_lookup, context,
1254                           server->schedule);
1255 }
1256
1257 /* Second part of accepting new connection. Key exchange protocol has been
1258    performed and now it is time to do little connection authentication
1259    protocol to figure out whether this connection is client or server
1260    and whether it has right to access this server (especially server
1261    connections needs to be authenticated). */
1262
1263 SILC_TASK_CALLBACK(silc_server_accept_new_connection_second)
1264 {
1265   SilcProtocol protocol = (SilcProtocol)context;
1266   SilcServerKEInternalContext *ctx =
1267     (SilcServerKEInternalContext *)protocol->context;
1268   SilcServer server = (SilcServer)ctx->server;
1269   SilcSocketConnection sock = ctx->sock;
1270   SilcServerConnAuthInternalContext *proto_ctx;
1271
1272   SILC_LOG_DEBUG(("Start"));
1273
1274   if ((protocol->state == SILC_PROTOCOL_STATE_ERROR) ||
1275       (protocol->state == SILC_PROTOCOL_STATE_FAILURE)) {
1276     /* Error occured during protocol */
1277     silc_protocol_free(protocol);
1278     sock->protocol = NULL;
1279     silc_ske_free_key_material(ctx->keymat);
1280     if (ctx->packet)
1281       silc_packet_context_free(ctx->packet);
1282     if (ctx->ske)
1283       silc_ske_free(ctx->ske);
1284     silc_free(ctx->dest_id);
1285     silc_server_config_unref(&ctx->cconfig);
1286     silc_server_config_unref(&ctx->sconfig);
1287     silc_server_config_unref(&ctx->rconfig);
1288     silc_free(ctx);
1289     silc_schedule_task_del_by_callback(server->schedule,
1290                                        silc_server_failure_callback);
1291     silc_server_disconnect_remote(server, sock, 
1292                                   SILC_STATUS_ERR_KEY_EXCHANGE_FAILED,
1293                                   NULL);
1294     server->stat.auth_failures++;
1295     return;
1296   }
1297
1298   /* We now have the key material as the result of the key exchange
1299      protocol. Take the key material into use. Free the raw key material
1300      as soon as we've set them into use. */
1301   if (!silc_server_protocol_ke_set_keys(server, ctx->ske,
1302                                         ctx->sock, ctx->keymat,
1303                                         ctx->ske->prop->cipher,
1304                                         ctx->ske->prop->pkcs,
1305                                         ctx->ske->prop->hash,
1306                                         ctx->ske->prop->hmac,
1307                                         ctx->ske->prop->group,
1308                                         ctx->responder)) {
1309     silc_protocol_free(protocol);
1310     sock->protocol = NULL;
1311     silc_ske_free_key_material(ctx->keymat);
1312     if (ctx->packet)
1313       silc_packet_context_free(ctx->packet);
1314     if (ctx->ske)
1315       silc_ske_free(ctx->ske);
1316     silc_free(ctx->dest_id);
1317     silc_server_config_unref(&ctx->cconfig);
1318     silc_server_config_unref(&ctx->sconfig);
1319     silc_server_config_unref(&ctx->rconfig);
1320     silc_free(ctx);
1321     silc_schedule_task_del_by_callback(server->schedule,
1322                                        silc_server_failure_callback);
1323     silc_server_disconnect_remote(server, sock, 
1324                                   SILC_STATUS_ERR_KEY_EXCHANGE_FAILED, NULL);
1325     server->stat.auth_failures++;
1326     return;
1327   }
1328   silc_ske_free_key_material(ctx->keymat);
1329
1330   /* Allocate internal context for the authentication protocol. This
1331      is sent as context for the protocol. */
1332   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
1333   proto_ctx->server = (void *)server;
1334   proto_ctx->sock = sock;
1335   proto_ctx->ske = ctx->ske;    /* Save SKE object from previous protocol */
1336   proto_ctx->responder = TRUE;
1337   proto_ctx->dest_id_type = ctx->dest_id_type;
1338   proto_ctx->dest_id = ctx->dest_id;
1339   proto_ctx->cconfig = ctx->cconfig;
1340   proto_ctx->sconfig = ctx->sconfig;
1341   proto_ctx->rconfig = ctx->rconfig;
1342
1343   /* Free old protocol as it is finished now */
1344   silc_protocol_free(protocol);
1345   if (ctx->packet)
1346     silc_packet_context_free(ctx->packet);
1347   silc_free(ctx);
1348   sock->protocol = NULL;
1349
1350   /* Allocate the authentication protocol. This is allocated here
1351      but we won't start it yet. We will be receiving party of this
1352      protocol thus we will wait that connecting party will make
1353      their first move. */
1354   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH,
1355                       &sock->protocol, proto_ctx,
1356                       silc_server_accept_new_connection_final);
1357
1358   /* Register timeout task. If the protocol is not executed inside
1359      this timelimit the connection will be terminated. */
1360   proto_ctx->timeout_task =
1361     silc_schedule_task_add(server->schedule, sock->sock,
1362                            silc_server_timeout_remote,
1363                            (void *)server,
1364                            server->config->conn_auth_timeout, 0,
1365                            SILC_TASK_TIMEOUT,
1366                            SILC_TASK_PRI_LOW);
1367 }
1368
1369 /* Final part of accepting new connection. The connection has now
1370    been authenticated and keys has been exchanged. We also know whether
1371    this is client or server connection. */
1372
1373 SILC_TASK_CALLBACK(silc_server_accept_new_connection_final)
1374 {
1375   SilcProtocol protocol = (SilcProtocol)context;
1376   SilcServerConnAuthInternalContext *ctx =
1377     (SilcServerConnAuthInternalContext *)protocol->context;
1378   SilcServer server = (SilcServer)ctx->server;
1379   SilcSocketConnection sock = ctx->sock;
1380   SilcServerHBContext hb_context;
1381   SilcUnknownEntry entry = (SilcUnknownEntry)sock->user_data;
1382   void *id_entry;
1383   SilcUInt32 hearbeat_timeout = server->config->param.keepalive_secs;
1384
1385   SILC_LOG_DEBUG(("Start"));
1386
1387   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
1388       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
1389     /* Error occured during protocol */
1390     silc_protocol_free(protocol);
1391     sock->protocol = NULL;
1392     if (ctx->packet)
1393       silc_packet_context_free(ctx->packet);
1394     if (ctx->ske)
1395       silc_ske_free(ctx->ske);
1396     silc_free(ctx->dest_id);
1397     silc_server_config_unref(&ctx->cconfig);
1398     silc_server_config_unref(&ctx->sconfig);
1399     silc_server_config_unref(&ctx->rconfig);
1400     silc_free(ctx);
1401     silc_schedule_task_del_by_callback(server->schedule,
1402                                        silc_server_failure_callback);
1403     silc_server_disconnect_remote(server, sock, SILC_STATUS_ERR_AUTH_FAILED,
1404                                   NULL);
1405     server->stat.auth_failures++;
1406     return;
1407   }
1408
1409   entry->data.last_receive = time(NULL);
1410
1411   switch (ctx->conn_type) {
1412   case SILC_SOCKET_TYPE_CLIENT:
1413     {
1414       SilcClientEntry client;
1415       SilcServerConfigClient *conn = ctx->cconfig.ref_ptr;
1416
1417       /* Verify whether this connection is after all allowed to connect */
1418       if (!silc_server_connection_allowed(server, sock, ctx->conn_type,
1419                                           &server->config->param,
1420                                           conn->param, ctx->ske)) {
1421         server->stat.auth_failures++;
1422         goto out;
1423       }
1424
1425       SILC_LOG_DEBUG(("Remote host is client"));
1426       SILC_LOG_INFO(("Connection %s (%s) is client", sock->hostname,
1427                      sock->ip));
1428
1429       /* Add the client to the client ID cache. The nickname and Client ID
1430          and other information is created after we have received NEW_CLIENT
1431          packet from client. */
1432       client = silc_idlist_add_client(server->local_list,
1433                                       NULL, NULL, NULL, NULL, NULL, sock, 0);
1434       if (!client) {
1435         SILC_LOG_ERROR(("Could not add new client to cache"));
1436         silc_free(sock->user_data);
1437         silc_server_disconnect_remote(server, sock, 
1438                                       SILC_STATUS_ERR_AUTH_FAILED, NULL);
1439         server->stat.auth_failures++;
1440         goto out;
1441       }
1442
1443       /* Statistics */
1444       server->stat.my_clients++;
1445       server->stat.clients++;
1446       server->stat.cell_clients++;
1447
1448       /* Get connection parameters */
1449       if (conn->param) {
1450         if (conn->param->keepalive_secs)
1451           hearbeat_timeout = conn->param->keepalive_secs;
1452       }
1453
1454       id_entry = (void *)client;
1455       break;
1456     }
1457   case SILC_SOCKET_TYPE_SERVER:
1458   case SILC_SOCKET_TYPE_ROUTER:
1459     {
1460       SilcServerEntry new_server;
1461       bool initiator = FALSE;
1462       bool backup_local = FALSE;
1463       bool backup_router = FALSE;
1464       char *backup_replace_ip = NULL;
1465       SilcUInt16 backup_replace_port = 0;
1466       SilcServerConfigServer *sconn = ctx->sconfig.ref_ptr;
1467       SilcServerConfigRouter *rconn = ctx->rconfig.ref_ptr;
1468
1469       if (ctx->conn_type == SILC_SOCKET_TYPE_ROUTER) {
1470         /* Verify whether this connection is after all allowed to connect */
1471         if (!silc_server_connection_allowed(server, sock, ctx->conn_type,
1472                                             &server->config->param,
1473                                             rconn ? rconn->param : NULL,
1474                                             ctx->ske)) {
1475           server->stat.auth_failures++;
1476           goto out;
1477         }
1478
1479         if (rconn) {
1480           if (rconn->param) {
1481             if (rconn->param->keepalive_secs)
1482               hearbeat_timeout = rconn->param->keepalive_secs;
1483           }
1484
1485           initiator = rconn->initiator;
1486           backup_local = rconn->backup_local;
1487           backup_router = rconn->backup_router;
1488           backup_replace_ip = rconn->backup_replace_ip;
1489           backup_replace_port = rconn->backup_replace_port;
1490         }
1491       }
1492
1493       if (ctx->conn_type == SILC_SOCKET_TYPE_SERVER) {
1494         /* Verify whether this connection is after all allowed to connect */
1495         if (!silc_server_connection_allowed(server, sock, ctx->conn_type,
1496                                             &server->config->param,
1497                                             sconn ? sconn->param : NULL,
1498                                             ctx->ske)) {
1499           server->stat.auth_failures++;
1500           goto out;
1501         }
1502         if (sconn) {
1503           if (sconn->param) {
1504             if (sconn->param->keepalive_secs)
1505               hearbeat_timeout = sconn->param->keepalive_secs;
1506           }
1507
1508           backup_router = sconn->backup_router;
1509         }
1510       }
1511
1512       SILC_LOG_DEBUG(("Remote host is %s",
1513                       ctx->conn_type == SILC_SOCKET_TYPE_SERVER ?
1514                       "server" : (backup_router ?
1515                                   "backup router" : "router")));
1516       SILC_LOG_INFO(("Connection %s (%s) is %s", sock->hostname,
1517                      sock->ip, ctx->conn_type == SILC_SOCKET_TYPE_SERVER ?
1518                      "server" : (backup_router ?
1519                                  "backup router" : "router")));
1520
1521       /* Add the server into server cache. The server name and Server ID
1522          is updated after we have received NEW_SERVER packet from the
1523          server. We mark ourselves as router for this server if we really
1524          are router. */
1525       new_server =
1526         silc_idlist_add_server((ctx->conn_type == SILC_SOCKET_TYPE_SERVER ?
1527                                 server->local_list : (backup_router ?
1528                                                       server->local_list :
1529                                                       server->global_list)),
1530                                NULL,
1531                                (ctx->conn_type == SILC_SOCKET_TYPE_SERVER ?
1532                                 SILC_SERVER : SILC_ROUTER),
1533                                NULL,
1534                                (ctx->conn_type == SILC_SOCKET_TYPE_SERVER ?
1535                                 server->id_entry : (backup_router ?
1536                                                     server->id_entry : NULL)),
1537                                sock);
1538       if (!new_server) {
1539         SILC_LOG_ERROR(("Could not add new server to cache"));
1540         silc_free(sock->user_data);
1541         silc_server_disconnect_remote(server, sock, 
1542                                       SILC_STATUS_ERR_AUTH_FAILED, NULL);
1543         server->stat.auth_failures++;
1544         goto out;
1545       }
1546
1547       /* Statistics */
1548       if (ctx->conn_type == SILC_SOCKET_TYPE_SERVER)
1549         server->stat.my_servers++;
1550       else
1551         server->stat.my_routers++;
1552       server->stat.servers++;
1553
1554       id_entry = (void *)new_server;
1555
1556       /* If the incoming connection is router and marked as backup router
1557          then add it to be one of our backups */
1558       if (ctx->conn_type == SILC_SOCKET_TYPE_ROUTER && backup_router) {
1559         silc_server_backup_add(server, new_server, backup_replace_ip,
1560                                backup_replace_port, backup_local);
1561
1562         /* Change it back to SERVER type since that's what it really is. */
1563         if (backup_local)
1564           ctx->conn_type = SILC_SOCKET_TYPE_SERVER;
1565
1566         new_server->server_type = SILC_BACKUP_ROUTER;
1567       }
1568
1569       /* Check whether this connection is to be our primary router connection
1570          if we do not already have the primary route. */
1571       if (server->standalone && ctx->conn_type == SILC_SOCKET_TYPE_ROUTER) {
1572         if (silc_server_config_is_primary_route(server) && !initiator)
1573           break;
1574
1575         SILC_LOG_DEBUG(("We are not standalone server anymore"));
1576         server->standalone = FALSE;
1577         if (!server->id_entry->router) {
1578           server->id_entry->router = id_entry;
1579           server->router = id_entry;
1580         }
1581       }
1582
1583       break;
1584     }
1585   default:
1586     goto out;
1587     break;
1588   }
1589
1590   sock->type = ctx->conn_type;
1591
1592   /* Add the common data structure to the ID entry. */
1593   silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
1594
1595   /* Add to sockets internal pointer for fast referencing */
1596   silc_free(sock->user_data);
1597   sock->user_data = id_entry;
1598
1599   /* Connection has been fully established now. Everything is ok. */
1600   SILC_LOG_DEBUG(("New connection authenticated"));
1601
1602   /* Perform keepalive. The `hb_context' will be freed automatically
1603      when finally calling the silc_socket_free function. */
1604   hb_context = silc_calloc(1, sizeof(*hb_context));
1605   hb_context->server = server;
1606   silc_socket_set_heartbeat(sock, hearbeat_timeout, hb_context,
1607                             silc_server_perform_heartbeat,
1608                             server->schedule);
1609
1610  out:
1611   silc_schedule_task_del_by_callback(server->schedule,
1612                                      silc_server_failure_callback);
1613   silc_protocol_free(protocol);
1614   if (ctx->packet)
1615     silc_packet_context_free(ctx->packet);
1616   if (ctx->ske)
1617     silc_ske_free(ctx->ske);
1618   silc_free(ctx->dest_id);
1619   silc_server_config_unref(&ctx->cconfig);
1620   silc_server_config_unref(&ctx->sconfig);
1621   silc_server_config_unref(&ctx->rconfig);
1622   silc_free(ctx);
1623   sock->protocol = NULL;
1624 }
1625
1626 /* This function is used to read packets from network and send packets to
1627    network. This is usually a generic task. */
1628
1629 SILC_TASK_CALLBACK(silc_server_packet_process)
1630 {
1631   SilcServer server = (SilcServer)context;
1632   SilcSocketConnection sock = server->sockets[fd];
1633   SilcIDListData idata;
1634   SilcCipher cipher = NULL;
1635   SilcHmac hmac = NULL;
1636   SilcUInt32 sequence = 0;
1637   int ret;
1638
1639   if (!sock)
1640     return;
1641
1642   SILC_LOG_DEBUG(("Processing packet"));
1643
1644   /* Packet sending */
1645
1646   if (type == SILC_TASK_WRITE) {
1647     /* Do not send data to disconnected connection */
1648     if (SILC_IS_DISCONNECTED(sock))
1649       return;
1650
1651     server->stat.packets_sent++;
1652
1653     /* Send the packet */
1654     ret = silc_packet_send(sock, TRUE);
1655
1656     /* If returned -2 could not write to connection now, will do
1657        it later. */
1658     if (ret == -2)
1659       return;
1660
1661     if (ret == -1) {
1662       SILC_LOG_ERROR(("Error sending packet to connection "
1663                       "%s:%d [%s]", sock->hostname, sock->port,
1664                       (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
1665                        sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
1666                        sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
1667                        "Router")));
1668       return;
1669     }
1670
1671     /* The packet has been sent and now it is time to set the connection
1672        back to only for input. When there is again some outgoing data
1673        available for this connection it will be set for output as well.
1674        This call clears the output setting and sets it only for input. */
1675     SILC_SET_CONNECTION_FOR_INPUT(server->schedule, fd);
1676     SILC_UNSET_OUTBUF_PENDING(sock);
1677
1678     silc_buffer_clear(sock->outbuf);
1679     return;
1680   }
1681
1682   /* Packet receiving */
1683
1684   /* Read some data from connection */
1685   ret = silc_packet_receive(sock);
1686   if (ret < 0) {
1687
1688     if (ret == -1)
1689       SILC_LOG_ERROR(("Error receiving packet from connection "
1690                       "%s:%d [%s] %s", sock->hostname, sock->port,
1691                       (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
1692                        sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
1693                        sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
1694                        "Router"), strerror(errno)));
1695     return;
1696   }
1697
1698   /* EOF */
1699   if (ret == 0) {
1700     SILC_LOG_DEBUG(("Read EOF"));
1701
1702     /* If connection is disconnecting already we will finally
1703        close the connection */
1704     if (SILC_IS_DISCONNECTING(sock)) {
1705       if (sock->user_data)
1706         silc_server_free_sock_user_data(server, sock, NULL);
1707       silc_server_close_connection(server, sock);
1708       return;
1709     }
1710
1711     SILC_LOG_DEBUG(("Premature EOF from connection %d", sock->sock));
1712     SILC_SET_DISCONNECTING(sock);
1713
1714     if (sock->user_data) {
1715       char tmp[128];
1716       if (silc_socket_get_error(sock, tmp, sizeof(tmp) - 1))
1717         silc_server_free_sock_user_data(server, sock, tmp);
1718       else
1719         silc_server_free_sock_user_data(server, sock, NULL);
1720     } else if (server->router_conn && server->router_conn->sock == sock &&
1721              !server->router && server->standalone)
1722       silc_schedule_task_add(server->schedule, 0,
1723                              silc_server_connect_to_router,
1724                              server, 1, 0,
1725                              SILC_TASK_TIMEOUT,
1726                              SILC_TASK_PRI_NORMAL);
1727
1728     silc_server_close_connection(server, sock);
1729     return;
1730   }
1731
1732   /* If connection is disconnecting or disconnected we will ignore
1733      what we read. */
1734   if (SILC_IS_DISCONNECTING(sock) || SILC_IS_DISCONNECTED(sock)) {
1735     SILC_LOG_DEBUG(("Ignoring read data from disconnected connection"));
1736     return;
1737   }
1738
1739   server->stat.packets_received++;
1740
1741   /* Get keys and stuff from ID entry */
1742   idata = (SilcIDListData)sock->user_data;
1743   if (idata) {
1744     cipher = idata->receive_key;
1745     hmac = idata->hmac_receive;
1746     sequence = idata->psn_receive;
1747   }
1748
1749   /* Process the packet. This will call the parser that will then
1750      decrypt and parse the packet. */
1751   ret = silc_packet_receive_process(sock, server->server_type == SILC_ROUTER ?
1752                                     TRUE : FALSE, cipher, hmac, sequence,
1753                                     silc_server_packet_parse, server);
1754
1755   /* If this socket connection is not authenticated yet and the packet
1756      processing failed we will drop the connection since it can be
1757      a malicious flooder. */
1758   if (sock->type == SILC_SOCKET_TYPE_UNKNOWN && ret == FALSE &&
1759       (!sock->protocol || sock->protocol->protocol->type ==
1760        SILC_PROTOCOL_SERVER_KEY_EXCHANGE)) {
1761     SILC_LOG_DEBUG(("Bad data sent from unknown connection %d", sock->sock));
1762     SILC_SET_DISCONNECTING(sock);
1763
1764     if (sock->user_data)
1765       silc_server_free_sock_user_data(server, sock, NULL);
1766     silc_server_close_connection(server, sock);
1767   }
1768 }
1769
1770 /* Parses whole packet, received earlier. */
1771
1772 SILC_TASK_CALLBACK(silc_server_packet_parse_real)
1773 {
1774   SilcPacketParserContext *parse_ctx = (SilcPacketParserContext *)context;
1775   SilcServer server = (SilcServer)parse_ctx->context;
1776   SilcSocketConnection sock = parse_ctx->sock;
1777   SilcPacketContext *packet = parse_ctx->packet;
1778   SilcIDListData idata = (SilcIDListData)sock->user_data;
1779   int ret;
1780
1781   SILC_LOG_DEBUG(("Start"));
1782
1783   /* Parse the packet */
1784   if (parse_ctx->normal)
1785     ret = silc_packet_parse(packet, idata ? idata->receive_key : NULL);
1786   else
1787     ret = silc_packet_parse_special(packet, idata ? idata->receive_key : NULL);
1788
1789   /* If entry is disabled ignore what we got. */
1790   if (ret != SILC_PACKET_RESUME_ROUTER &&
1791       idata && idata->status & SILC_IDLIST_STATUS_DISABLED) {
1792     SILC_LOG_DEBUG(("Connection is disabled"));
1793     goto out;
1794   }
1795
1796   if (ret == SILC_PACKET_NONE)
1797     goto out;
1798
1799   /* Check that the the current client ID is same as in the client's packet. */
1800   if (sock->type == SILC_SOCKET_TYPE_CLIENT) {
1801     SilcClientEntry client = (SilcClientEntry)sock->user_data;
1802     if (client && client->id) {
1803       void *id = silc_id_str2id(packet->src_id, packet->src_id_len,
1804                                 packet->src_id_type);
1805       if (!id || !SILC_ID_CLIENT_COMPARE(client->id, id)) {
1806         silc_free(id);
1807         goto out;
1808       }
1809       silc_free(id);
1810     }
1811   }
1812
1813   if (server->server_type == SILC_ROUTER) {
1814     /* Route the packet if it is not destined to us. Other ID types but
1815        server are handled separately after processing them. */
1816     if (!(packet->flags & SILC_PACKET_FLAG_BROADCAST) &&
1817         packet->dst_id_type == SILC_ID_SERVER &&
1818         sock->type != SILC_SOCKET_TYPE_CLIENT &&
1819         memcmp(packet->dst_id, server->id_string, server->id_string_len)) {
1820
1821       /* Route the packet to fastest route for the destination ID */
1822       void *id = silc_id_str2id(packet->dst_id, packet->dst_id_len,
1823                                 packet->dst_id_type);
1824       if (!id)
1825         goto out;
1826       silc_server_packet_route(server,
1827                                silc_server_route_get(server, id,
1828                                                      packet->dst_id_type),
1829                                packet);
1830       silc_free(id);
1831       goto out;
1832     }
1833   }
1834
1835   /* Parse the incoming packet type */
1836   silc_server_packet_parse_type(server, sock, packet);
1837
1838   if (server->server_type == SILC_ROUTER) {
1839     /* Broadcast packet if it is marked as broadcast packet and it is
1840        originated from router and we are router. */
1841     if (sock->type == SILC_SOCKET_TYPE_ROUTER &&
1842         packet->flags & SILC_PACKET_FLAG_BROADCAST &&
1843         !server->standalone) {
1844       /* Broadcast to our primary route */
1845       silc_server_packet_broadcast(server, server->router->connection, packet);
1846
1847       /* If we have backup routers then we need to feed all broadcast
1848          data to those servers. */
1849       silc_server_backup_broadcast(server, sock, packet);
1850     }
1851   }
1852
1853  out:
1854   silc_packet_context_free(packet);
1855   silc_free(parse_ctx);
1856 }
1857
1858 /* Parser callback called by silc_packet_receive_process. This merely
1859    registers timeout that will handle the actual parsing when appropriate. */
1860
1861 bool silc_server_packet_parse(SilcPacketParserContext *parser_context,
1862                               void *context)
1863 {
1864   SilcServer server = (SilcServer)context;
1865   SilcSocketConnection sock = parser_context->sock;
1866   SilcIDListData idata = (SilcIDListData)sock->user_data;
1867
1868   if (idata)
1869     idata->psn_receive = parser_context->packet->sequence + 1;
1870
1871   /* If protocol for this connection is key exchange or rekey then we'll
1872      process all packets synchronously, since there might be packets in
1873      queue that we are not able to decrypt without first processing the
1874      packets before them. */
1875   if ((parser_context->packet->type == SILC_PACKET_REKEY ||
1876        parser_context->packet->type == SILC_PACKET_REKEY_DONE) ||
1877       (sock->protocol && sock->protocol->protocol &&
1878        (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE ||
1879         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY))) {
1880     silc_server_packet_parse_real(server->schedule, 0, sock->sock,
1881                                   parser_context);
1882
1883     /* Reprocess data since we'll return FALSE here.  This is because
1884        the idata->receive_key might have become valid in the last packet
1885        and we want to call this processor with valid cipher. */
1886     if (idata)
1887       silc_packet_receive_process(sock, server->server_type == SILC_ROUTER ?
1888                                   TRUE : FALSE, idata->receive_key,
1889                                   idata->hmac_receive, idata->psn_receive,
1890                                   silc_server_packet_parse, server);
1891     else
1892       silc_packet_receive_process(sock, server->server_type == SILC_ROUTER ?
1893                                   TRUE : FALSE, NULL, NULL, 0,
1894                                   silc_server_packet_parse, server);
1895     return FALSE;
1896   }
1897
1898   switch (sock->type) {
1899   case SILC_SOCKET_TYPE_UNKNOWN:
1900   case SILC_SOCKET_TYPE_CLIENT:
1901     /* Parse the packet with timeout */
1902     silc_schedule_task_add(server->schedule, sock->sock,
1903                            silc_server_packet_parse_real,
1904                            (void *)parser_context, 0, 100000,
1905                            SILC_TASK_TIMEOUT,
1906                            SILC_TASK_PRI_NORMAL);
1907     break;
1908   case SILC_SOCKET_TYPE_SERVER:
1909   case SILC_SOCKET_TYPE_ROUTER:
1910     /* Packets from servers are parsed immediately */
1911     silc_server_packet_parse_real(server->schedule, 0, sock->sock,
1912                                   parser_context);
1913     break;
1914   default:
1915     return TRUE;
1916   }
1917
1918   return TRUE;
1919 }
1920
1921 /* Parses the packet type and calls what ever routines the packet type
1922    requires. This is done for all incoming packets. */
1923
1924 void silc_server_packet_parse_type(SilcServer server,
1925                                    SilcSocketConnection sock,
1926                                    SilcPacketContext *packet)
1927 {
1928   SilcPacketType type = packet->type;
1929   SilcIDListData idata = (SilcIDListData)sock->user_data;
1930
1931   SILC_LOG_DEBUG(("Parsing packet type %d", type));
1932
1933   /* Parse the packet type */
1934   switch (type) {
1935   case SILC_PACKET_DISCONNECT:
1936     {
1937       SilcStatus status;
1938       char *message = NULL;
1939
1940       SILC_LOG_DEBUG(("Disconnect packet"));
1941
1942       if (packet->flags & SILC_PACKET_FLAG_LIST)
1943         break;
1944       if (packet->buffer->len < 1)
1945         break;
1946
1947       status = (SilcStatus)packet->buffer->data[0];
1948       if (packet->buffer->len > 1 &&
1949           silc_utf8_valid(packet->buffer->data + 1, packet->buffer->len - 1))
1950         message = silc_memdup(packet->buffer->data, packet->buffer->len);
1951
1952       SILC_LOG_ERROR(("Disconnected by %s (%s): %s (%d) %s", 
1953                       sock->ip, sock->hostname,
1954                       silc_get_status_message(status), status,
1955                       message ? message : ""));
1956       silc_free(message);
1957     }
1958     break;
1959
1960   case SILC_PACKET_SUCCESS:
1961     /*
1962      * Success received for something. For now we can have only
1963      * one protocol for connection executing at once hence this
1964      * success message is for whatever protocol is executing currently.
1965      */
1966     SILC_LOG_DEBUG(("Success packet"));
1967     if (packet->flags & SILC_PACKET_FLAG_LIST)
1968       break;
1969     if (sock->protocol)
1970       silc_protocol_execute(sock->protocol, server->schedule, 0, 0);
1971     break;
1972
1973   case SILC_PACKET_FAILURE:
1974     /*
1975      * Failure received for something. For now we can have only
1976      * one protocol for connection executing at once hence this
1977      * failure message is for whatever protocol is executing currently.
1978      */
1979     SILC_LOG_DEBUG(("Failure packet"));
1980     if (packet->flags & SILC_PACKET_FLAG_LIST)
1981       break;
1982     if (sock->protocol) {
1983       SilcServerFailureContext f;
1984       f = silc_calloc(1, sizeof(*f));
1985       f->server = server;
1986       f->sock = sock;
1987
1988       /* We will wait 5 seconds to process this failure packet */
1989       silc_schedule_task_add(server->schedule, sock->sock,
1990                          silc_server_failure_callback, (void *)f, 5, 0,
1991                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
1992     }
1993     break;
1994
1995   case SILC_PACKET_REJECT:
1996     SILC_LOG_DEBUG(("Reject packet"));
1997     if (packet->flags & SILC_PACKET_FLAG_LIST)
1998       break;
1999     return;
2000     break;
2001
2002   case SILC_PACKET_NOTIFY:
2003     /*
2004      * Received notify packet. Server can receive notify packets from
2005      * router. Server then relays the notify messages to clients if needed.
2006      */
2007     SILC_LOG_DEBUG(("Notify packet"));
2008     if (packet->flags & SILC_PACKET_FLAG_LIST)
2009       silc_server_notify_list(server, sock, packet);
2010     else
2011       silc_server_notify(server, sock, packet);
2012     break;
2013
2014     /*
2015      * Channel packets
2016      */
2017   case SILC_PACKET_CHANNEL_MESSAGE:
2018     /*
2019      * Received channel message. Channel messages are special packets
2020      * (although probably most common ones) thus they are handled
2021      * specially.
2022      */
2023     SILC_LOG_DEBUG(("Channel Message packet"));
2024     if (packet->flags & SILC_PACKET_FLAG_LIST)
2025       break;
2026     idata->last_receive = time(NULL);
2027     silc_server_channel_message(server, sock, packet);
2028     break;
2029
2030   case SILC_PACKET_CHANNEL_KEY:
2031     /*
2032      * Received key for channel. As channels are created by the router
2033      * the keys are as well. We will distribute the key to all of our
2034      * locally connected clients on the particular channel. Router
2035      * never receives this channel and thus is ignored.
2036      */
2037     SILC_LOG_DEBUG(("Channel Key packet"));
2038     if (packet->flags & SILC_PACKET_FLAG_LIST)
2039       break;
2040     silc_server_channel_key(server, sock, packet);
2041     break;
2042
2043     /*
2044      * Command packets
2045      */
2046   case SILC_PACKET_COMMAND:
2047     /*
2048      * Recived command. Processes the command request and allocates the
2049      * command context and calls the command.
2050      */
2051     SILC_LOG_DEBUG(("Command packet"));
2052     if (packet->flags & SILC_PACKET_FLAG_LIST)
2053       break;
2054     silc_server_command_process(server, sock, packet);
2055     break;
2056
2057   case SILC_PACKET_COMMAND_REPLY:
2058     /*
2059      * Received command reply packet. Received command reply to command. It
2060      * may be reply to command sent by us or reply to command sent by client
2061      * that we've routed further.
2062      */
2063     SILC_LOG_DEBUG(("Command Reply packet"));
2064     if (packet->flags & SILC_PACKET_FLAG_LIST)
2065       break;
2066     silc_server_command_reply(server, sock, packet);
2067     break;
2068
2069     /*
2070      * Private Message packets
2071      */
2072   case SILC_PACKET_PRIVATE_MESSAGE:
2073     /*
2074      * Received private message packet. The packet is coming from either
2075      * client or server.
2076      */
2077     SILC_LOG_DEBUG(("Private Message packet"));
2078     if (packet->flags & SILC_PACKET_FLAG_LIST)
2079       break;
2080     idata->last_receive = time(NULL);
2081     silc_server_private_message(server, sock, packet);
2082     break;
2083
2084   case SILC_PACKET_PRIVATE_MESSAGE_KEY:
2085     /*
2086      * Private message key packet.
2087      */
2088     if (packet->flags & SILC_PACKET_FLAG_LIST)
2089       break;
2090     silc_server_private_message_key(server, sock, packet);
2091     break;
2092
2093     /*
2094      * Key Exchange protocol packets
2095      */
2096   case SILC_PACKET_KEY_EXCHANGE:
2097     SILC_LOG_DEBUG(("KE packet"));
2098     if (packet->flags & SILC_PACKET_FLAG_LIST)
2099       break;
2100
2101     if (sock->protocol && sock->protocol->protocol &&
2102         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
2103       SilcServerKEInternalContext *proto_ctx =
2104         (SilcServerKEInternalContext *)sock->protocol->context;
2105
2106       proto_ctx->packet = silc_packet_context_dup(packet);
2107
2108       /* Let the protocol handle the packet */
2109       silc_protocol_execute(sock->protocol, server->schedule, 0, 100000);
2110     } else {
2111       SILC_LOG_ERROR(("Received Key Exchange packet but no key exchange "
2112                       "protocol active, packet dropped."));
2113     }
2114     break;
2115
2116   case SILC_PACKET_KEY_EXCHANGE_1:
2117     SILC_LOG_DEBUG(("KE 1 packet"));
2118     if (packet->flags & SILC_PACKET_FLAG_LIST)
2119       break;
2120
2121     if (sock->protocol && sock->protocol->protocol &&
2122         (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE ||
2123          sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY)) {
2124
2125       if (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
2126         SilcServerRekeyInternalContext *proto_ctx =
2127           (SilcServerRekeyInternalContext *)sock->protocol->context;
2128
2129         if (proto_ctx->packet)
2130           silc_packet_context_free(proto_ctx->packet);
2131
2132         proto_ctx->packet = silc_packet_context_dup(packet);
2133
2134         /* Let the protocol handle the packet */
2135         silc_protocol_execute(sock->protocol, server->schedule, 0, 0);
2136       } else {
2137         SilcServerKEInternalContext *proto_ctx =
2138           (SilcServerKEInternalContext *)sock->protocol->context;
2139
2140         if (proto_ctx->packet)
2141           silc_packet_context_free(proto_ctx->packet);
2142
2143         proto_ctx->packet = silc_packet_context_dup(packet);
2144         proto_ctx->dest_id_type = packet->src_id_type;
2145         proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
2146                                             packet->src_id_type);
2147         if (!proto_ctx->dest_id)
2148           break;
2149
2150         /* Let the protocol handle the packet */
2151         silc_protocol_execute(sock->protocol, server->schedule,
2152                               0, 100000);
2153       }
2154     } else {
2155       SILC_LOG_ERROR(("Received Key Exchange 1 packet but no key exchange "
2156                       "protocol active, packet dropped."));
2157     }
2158     break;
2159
2160   case SILC_PACKET_KEY_EXCHANGE_2:
2161     SILC_LOG_DEBUG(("KE 2 packet"));
2162     if (packet->flags & SILC_PACKET_FLAG_LIST)
2163       break;
2164
2165     if (sock->protocol && sock->protocol->protocol &&
2166         (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE ||
2167          sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY)) {
2168
2169       if (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
2170         SilcServerRekeyInternalContext *proto_ctx =
2171           (SilcServerRekeyInternalContext *)sock->protocol->context;
2172
2173         if (proto_ctx->packet)
2174           silc_packet_context_free(proto_ctx->packet);
2175
2176         proto_ctx->packet = silc_packet_context_dup(packet);
2177
2178         /* Let the protocol handle the packet */
2179         silc_protocol_execute(sock->protocol, server->schedule, 0, 0);
2180       } else {
2181         SilcServerKEInternalContext *proto_ctx =
2182           (SilcServerKEInternalContext *)sock->protocol->context;
2183
2184         if (proto_ctx->packet)
2185           silc_packet_context_free(proto_ctx->packet);
2186
2187         proto_ctx->packet = silc_packet_context_dup(packet);
2188         proto_ctx->dest_id_type = packet->src_id_type;
2189         proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
2190                                             packet->src_id_type);
2191         if (!proto_ctx->dest_id)
2192           break;
2193
2194         /* Let the protocol handle the packet */
2195         silc_protocol_execute(sock->protocol, server->schedule,
2196                               0, 100000);
2197       }
2198     } else {
2199       SILC_LOG_ERROR(("Received Key Exchange 2 packet but no key exchange "
2200                       "protocol active, packet dropped."));
2201     }
2202     break;
2203
2204   case SILC_PACKET_CONNECTION_AUTH_REQUEST:
2205     /*
2206      * Connection authentication request packet. When we receive this packet
2207      * we will send to the other end information about our mandatory
2208      * authentication method for the connection. This packet maybe received
2209      * at any time.
2210      */
2211     SILC_LOG_DEBUG(("Connection authentication request packet"));
2212     if (packet->flags & SILC_PACKET_FLAG_LIST)
2213       break;
2214     silc_server_connection_auth_request(server, sock, packet);
2215     break;
2216
2217     /*
2218      * Connection Authentication protocol packets
2219      */
2220   case SILC_PACKET_CONNECTION_AUTH:
2221     /* Start of the authentication protocol. We receive here the
2222        authentication data and will verify it. */
2223     SILC_LOG_DEBUG(("Connection auth packet"));
2224     if (packet->flags & SILC_PACKET_FLAG_LIST)
2225       break;
2226
2227     if (sock->protocol && sock->protocol->protocol->type
2228         == SILC_PROTOCOL_SERVER_CONNECTION_AUTH) {
2229
2230       SilcServerConnAuthInternalContext *proto_ctx =
2231         (SilcServerConnAuthInternalContext *)sock->protocol->context;
2232
2233       proto_ctx->packet = silc_packet_context_dup(packet);
2234
2235       /* Let the protocol handle the packet */
2236       silc_protocol_execute(sock->protocol, server->schedule, 0, 0);
2237     } else {
2238       SILC_LOG_ERROR(("Received Connection Auth packet but no authentication "
2239                       "protocol active, packet dropped."));
2240     }
2241     break;
2242
2243   case SILC_PACKET_NEW_ID:
2244     /*
2245      * Received New ID packet. This includes some new ID that has been
2246      * created. It may be for client, server or channel. This is the way
2247      * to distribute information about new registered entities in the
2248      * SILC network.
2249      */
2250     SILC_LOG_DEBUG(("New ID packet"));
2251     if (packet->flags & SILC_PACKET_FLAG_LIST)
2252       silc_server_new_id_list(server, sock, packet);
2253     else
2254       silc_server_new_id(server, sock, packet);
2255     break;
2256
2257   case SILC_PACKET_NEW_CLIENT:
2258     /*
2259      * Received new client packet. This includes client information that
2260      * we will use to create initial client ID. After creating new
2261      * ID we will send it to the client.
2262      */
2263     SILC_LOG_DEBUG(("New Client packet"));
2264     if (packet->flags & SILC_PACKET_FLAG_LIST)
2265       break;
2266     silc_server_new_client(server, sock, packet);
2267     break;
2268
2269   case SILC_PACKET_NEW_SERVER:
2270     /*
2271      * Received new server packet. This includes Server ID and some other
2272      * information that we may save. This is received after server has
2273      * connected to us.
2274      */
2275     SILC_LOG_DEBUG(("New Server packet"));
2276     if (packet->flags & SILC_PACKET_FLAG_LIST)
2277       break;
2278     silc_server_new_server(server, sock, packet);
2279     break;
2280
2281   case SILC_PACKET_NEW_CHANNEL:
2282     /*
2283      * Received new channel packet. Information about new channel in the
2284      * network are distributed using this packet.
2285      */
2286     SILC_LOG_DEBUG(("New Channel packet"));
2287     if (packet->flags & SILC_PACKET_FLAG_LIST)
2288       silc_server_new_channel_list(server, sock, packet);
2289     else
2290       silc_server_new_channel(server, sock, packet);
2291     break;
2292
2293   case SILC_PACKET_HEARTBEAT:
2294     /*
2295      * Received heartbeat.
2296      */
2297     SILC_LOG_DEBUG(("Heartbeat packet"));
2298     if (packet->flags & SILC_PACKET_FLAG_LIST)
2299       break;
2300     break;
2301
2302   case SILC_PACKET_KEY_AGREEMENT:
2303     /*
2304      * Received heartbeat.
2305      */
2306     SILC_LOG_DEBUG(("Key agreement packet"));
2307     if (packet->flags & SILC_PACKET_FLAG_LIST)
2308       break;
2309     silc_server_key_agreement(server, sock, packet);
2310     break;
2311
2312   case SILC_PACKET_REKEY:
2313     /*
2314      * Received re-key packet. The sender wants to regenerate the session
2315      * keys.
2316      */
2317     SILC_LOG_DEBUG(("Re-key packet"));
2318     if (packet->flags & SILC_PACKET_FLAG_LIST)
2319       break;
2320     silc_server_rekey(server, sock, packet);
2321     break;
2322
2323   case SILC_PACKET_REKEY_DONE:
2324     /*
2325      * The re-key is done.
2326      */
2327     SILC_LOG_DEBUG(("Re-key done packet"));
2328     if (packet->flags & SILC_PACKET_FLAG_LIST)
2329       break;
2330
2331     if (sock->protocol && sock->protocol->protocol &&
2332         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
2333
2334       SilcServerRekeyInternalContext *proto_ctx =
2335         (SilcServerRekeyInternalContext *)sock->protocol->context;
2336
2337       if (proto_ctx->packet)
2338         silc_packet_context_free(proto_ctx->packet);
2339
2340       proto_ctx->packet = silc_packet_context_dup(packet);
2341
2342       /* Let the protocol handle the packet */
2343       silc_protocol_execute(sock->protocol, server->schedule, 0, 0);
2344     } else {
2345       SILC_LOG_ERROR(("Received Re-key done packet but no re-key "
2346                       "protocol active, packet dropped."));
2347     }
2348     break;
2349
2350   case SILC_PACKET_FTP:
2351     /* FTP packet */
2352     SILC_LOG_DEBUG(("FTP packet"));
2353     if (packet->flags & SILC_PACKET_FLAG_LIST)
2354       break;
2355     silc_server_ftp(server, sock, packet);
2356     break;
2357
2358   case SILC_PACKET_RESUME_CLIENT:
2359     /* Resume client */
2360     SILC_LOG_DEBUG(("Resume Client packet"));
2361     if (packet->flags & SILC_PACKET_FLAG_LIST)
2362       break;
2363     silc_server_resume_client(server, sock, packet);
2364     break;
2365
2366   case SILC_PACKET_RESUME_ROUTER:
2367     /* Resume router packet received. This packet is received for backup
2368        router resuming protocol. */
2369     SILC_LOG_DEBUG(("Resume router packet"));
2370     if (packet->flags & SILC_PACKET_FLAG_LIST)
2371       break;
2372     silc_server_backup_resume_router(server, sock, packet);
2373     break;
2374
2375   default:
2376     SILC_LOG_ERROR(("Incorrect packet type %d, packet dropped", type));
2377     break;
2378   }
2379
2380 }
2381
2382 /* Creates connection to a remote router. */
2383
2384 void silc_server_create_connection(SilcServer server,
2385                                    const char *remote_host, SilcUInt32 port)
2386 {
2387   SilcServerConnection sconn;
2388
2389   /* Allocate connection object for hold connection specific stuff. */
2390   sconn = silc_calloc(1, sizeof(*sconn));
2391   sconn->server = server;
2392   sconn->remote_host = strdup(remote_host);
2393   sconn->remote_port = port;
2394   sconn->no_reconnect = TRUE;
2395
2396   silc_schedule_task_add(server->schedule, 0,
2397                          silc_server_connect_router,
2398                          (void *)sconn, 0, 1, SILC_TASK_TIMEOUT,
2399                          SILC_TASK_PRI_NORMAL);
2400 }
2401
2402 SILC_TASK_CALLBACK(silc_server_close_connection_final)
2403 {
2404   silc_socket_free((SilcSocketConnection)context);
2405 }
2406
2407 /* Closes connection to socket connection */
2408
2409 void silc_server_close_connection(SilcServer server,
2410                                   SilcSocketConnection sock)
2411 {
2412   if (!server->sockets[sock->sock])
2413     return;
2414
2415   SILC_LOG_INFO(("Closing connection %s:%d [%s]", sock->hostname,
2416                   sock->port,
2417                   (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
2418                    sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
2419                    sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
2420                    "Router")));
2421
2422   /* We won't listen for this connection anymore */
2423   silc_schedule_unset_listen_fd(server->schedule, sock->sock);
2424
2425   /* Unregister all tasks */
2426   silc_schedule_task_del_by_fd(server->schedule, sock->sock);
2427
2428   /* Close the actual connection */
2429   silc_net_close_connection(sock->sock);
2430   server->sockets[sock->sock] = NULL;
2431
2432   /* If sock->user_data is NULL then we'll check for active protocols
2433      here since the silc_server_free_sock_user_data has not been called
2434      for this connection. */
2435   if (!sock->user_data) {
2436     /* If any protocol is active cancel its execution. It will call
2437        the final callback which will finalize the disconnection. */
2438     if (sock->protocol) {
2439       silc_protocol_cancel(sock->protocol, server->schedule);
2440       sock->protocol->state = SILC_PROTOCOL_STATE_ERROR;
2441       silc_protocol_execute_final(sock->protocol, server->schedule);
2442       sock->protocol = NULL;
2443       return;
2444     }
2445   }
2446
2447   silc_schedule_task_add(server->schedule, 0,
2448                          silc_server_close_connection_final,
2449                          (void *)sock, 0, 1, SILC_TASK_TIMEOUT,
2450                          SILC_TASK_PRI_NORMAL);
2451 }
2452
2453 /* Sends disconnect message to remote connection and disconnects the
2454    connection. */
2455
2456 void silc_server_disconnect_remote(SilcServer server,
2457                                    SilcSocketConnection sock,
2458                                    SilcStatus status, ...)
2459 {
2460   va_list ap;
2461   unsigned char buf[512];
2462   SilcBuffer buffer;
2463   char *cp;
2464   int len;
2465
2466   if (!sock)
2467     return;
2468
2469   memset(buf, 0, sizeof(buf));
2470   va_start(ap, status);
2471   cp = va_arg(ap, char *);
2472   if (cp) {
2473     vsnprintf(buf, sizeof(buf) - 1, cp, ap);
2474     cp = buf;
2475   }
2476   va_end(ap);
2477
2478   SILC_LOG_DEBUG(("Disconnecting remote host"));
2479
2480   /* Notify remote end that the conversation is over. The notify message
2481      is tried to be sent immediately. */
2482
2483   len = 1;
2484   if (cp)
2485     len += silc_utf8_encoded_len(buf, strlen(buf), SILC_STRING_ASCII);
2486
2487   buffer = silc_buffer_alloc_size(len);
2488   if (!buffer)
2489     goto out;
2490
2491   buffer->data[0] = status;
2492   if (cp)
2493     silc_utf8_encode(buf, strlen(buf), SILC_STRING_ASCII, buffer->data + 1,
2494                      buffer->len - 1);
2495   silc_server_packet_send(server, sock, SILC_PACKET_DISCONNECT, 0,
2496                           buffer->data, buffer->len, TRUE);
2497   silc_buffer_free(buffer);
2498
2499  out:
2500   silc_server_packet_queue_purge(server, sock);
2501
2502   /* Mark the connection to be disconnected */
2503   SILC_SET_DISCONNECTED(sock);
2504   silc_server_close_connection(server, sock);
2505 }
2506
2507 typedef struct {
2508   SilcServer server;
2509   SilcClientEntry client;
2510 } *FreeClientInternal;
2511
2512 SILC_TASK_CALLBACK(silc_server_free_client_data_timeout)
2513 {
2514   FreeClientInternal i = (FreeClientInternal)context;
2515
2516   silc_idlist_del_data(i->client);
2517   silc_idcache_purge_by_context(i->server->local_list->clients, i->client);
2518   silc_free(i);
2519 }
2520
2521 /* Frees client data and notifies about client's signoff. */
2522
2523 void silc_server_free_client_data(SilcServer server,
2524                                   SilcSocketConnection sock,
2525                                   SilcClientEntry client,
2526                                   int notify,
2527                                   const char *signoff)
2528 {
2529   FreeClientInternal i = silc_calloc(1, sizeof(*i));
2530
2531   /* If there is pending outgoing data for the client then purge it
2532      to the network before removing the client entry. */
2533   silc_server_packet_queue_purge(server, sock);
2534
2535   if (!client->id)
2536     return;
2537
2538   /* Send SIGNOFF notify to routers. */
2539   if (notify && !server->standalone && server->router)
2540     silc_server_send_notify_signoff(server, server->router->connection,
2541                                     server->server_type == SILC_SERVER ?
2542                                     FALSE : TRUE, client->id, signoff);
2543
2544   /* Remove client from all channels */
2545   if (notify)
2546     silc_server_remove_from_channels(server, NULL, client,
2547                                      TRUE, (char *)signoff, TRUE);
2548   else
2549     silc_server_remove_from_channels(server, NULL, client,
2550                                      FALSE, NULL, FALSE);
2551
2552   /* Check if anyone is watching this nickname */
2553   if (server->server_type == SILC_ROUTER)
2554     silc_server_check_watcher_list(server, client, NULL,
2555                                    SILC_NOTIFY_TYPE_SIGNOFF);
2556
2557   /* Remove this client from watcher list if it is */
2558   silc_server_del_from_watcher_list(server, client);
2559
2560   /* Update statistics */
2561   server->stat.my_clients--;
2562   server->stat.clients--;
2563   if (server->stat.cell_clients)
2564     server->stat.cell_clients--;
2565   SILC_OPER_STATS_UPDATE(client, server, SILC_UMODE_SERVER_OPERATOR);
2566   SILC_OPER_STATS_UPDATE(client, router, SILC_UMODE_ROUTER_OPERATOR);
2567   silc_schedule_task_del_by_context(server->schedule, client);
2568
2569   /* We will not delete the client entry right away. We will take it
2570      into history (for WHOWAS command) for 5 minutes */
2571   i->server = server;
2572   i->client = client;
2573   silc_schedule_task_add(server->schedule, 0,
2574                          silc_server_free_client_data_timeout,
2575                          (void *)i, 300, 0,
2576                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
2577   client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
2578   client->mode = 0;
2579   client->router = NULL;
2580   client->connection = NULL;
2581 }
2582
2583 /* Frees user_data pointer from socket connection object. This also sends
2584    appropriate notify packets to the network to inform about leaving
2585    entities. */
2586
2587 void silc_server_free_sock_user_data(SilcServer server,
2588                                      SilcSocketConnection sock,
2589                                      const char *signoff_message)
2590 {
2591   SILC_LOG_DEBUG(("Start"));
2592
2593   switch (sock->type) {
2594   case SILC_SOCKET_TYPE_CLIENT:
2595     {
2596       SilcClientEntry user_data = (SilcClientEntry)sock->user_data;
2597       silc_server_free_client_data(server, sock, user_data, TRUE,
2598                                    signoff_message);
2599       break;
2600     }
2601   case SILC_SOCKET_TYPE_SERVER:
2602   case SILC_SOCKET_TYPE_ROUTER:
2603     {
2604       SilcServerEntry user_data = (SilcServerEntry)sock->user_data;
2605       SilcServerEntry backup_router = NULL;
2606
2607       if (user_data->id)
2608         backup_router = silc_server_backup_get(server, user_data->id);
2609
2610       /* If this was our primary router connection then we're lost to
2611          the outside world. */
2612       if (server->router == user_data) {
2613         /* Check whether we have a backup router connection */
2614         if (!backup_router || backup_router == user_data) {
2615           silc_schedule_task_add(server->schedule, 0,
2616                                  silc_server_connect_to_router,
2617                                  server, 1, 0,
2618                                  SILC_TASK_TIMEOUT,
2619                                  SILC_TASK_PRI_NORMAL);
2620
2621           server->id_entry->router = NULL;
2622           server->router = NULL;
2623           server->standalone = TRUE;
2624           backup_router = NULL;
2625         } else {
2626           SILC_LOG_INFO(("New primary router is backup router %s",
2627                          backup_router->server_name));
2628           SILC_LOG_DEBUG(("New primary router is backup router %s",
2629                           backup_router->server_name));
2630           server->id_entry->router = backup_router;
2631           server->router = backup_router;
2632           server->router_connect = time(0);
2633           server->backup_primary = TRUE;
2634           if (server->server_type == SILC_BACKUP_ROUTER) {
2635             server->server_type = SILC_ROUTER;
2636
2637             /* We'll need to constantly try to reconnect to the primary
2638                router so that we'll see when it comes back online. */
2639             silc_server_backup_reconnect(server, sock->ip, sock->port,
2640                                          silc_server_backup_connected,
2641                                          NULL);
2642           }
2643
2644           /* Mark this connection as replaced */
2645           silc_server_backup_replaced_add(server, user_data->id,
2646                                           backup_router);
2647         }
2648       } else if (backup_router) {
2649         SILC_LOG_INFO(("Enabling the use of backup router %s",
2650                        backup_router->server_name));
2651         SILC_LOG_DEBUG(("Enabling the use of backup router %s",
2652                         backup_router->server_name));
2653
2654         /* Mark this connection as replaced */
2655         silc_server_backup_replaced_add(server, user_data->id,
2656                                         backup_router);
2657       }
2658
2659       if (!backup_router) {
2660         /* Free all client entries that this server owns as they will
2661            become invalid now as well. */
2662         if (user_data->id)
2663           silc_server_remove_clients_by_server(server, user_data, TRUE);
2664         if (server->server_type == SILC_SERVER)
2665           silc_server_remove_channels_by_server(server, user_data);
2666       } else {
2667         /* Update the client entries of this server to the new backup
2668            router. This also removes the clients that *really* was owned
2669            by the primary router and went down with the router.  */
2670         silc_server_update_clients_by_server(server, user_data, backup_router,
2671                                              TRUE, TRUE);
2672         silc_server_update_servers_by_server(server, user_data, backup_router);
2673         if (server->server_type == SILC_SERVER)
2674           silc_server_update_channels_by_server(server, user_data,
2675                                                 backup_router);
2676       }
2677
2678       /* Free the server entry */
2679       silc_server_backup_del(server, user_data);
2680       silc_server_backup_replaced_del(server, user_data);
2681       silc_idlist_del_data(user_data);
2682       if (!silc_idlist_del_server(server->local_list, user_data))
2683         silc_idlist_del_server(server->global_list, user_data);
2684       server->stat.my_servers--;
2685       server->stat.servers--;
2686       if (server->server_type == SILC_ROUTER)
2687         server->stat.cell_servers--;
2688
2689       if (backup_router) {
2690         /* Announce all of our stuff that was created about 5 minutes ago.
2691            The backup router knows all the other stuff already. */
2692         if (server->server_type == SILC_ROUTER)
2693           silc_server_announce_servers(server, FALSE, time(0) - 300,
2694                                        backup_router->connection);
2695
2696         /* Announce our clients and channels to the router */
2697         silc_server_announce_clients(server, time(0) - 300,
2698                                      backup_router->connection);
2699         silc_server_announce_channels(server, time(0) - 300,
2700                                       backup_router->connection);
2701       }
2702       break;
2703     }
2704   default:
2705     {
2706       SilcUnknownEntry user_data = (SilcUnknownEntry)sock->user_data;
2707
2708       silc_idlist_del_data(user_data);
2709       silc_free(user_data);
2710       break;
2711     }
2712   }
2713
2714   /* If any protocol is active cancel its execution */
2715   if (sock->protocol) {
2716     silc_protocol_cancel(sock->protocol, server->schedule);
2717     sock->protocol->state = SILC_PROTOCOL_STATE_ERROR;
2718     silc_protocol_execute_final(sock->protocol, server->schedule);
2719     sock->protocol = NULL;
2720   }
2721
2722   sock->user_data = NULL;
2723 }
2724
2725 /* Removes client from all channels it has joined. This is used when client
2726    connection is disconnected. If the client on a channel is last, the
2727    channel is removed as well. This sends the SIGNOFF notify types. */
2728
2729 void silc_server_remove_from_channels(SilcServer server,
2730                                       SilcSocketConnection sock,
2731                                       SilcClientEntry client,
2732                                       bool notify,
2733                                       const char *signoff_message,
2734                                       bool keygen)
2735 {
2736   SilcChannelEntry channel;
2737   SilcChannelClientEntry chl;
2738   SilcHashTableList htl;
2739   SilcBuffer clidp;
2740
2741   SILC_LOG_DEBUG(("Start"));
2742
2743   if (!client || !client->id)
2744     return;
2745
2746   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2747   if (!clidp)
2748     notify = FALSE;
2749
2750   /* Remove the client from all channels. The client is removed from
2751      the channels' user list. */
2752   silc_hash_table_list(client->channels, &htl);
2753   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
2754     channel = chl->channel;
2755
2756     /* Remove channel if this is last client leaving the channel, unless
2757        the channel is permanent. */
2758     if (server->server_type == SILC_ROUTER &&
2759         silc_hash_table_count(channel->user_list) < 2) {
2760       silc_server_channel_delete(server, channel);
2761       continue;
2762     }
2763
2764     silc_hash_table_del(client->channels, channel);
2765     silc_hash_table_del(channel->user_list, chl->client);
2766     channel->user_count--;
2767
2768     /* If there is no global users on the channel anymore mark the channel
2769        as local channel. Do not check if the removed client is local client. */
2770     if (server->server_type != SILC_ROUTER && channel->global_users &&
2771         chl->client->router && !silc_server_channel_has_global(channel))
2772       channel->global_users = FALSE;
2773
2774     silc_free(chl);
2775     server->stat.my_chanclients--;
2776
2777     /* If there is not at least one local user on the channel then we don't
2778        need the channel entry anymore, we can remove it safely, unless the
2779        channel is permanent channel */
2780     if (server->server_type != SILC_ROUTER &&
2781         !silc_server_channel_has_local(channel)) {
2782       /* Notify about leaving client if this channel has global users. */
2783       if (notify && channel->global_users)
2784         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2785                                            SILC_NOTIFY_TYPE_SIGNOFF,
2786                                            signoff_message ? 2 : 1,
2787                                            clidp->data, clidp->len,
2788                                            signoff_message, signoff_message ?
2789                                            strlen(signoff_message) : 0);
2790
2791       silc_schedule_task_del_by_context(server->schedule, channel->rekey);
2792       silc_server_channel_delete(server, channel);
2793       silc_buffer_free(clidp);
2794       continue;
2795     }
2796
2797     /* Send notify to channel about client leaving SILC and channel too */
2798     if (notify)
2799       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2800                                          SILC_NOTIFY_TYPE_SIGNOFF,
2801                                          signoff_message ? 2 : 1,
2802                                          clidp->data, clidp->len,
2803                                          signoff_message, signoff_message ?
2804                                          strlen(signoff_message) : 0);
2805
2806     /* Re-generate channel key if needed */
2807     if (keygen && !(channel->mode & SILC_CHANNEL_MODE_PRIVKEY)) {
2808       if (!silc_server_create_channel_key(server, channel, 0))
2809         continue;
2810
2811       /* Send the channel key to the channel. The key of course is not sent
2812          to the client who was removed from the channel. */
2813       silc_server_send_channel_key(server, client->connection, channel,
2814                                    server->server_type == SILC_ROUTER ?
2815                                    FALSE : !server->standalone);
2816     }
2817   }
2818
2819   silc_hash_table_list_reset(&htl);
2820   silc_buffer_free(clidp);
2821 }
2822
2823 /* Removes client from one channel. This is used for example when client
2824    calls LEAVE command to remove itself from the channel. Returns TRUE
2825    if channel still exists and FALSE if the channel is removed when
2826    last client leaves the channel. If `notify' is FALSE notify messages
2827    are not sent. */
2828
2829 bool silc_server_remove_from_one_channel(SilcServer server,
2830                                          SilcSocketConnection sock,
2831                                          SilcChannelEntry channel,
2832                                          SilcClientEntry client,
2833                                          bool notify)
2834 {
2835   SilcChannelClientEntry chl;
2836   SilcBuffer clidp;
2837
2838   SILC_LOG_DEBUG(("Removing %s from channel %s",
2839                   silc_id_render(client->id, SILC_ID_CLIENT), 
2840                   channel->channel_name));
2841
2842   /* Get the entry to the channel, if this client is not on the channel
2843      then return Ok. */
2844   if (!silc_hash_table_find(client->channels, channel, NULL, (void *)&chl))
2845     return TRUE;
2846
2847   /* Remove channel if this is last client leaving the channel, unless
2848      the channel is permanent. */
2849   if (server->server_type == SILC_ROUTER &&
2850       silc_hash_table_count(channel->user_list) < 2) {
2851     silc_server_channel_delete(server, channel);
2852     return FALSE;
2853   }
2854
2855   silc_hash_table_del(client->channels, chl->channel);
2856   silc_hash_table_del(channel->user_list, chl->client);
2857   channel->user_count--;
2858
2859   /* If there is no global users on the channel anymore mark the channel
2860      as local channel. Do not check if the client is local client. */
2861   if (server->server_type != SILC_ROUTER && channel->global_users &&
2862       chl->client->router && !silc_server_channel_has_global(channel))
2863     channel->global_users = FALSE;
2864
2865   silc_free(chl);
2866   server->stat.my_chanclients--;
2867
2868   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2869   if (!clidp)
2870     notify = FALSE;
2871
2872   /* If there is not at least one local user on the channel then we don't
2873      need the channel entry anymore, we can remove it safely, unless the
2874      channel is permanent channel */
2875   if (server->server_type != SILC_ROUTER &&
2876       !silc_server_channel_has_local(channel)) {
2877     /* Notify about leaving client if this channel has global users. */
2878     if (notify && channel->global_users)
2879       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2880                                          SILC_NOTIFY_TYPE_LEAVE, 1,
2881                                          clidp->data, clidp->len);
2882
2883     silc_schedule_task_del_by_context(server->schedule, channel->rekey);
2884     silc_server_channel_delete(server, channel);
2885     silc_buffer_free(clidp);
2886     return FALSE;
2887   }
2888
2889   /* Send notify to channel about client leaving the channel */
2890   if (notify)
2891     silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2892                                        SILC_NOTIFY_TYPE_LEAVE, 1,
2893                                        clidp->data, clidp->len);
2894
2895   silc_buffer_free(clidp);
2896   return TRUE;
2897 }
2898
2899 /* Timeout callback. This is called if connection is idle or for some
2900    other reason is not responding within some period of time. This
2901    disconnects the remote end. */
2902
2903 SILC_TASK_CALLBACK(silc_server_timeout_remote)
2904 {
2905   SilcServer server = (SilcServer)context;
2906   SilcSocketConnection sock = server->sockets[fd];
2907   SilcProtocolType protocol = 0;
2908
2909   SILC_LOG_DEBUG(("Start"));
2910
2911   if (!sock)
2912     return;
2913
2914   SILC_LOG_ERROR(("No response from %s (%s), Connection timeout",
2915                   sock->hostname, sock->ip));
2916
2917   /* If we have protocol active we must assure that we call the protocol's
2918      final callback so that all the memory is freed. */
2919   if (sock->protocol) {
2920     protocol = sock->protocol->protocol->type;
2921     silc_protocol_cancel(sock->protocol, server->schedule);
2922     sock->protocol->state = SILC_PROTOCOL_STATE_ERROR;
2923     silc_protocol_execute_final(sock->protocol, server->schedule);
2924     sock->protocol = NULL;
2925     return;
2926   }
2927
2928   if (sock->user_data)
2929     silc_server_free_sock_user_data(server, sock, NULL);
2930
2931   silc_server_disconnect_remote(server, sock, 
2932                                 protocol == 
2933                                 SILC_PROTOCOL_SERVER_CONNECTION_AUTH ?
2934                                 SILC_STATUS_ERR_AUTH_FAILED :
2935                                 SILC_STATUS_ERR_KEY_EXCHANGE_FAILED,
2936                                 "Connection timeout");
2937 }
2938
2939 /* Creates new channel. Sends NEW_CHANNEL packet to primary route. This
2940    function may be used only by router. In real SILC network all channels
2941    are created by routers thus this function is never used by normal
2942    server. */
2943
2944 SilcChannelEntry silc_server_create_new_channel(SilcServer server,
2945                                                 SilcServerID *router_id,
2946                                                 char *cipher,
2947                                                 char *hmac,
2948                                                 char *channel_name,
2949                                                 int broadcast)
2950 {
2951   SilcChannelID *channel_id;
2952   SilcChannelEntry entry;
2953   SilcCipher key;
2954   SilcHmac newhmac;
2955
2956   SILC_LOG_DEBUG(("Creating new channel"));
2957
2958   if (!cipher)
2959     cipher = SILC_DEFAULT_CIPHER;
2960   if (!hmac)
2961     hmac = SILC_DEFAULT_HMAC;
2962
2963   /* Allocate cipher */
2964   if (!silc_cipher_alloc(cipher, &key))
2965     return NULL;
2966
2967   /* Allocate hmac */
2968   if (!silc_hmac_alloc(hmac, NULL, &newhmac)) {
2969     silc_cipher_free(key);
2970     return NULL;
2971   }
2972
2973   channel_name = strdup(channel_name);
2974
2975   /* Create the channel ID */
2976   if (!silc_id_create_channel_id(server, router_id, server->rng,
2977                                  &channel_id)) {
2978     silc_free(channel_name);
2979     silc_cipher_free(key);
2980     silc_hmac_free(newhmac);
2981     return NULL;
2982   }
2983
2984   /* Create the channel */
2985   entry = silc_idlist_add_channel(server->local_list, channel_name,
2986                                   SILC_CHANNEL_MODE_NONE, channel_id,
2987                                   NULL, key, newhmac, 0);
2988   if (!entry) {
2989     silc_free(channel_name);
2990     silc_cipher_free(key);
2991     silc_hmac_free(newhmac);
2992     silc_free(channel_id);
2993     return NULL;
2994   }
2995
2996   entry->cipher = strdup(cipher);
2997   entry->hmac_name = strdup(hmac);
2998
2999   /* Now create the actual key material */
3000   if (!silc_server_create_channel_key(server, entry,
3001                                       silc_cipher_get_key_len(key) / 8)) {
3002     silc_idlist_del_channel(server->local_list, entry);
3003     return NULL;
3004   }
3005
3006   /* Notify other routers about the new channel. We send the packet
3007      to our primary route. */
3008   if (broadcast && server->standalone == FALSE)
3009     silc_server_send_new_channel(server, server->router->connection, TRUE,
3010                                  channel_name, entry->id,
3011                                  silc_id_get_len(entry->id, SILC_ID_CHANNEL),
3012                                  entry->mode);
3013
3014   server->stat.my_channels++;
3015
3016   if (server->server_type == SILC_ROUTER)
3017     entry->users_resolved = TRUE;
3018
3019   return entry;
3020 }
3021
3022 /* Same as above but creates the channel with Channel ID `channel_id. */
3023
3024 SilcChannelEntry
3025 silc_server_create_new_channel_with_id(SilcServer server,
3026                                        char *cipher,
3027                                        char *hmac,
3028                                        char *channel_name,
3029                                        SilcChannelID *channel_id,
3030                                        int broadcast)
3031 {
3032   SilcChannelEntry entry;
3033   SilcCipher key;
3034   SilcHmac newhmac;
3035
3036   SILC_LOG_DEBUG(("Creating new channel"));
3037
3038   if (!cipher)
3039     cipher = SILC_DEFAULT_CIPHER;
3040   if (!hmac)
3041     hmac = SILC_DEFAULT_HMAC;
3042
3043   /* Allocate cipher */
3044   if (!silc_cipher_alloc(cipher, &key))
3045     return NULL;
3046
3047   /* Allocate hmac */
3048   if (!silc_hmac_alloc(hmac, NULL, &newhmac)) {
3049     silc_cipher_free(key);
3050     return NULL;
3051   }
3052
3053   channel_name = strdup(channel_name);
3054
3055   /* Create the channel */
3056   entry = silc_idlist_add_channel(server->local_list, channel_name,
3057                                   SILC_CHANNEL_MODE_NONE, channel_id,
3058                                   NULL, key, newhmac, 0);
3059   if (!entry) {
3060     silc_cipher_free(key);
3061     silc_hmac_free(newhmac);
3062     silc_free(channel_name);
3063     return NULL;
3064   }
3065
3066   /* Now create the actual key material */
3067   if (!silc_server_create_channel_key(server, entry,
3068                                       silc_cipher_get_key_len(key) / 8)) {
3069     silc_idlist_del_channel(server->local_list, entry);
3070     return NULL;
3071   }
3072
3073   /* Notify other routers about the new channel. We send the packet
3074      to our primary route. */
3075   if (broadcast && server->standalone == FALSE)
3076     silc_server_send_new_channel(server, server->router->connection, TRUE,
3077                                  channel_name, entry->id,
3078                                  silc_id_get_len(entry->id, SILC_ID_CHANNEL),
3079                                  entry->mode);
3080
3081   server->stat.my_channels++;
3082
3083   if (server->server_type == SILC_ROUTER)
3084     entry->users_resolved = TRUE;
3085
3086   return entry;
3087 }
3088
3089 /* Channel's key re-key timeout callback. */
3090
3091 SILC_TASK_CALLBACK(silc_server_channel_key_rekey)
3092 {
3093   SilcServerChannelRekey rekey = (SilcServerChannelRekey)context;
3094   SilcServer server = (SilcServer)rekey->context;
3095
3096   rekey->task = NULL;
3097
3098   if (!silc_server_create_channel_key(server, rekey->channel, rekey->key_len))
3099     return;
3100
3101   silc_server_send_channel_key(server, NULL, rekey->channel, FALSE);
3102 }
3103
3104 /* Generates new channel key. This is used to create the initial channel key
3105    but also to re-generate new key for channel. If `key_len' is provided
3106    it is the bytes of the key length. */
3107
3108 bool silc_server_create_channel_key(SilcServer server,
3109                                     SilcChannelEntry channel,
3110                                     SilcUInt32 key_len)
3111 {
3112   int i;
3113   unsigned char channel_key[32], hash[32];
3114   SilcUInt32 len;
3115
3116   SILC_LOG_DEBUG(("Generating channel key"));
3117
3118   if (channel->mode & SILC_CHANNEL_MODE_PRIVKEY) {
3119     SILC_LOG_DEBUG(("Channel has private keys, will not generate new key"));
3120     return TRUE;
3121   }
3122
3123   if (!channel->channel_key)
3124     if (!silc_cipher_alloc(SILC_DEFAULT_CIPHER, &channel->channel_key)) {
3125       channel->channel_key = NULL;
3126       return FALSE;
3127     }
3128
3129   if (key_len)
3130     len = key_len;
3131   else if (channel->key_len)
3132     len = channel->key_len / 8;
3133   else
3134     len = silc_cipher_get_key_len(channel->channel_key) / 8;
3135
3136   /* Create channel key */
3137   for (i = 0; i < len; i++) channel_key[i] = silc_rng_get_byte(server->rng);
3138
3139   /* Set the key */
3140   silc_cipher_set_key(channel->channel_key, channel_key, len * 8);
3141
3142   /* Remove old key if exists */
3143   if (channel->key) {
3144     memset(channel->key, 0, channel->key_len / 8);
3145     silc_free(channel->key);
3146   }
3147
3148   /* Save the key */
3149   channel->key_len = len * 8;
3150   channel->key = silc_memdup(channel_key, len);
3151   memset(channel_key, 0, sizeof(channel_key));
3152
3153   /* Generate HMAC key from the channel key data and set it */
3154   if (!channel->hmac)
3155     silc_hmac_alloc(SILC_DEFAULT_HMAC, NULL, &channel->hmac);
3156   silc_hash_make(silc_hmac_get_hash(channel->hmac), channel->key, len, hash);
3157   silc_hmac_set_key(channel->hmac, hash,
3158                     silc_hash_len(silc_hmac_get_hash(channel->hmac)));
3159   memset(hash, 0, sizeof(hash));
3160
3161   if (server->server_type == SILC_ROUTER) {
3162     if (!channel->rekey)
3163       channel->rekey = silc_calloc(1, sizeof(*channel->rekey));
3164     channel->rekey->context = (void *)server;
3165     channel->rekey->channel = channel;
3166     channel->rekey->key_len = key_len;
3167     if (channel->rekey->task)
3168       silc_schedule_task_del(server->schedule, channel->rekey->task);
3169
3170     channel->rekey->task =
3171       silc_schedule_task_add(server->schedule, 0,
3172                              silc_server_channel_key_rekey,
3173                              (void *)channel->rekey,
3174                              server->config->channel_rekey_secs, 0,
3175                              SILC_TASK_TIMEOUT,
3176                              SILC_TASK_PRI_NORMAL);
3177   }
3178
3179   return TRUE;
3180 }
3181
3182 /* Saves the channel key found in the encoded `key_payload' buffer. This
3183    function is used when we receive Channel Key Payload and also when we're
3184    processing JOIN command reply. Returns entry to the channel. */
3185
3186 SilcChannelEntry silc_server_save_channel_key(SilcServer server,
3187                                               SilcBuffer key_payload,
3188                                               SilcChannelEntry channel)
3189 {
3190   SilcChannelKeyPayload payload = NULL;
3191   SilcChannelID *id = NULL;
3192   unsigned char *tmp, hash[32];
3193   SilcUInt32 tmp_len;
3194   char *cipher;
3195
3196   SILC_LOG_DEBUG(("Start"));
3197
3198   /* Decode channel key payload */
3199   payload = silc_channel_key_payload_parse(key_payload->data,
3200                                            key_payload->len);
3201   if (!payload) {
3202     SILC_LOG_ERROR(("Bad channel key payload received, dropped"));
3203     channel = NULL;
3204     goto out;
3205   }
3206
3207   /* Get the channel entry */
3208   if (!channel) {
3209
3210     /* Get channel ID */
3211     tmp = silc_channel_key_get_id(payload, &tmp_len);
3212     id = silc_id_str2id(tmp, tmp_len, SILC_ID_CHANNEL);
3213     if (!id) {
3214       channel = NULL;
3215       goto out;
3216     }
3217
3218     channel = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
3219     if (!channel) {
3220       channel = silc_idlist_find_channel_by_id(server->global_list, id, NULL);
3221       if (!channel) {
3222         SILC_LOG_ERROR(("Received key for non-existent channel %s",
3223                         silc_id_render(id, SILC_ID_CHANNEL)));
3224         goto out;
3225       }
3226     }
3227   }
3228
3229   tmp = silc_channel_key_get_key(payload, &tmp_len);
3230   if (!tmp) {
3231     channel = NULL;
3232     goto out;
3233   }
3234
3235   cipher = silc_channel_key_get_cipher(payload, NULL);
3236   if (!cipher) {
3237     channel = NULL;
3238     goto out;
3239   }
3240
3241   /* Remove old key if exists */
3242   if (channel->key) {
3243     memset(channel->key, 0, channel->key_len / 8);
3244     silc_free(channel->key);
3245     silc_cipher_free(channel->channel_key);
3246   }
3247
3248   /* Create new cipher */
3249   if (!silc_cipher_alloc(cipher, &channel->channel_key)) {
3250     channel->channel_key = NULL;
3251     channel = NULL;
3252     goto out;
3253   }
3254
3255   if (channel->cipher)
3256     silc_free(channel->cipher);
3257   channel->cipher = strdup(cipher);
3258
3259   /* Save the key */
3260   channel->key_len = tmp_len * 8;
3261   channel->key = silc_memdup(tmp, tmp_len);
3262   silc_cipher_set_key(channel->channel_key, tmp, channel->key_len);
3263
3264   /* Generate HMAC key from the channel key data and set it */
3265   if (!channel->hmac)
3266     silc_hmac_alloc(SILC_DEFAULT_HMAC, NULL, &channel->hmac);
3267   silc_hash_make(silc_hmac_get_hash(channel->hmac), tmp, tmp_len, hash);
3268   silc_hmac_set_key(channel->hmac, hash,
3269                     silc_hash_len(silc_hmac_get_hash(channel->hmac)));
3270
3271   memset(hash, 0, sizeof(hash));
3272   memset(tmp, 0, tmp_len);
3273
3274   if (server->server_type == SILC_ROUTER) {
3275     if (!channel->rekey)
3276       channel->rekey = silc_calloc(1, sizeof(*channel->rekey));
3277     channel->rekey->context = (void *)server;
3278     channel->rekey->channel = channel;
3279     if (channel->rekey->task)
3280       silc_schedule_task_del(server->schedule, channel->rekey->task);
3281
3282     channel->rekey->task =
3283       silc_schedule_task_add(server->schedule, 0,
3284                              silc_server_channel_key_rekey,
3285                              (void *)channel->rekey,
3286                              server->config->channel_rekey_secs, 0,
3287                              SILC_TASK_TIMEOUT,
3288                              SILC_TASK_PRI_NORMAL);
3289   }
3290
3291  out:
3292   silc_free(id);
3293   if (payload)
3294     silc_channel_key_payload_free(payload);
3295
3296   return channel;
3297 }
3298
3299 /* Heartbeat callback. This function is set as argument for the
3300    silc_socket_set_heartbeat function. The library will call this function
3301    at the set time interval. */
3302
3303 void silc_server_perform_heartbeat(SilcSocketConnection sock,
3304                                    void *hb_context)
3305 {
3306   SilcServerHBContext hb = (SilcServerHBContext)hb_context;
3307
3308   SILC_LOG_DEBUG(("Sending heartbeat to %s (%s)", sock->hostname, sock->ip));
3309
3310   /* Send the heartbeat */
3311   silc_server_send_heartbeat(hb->server, sock);
3312 }
3313
3314 /* Returns assembled of all servers in the given ID list. The packet's
3315    form is dictated by the New ID payload. */
3316
3317 static void silc_server_announce_get_servers(SilcServer server,
3318                                              SilcServerEntry remote,
3319                                              SilcIDList id_list,
3320                                              SilcBuffer *servers,
3321                                              unsigned long creation_time)
3322 {
3323   SilcIDCacheList list;
3324   SilcIDCacheEntry id_cache;
3325   SilcServerEntry entry;
3326   SilcBuffer idp;
3327
3328   /* Go through all clients in the list */
3329   if (silc_idcache_get_all(id_list->servers, &list)) {
3330     if (silc_idcache_list_first(list, &id_cache)) {
3331       while (id_cache) {
3332         entry = (SilcServerEntry)id_cache->context;
3333
3334         /* Do not announce the one we've sending our announcements and
3335            do not announce ourself. Also check the creation time if it's
3336            provided. */
3337         if ((entry == remote) || (entry == server->id_entry) ||
3338             (creation_time && entry->data.created < creation_time)) {
3339           if (!silc_idcache_list_next(list, &id_cache))
3340             break;
3341           continue;
3342         }
3343
3344         idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
3345
3346         *servers = silc_buffer_realloc(*servers,
3347                                        (*servers ?
3348                                         (*servers)->truelen + idp->len :
3349                                         idp->len));
3350         silc_buffer_pull_tail(*servers, ((*servers)->end - (*servers)->data));
3351         silc_buffer_put(*servers, idp->data, idp->len);
3352         silc_buffer_pull(*servers, idp->len);
3353         silc_buffer_free(idp);
3354
3355         if (!silc_idcache_list_next(list, &id_cache))
3356           break;
3357       }
3358     }
3359
3360     silc_idcache_list_free(list);
3361   }
3362 }
3363
3364 static SilcBuffer
3365 silc_server_announce_encode_notify(SilcNotifyType notify, SilcUInt32 argc, ...)
3366 {
3367   va_list ap;
3368   SilcBuffer p;
3369
3370   va_start(ap, argc);
3371   p = silc_notify_payload_encode(notify, argc, ap);
3372   va_end(ap);
3373
3374   return p;
3375 }
3376
3377 /* This function is used by router to announce existing servers to our
3378    primary router when we've connected to it. If `creation_time' is non-zero
3379    then only the servers that has been created after the `creation_time'
3380    will be announced. */
3381
3382 void silc_server_announce_servers(SilcServer server, bool global,
3383                                   unsigned long creation_time,
3384                                   SilcSocketConnection remote)
3385 {
3386   SilcBuffer servers = NULL;
3387
3388   SILC_LOG_DEBUG(("Announcing servers"));
3389
3390   /* Get servers in local list */
3391   silc_server_announce_get_servers(server, remote->user_data,
3392                                    server->local_list, &servers,
3393                                    creation_time);
3394
3395   if (global)
3396     /* Get servers in global list */
3397     silc_server_announce_get_servers(server, remote->user_data,
3398                                      server->global_list, &servers,
3399                                      creation_time);
3400
3401   if (servers) {
3402     silc_buffer_push(servers, servers->data - servers->head);
3403     SILC_LOG_HEXDUMP(("servers"), servers->data, servers->len);
3404
3405     /* Send the packet */
3406     silc_server_packet_send(server, remote,
3407                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
3408                             servers->data, servers->len, TRUE);
3409
3410     silc_buffer_free(servers);
3411   }
3412 }
3413
3414 /* Returns assembled packet of all clients in the given ID list. The
3415    packet's form is dictated by the New ID Payload. */
3416
3417 static void silc_server_announce_get_clients(SilcServer server,
3418                                              SilcIDList id_list,
3419                                              SilcBuffer *clients,
3420                                              SilcBuffer *umodes,
3421                                              unsigned long creation_time)
3422 {
3423   SilcIDCacheList list;
3424   SilcIDCacheEntry id_cache;
3425   SilcClientEntry client;
3426   SilcBuffer idp;
3427   SilcBuffer tmp;
3428   unsigned char mode[4];
3429
3430   /* Go through all clients in the list */
3431   if (silc_idcache_get_all(id_list->clients, &list)) {
3432     if (silc_idcache_list_first(list, &id_cache)) {
3433       while (id_cache) {
3434         client = (SilcClientEntry)id_cache->context;
3435
3436         if (creation_time && client->data.created < creation_time) {
3437           if (!silc_idcache_list_next(list, &id_cache))
3438             break;
3439           continue;
3440         }
3441
3442         idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
3443
3444         *clients = silc_buffer_realloc(*clients,
3445                                        (*clients ?
3446                                         (*clients)->truelen + idp->len :
3447                                         idp->len));
3448         silc_buffer_pull_tail(*clients, ((*clients)->end - (*clients)->data));
3449         silc_buffer_put(*clients, idp->data, idp->len);
3450         silc_buffer_pull(*clients, idp->len);
3451
3452         SILC_PUT32_MSB(client->mode, mode);
3453         tmp = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_UMODE_CHANGE,
3454                                                  2, idp->data, idp->len,
3455                                                  mode, 4);
3456         *umodes = silc_buffer_realloc(*umodes,
3457                                       (*umodes ?
3458                                        (*umodes)->truelen + tmp->len :
3459                                        tmp->len));
3460         silc_buffer_pull_tail(*umodes, ((*umodes)->end - (*umodes)->data));
3461         silc_buffer_put(*umodes, tmp->data, tmp->len);
3462         silc_buffer_pull(*umodes, tmp->len);
3463         silc_buffer_free(tmp);
3464
3465         silc_buffer_free(idp);
3466
3467         if (!silc_idcache_list_next(list, &id_cache))
3468           break;
3469       }
3470     }
3471
3472     silc_idcache_list_free(list);
3473   }
3474 }
3475
3476 /* This function is used to announce our existing clients to our router
3477    when we've connected to it. If `creation_time' is non-zero then only
3478    the clients that has been created after the `creation_time' will be
3479    announced. */
3480
3481 void silc_server_announce_clients(SilcServer server,
3482                                   unsigned long creation_time,
3483                                   SilcSocketConnection remote)
3484 {
3485   SilcBuffer clients = NULL;
3486   SilcBuffer umodes = NULL;
3487
3488   SILC_LOG_DEBUG(("Announcing clients"));
3489
3490   /* Get clients in local list */
3491   silc_server_announce_get_clients(server, server->local_list,
3492                                    &clients, &umodes, creation_time);
3493
3494   /* As router we announce our global list as well */
3495   if (server->server_type == SILC_ROUTER)
3496     silc_server_announce_get_clients(server, server->global_list,
3497                                      &clients, &umodes, creation_time);
3498
3499   if (clients) {
3500     silc_buffer_push(clients, clients->data - clients->head);
3501     SILC_LOG_HEXDUMP(("clients"), clients->data, clients->len);
3502
3503     /* Send the packet */
3504     silc_server_packet_send(server, remote,
3505                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
3506                             clients->data, clients->len, TRUE);
3507
3508     silc_buffer_free(clients);
3509   }
3510
3511   if (umodes) {
3512     silc_buffer_push(umodes, umodes->data - umodes->head);
3513     SILC_LOG_HEXDUMP(("umodes"), umodes->data, umodes->len);
3514
3515     /* Send the packet */
3516     silc_server_packet_send(server, remote,
3517                             SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3518                             umodes->data, umodes->len, TRUE);
3519
3520     silc_buffer_free(umodes);
3521   }
3522 }
3523
3524 /* Returns channel's topic for announcing it */
3525
3526 void silc_server_announce_get_channel_topic(SilcServer server,
3527                                             SilcChannelEntry channel,
3528                                             SilcBuffer *topic)
3529 {
3530   SilcBuffer chidp;
3531
3532   if (channel->topic) {
3533     chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
3534     *topic = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_TOPIC_SET, 2,
3535                                                 chidp->data, chidp->len,
3536                                                 channel->topic,
3537                                                 strlen(channel->topic));
3538     silc_buffer_free(chidp);
3539   }
3540 }
3541
3542 /* Returns assembled packets for channel users of the `channel'. */
3543
3544 void silc_server_announce_get_channel_users(SilcServer server,
3545                                             SilcChannelEntry channel,
3546                                             SilcBuffer *channel_users,
3547                                             SilcBuffer *channel_users_modes)
3548 {
3549   SilcChannelClientEntry chl;
3550   SilcHashTableList htl;
3551   SilcBuffer chidp, clidp;
3552   SilcBuffer tmp;
3553   int len;
3554   unsigned char mode[4];
3555
3556   SILC_LOG_DEBUG(("Start"));
3557
3558   /* Now find all users on the channel */
3559   chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
3560   silc_hash_table_list(channel->user_list, &htl);
3561   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
3562     clidp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
3563
3564     /* JOIN Notify */
3565     tmp = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_JOIN, 2,
3566                                              clidp->data, clidp->len,
3567                                              chidp->data, chidp->len);
3568     len = tmp->len;
3569     *channel_users =
3570       silc_buffer_realloc(*channel_users,
3571                           (*channel_users ?
3572                            (*channel_users)->truelen + len : len));
3573     silc_buffer_pull_tail(*channel_users,
3574                           ((*channel_users)->end -
3575                            (*channel_users)->data));
3576
3577     silc_buffer_put(*channel_users, tmp->data, tmp->len);
3578     silc_buffer_pull(*channel_users, len);
3579     silc_buffer_free(tmp);
3580
3581     /* CUMODE notify for mode change on the channel */
3582     SILC_PUT32_MSB(chl->mode, mode);
3583     tmp = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_CUMODE_CHANGE,
3584                                              3, clidp->data, clidp->len,
3585                                              mode, 4,
3586                                              clidp->data, clidp->len);
3587     len = tmp->len;
3588     *channel_users_modes =
3589       silc_buffer_realloc(*channel_users_modes,
3590                           (*channel_users_modes ?
3591                            (*channel_users_modes)->truelen + len : len));
3592     silc_buffer_pull_tail(*channel_users_modes,
3593                           ((*channel_users_modes)->end -
3594                            (*channel_users_modes)->data));
3595
3596     silc_buffer_put(*channel_users_modes, tmp->data, tmp->len);
3597     silc_buffer_pull(*channel_users_modes, len);
3598     silc_buffer_free(tmp);
3599
3600     silc_buffer_free(clidp);
3601   }
3602   silc_hash_table_list_reset(&htl);
3603   silc_buffer_free(chidp);
3604 }
3605
3606 /* Returns assembled packets for all channels and users on those channels
3607    from the given ID List. The packets are in the form dictated by the
3608    New Channel and New Channel User payloads. */
3609
3610 void silc_server_announce_get_channels(SilcServer server,
3611                                        SilcIDList id_list,
3612                                        SilcBuffer *channels,
3613                                        SilcBuffer *channel_users,
3614                                        SilcBuffer **channel_users_modes,
3615                                        SilcUInt32 *channel_users_modes_c,
3616                                        SilcBuffer **channel_topics,
3617                                        SilcChannelID ***channel_ids,
3618                                        unsigned long creation_time)
3619 {
3620   SilcIDCacheList list;
3621   SilcIDCacheEntry id_cache;
3622   SilcChannelEntry channel;
3623   unsigned char *cid;
3624   SilcUInt32 id_len;
3625   SilcUInt16 name_len;
3626   int len;
3627   int i = *channel_users_modes_c;
3628   bool announce;
3629
3630   SILC_LOG_DEBUG(("Start"));
3631
3632   /* Go through all channels in the list */
3633   if (silc_idcache_get_all(id_list->channels, &list)) {
3634     if (silc_idcache_list_first(list, &id_cache)) {
3635       while (id_cache) {
3636         channel = (SilcChannelEntry)id_cache->context;
3637
3638         if (creation_time && channel->created < creation_time)
3639           announce = FALSE;
3640         else
3641           announce = TRUE;
3642
3643         cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
3644         id_len = silc_id_get_len(channel->id, SILC_ID_CHANNEL);
3645         name_len = strlen(channel->channel_name);
3646
3647         if (announce) {
3648           len = 4 + name_len + id_len + 4;
3649           *channels =
3650             silc_buffer_realloc(*channels,
3651                                 (*channels ? (*channels)->truelen +
3652                                  len : len));
3653           silc_buffer_pull_tail(*channels,
3654                                 ((*channels)->end - (*channels)->data));
3655           silc_buffer_format(*channels,
3656                              SILC_STR_UI_SHORT(name_len),
3657                              SILC_STR_UI_XNSTRING(channel->channel_name,
3658                                                   name_len),
3659                              SILC_STR_UI_SHORT(id_len),
3660                              SILC_STR_UI_XNSTRING(cid, id_len),
3661                              SILC_STR_UI_INT(channel->mode),
3662                              SILC_STR_END);
3663           silc_buffer_pull(*channels, len);
3664         }
3665
3666         /* Channel user modes */
3667         *channel_users_modes = silc_realloc(*channel_users_modes,
3668                                             sizeof(**channel_users_modes) *
3669                                             (i + 1));
3670         (*channel_users_modes)[i] = NULL;
3671         *channel_ids = silc_realloc(*channel_ids,
3672                                     sizeof(**channel_ids) * (i + 1));
3673         (*channel_ids)[i] = NULL;
3674         silc_server_announce_get_channel_users(server, channel,
3675                                                channel_users,
3676                                                &(*channel_users_modes)[i]);
3677         (*channel_ids)[i] = channel->id;
3678
3679         /* Channel's topic */
3680         *channel_topics = silc_realloc(*channel_topics,
3681                                        sizeof(**channel_topics) * (i + 1));
3682         (*channel_topics)[i] = NULL;
3683         silc_server_announce_get_channel_topic(server, channel,
3684                                                &(*channel_topics)[i]);
3685         i++;
3686
3687         if (!silc_idcache_list_next(list, &id_cache))
3688           break;
3689       }
3690
3691       *channel_users_modes_c += i;
3692     }
3693
3694     silc_idcache_list_free(list);
3695   }
3696 }
3697
3698 /* This function is used to announce our existing channels to our router
3699    when we've connected to it. This also announces the users on the
3700    channels to the router. If the `creation_time' is non-zero only the
3701    channels that was created after the `creation_time' are announced.
3702    Note that the channel users are still announced even if the `creation_time'
3703    was provided. */
3704
3705 void silc_server_announce_channels(SilcServer server,
3706                                    unsigned long creation_time,
3707                                    SilcSocketConnection remote)
3708 {
3709   SilcBuffer channels = NULL, channel_users = NULL;
3710   SilcBuffer *channel_users_modes = NULL;
3711   SilcBuffer *channel_topics = NULL;
3712   SilcUInt32 channel_users_modes_c = 0;
3713   SilcChannelID **channel_ids = NULL;
3714
3715   SILC_LOG_DEBUG(("Announcing channels and channel users"));
3716
3717   /* Get channels and channel users in local list */
3718   silc_server_announce_get_channels(server, server->local_list,
3719                                     &channels, &channel_users,
3720                                     &channel_users_modes,
3721                                     &channel_users_modes_c,
3722                                     &channel_topics,
3723                                     &channel_ids, creation_time);
3724
3725   /* Get channels and channel users in global list */
3726   if (server->server_type != SILC_SERVER)
3727     silc_server_announce_get_channels(server, server->global_list,
3728                                       &channels, &channel_users,
3729                                       &channel_users_modes,
3730                                       &channel_users_modes_c,
3731                                       &channel_topics,
3732                                       &channel_ids, creation_time);
3733
3734   if (channels) {
3735     silc_buffer_push(channels, channels->data - channels->head);
3736     SILC_LOG_HEXDUMP(("channels"), channels->data, channels->len);
3737
3738     /* Send the packet */
3739     silc_server_packet_send(server, remote,
3740                             SILC_PACKET_NEW_CHANNEL, SILC_PACKET_FLAG_LIST,
3741                             channels->data, channels->len,
3742                             FALSE);
3743
3744     silc_buffer_free(channels);
3745   }
3746
3747   if (channel_users) {
3748     silc_buffer_push(channel_users, channel_users->data - channel_users->head);
3749     SILC_LOG_HEXDUMP(("channel users"), channel_users->data,
3750                      channel_users->len);
3751
3752     /* Send the packet */
3753     silc_server_packet_send(server, remote,
3754                             SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3755                             channel_users->data, channel_users->len,
3756                             FALSE);
3757
3758     silc_buffer_free(channel_users);
3759   }
3760
3761   if (channel_users_modes) {
3762     int i;
3763
3764     for (i = 0; i < channel_users_modes_c; i++) {
3765       if (!channel_users_modes[i])
3766         continue;
3767       silc_buffer_push(channel_users_modes[i],
3768                        channel_users_modes[i]->data -
3769                        channel_users_modes[i]->head);
3770       SILC_LOG_HEXDUMP(("channel users modes"), channel_users_modes[i]->data,
3771                        channel_users_modes[i]->len);
3772       silc_server_packet_send_dest(server, remote,
3773                                    SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3774                                    channel_ids[i], SILC_ID_CHANNEL,
3775                                    channel_users_modes[i]->data,
3776                                    channel_users_modes[i]->len,
3777                                    FALSE);
3778       silc_buffer_free(channel_users_modes[i]);
3779     }
3780     silc_free(channel_users_modes);
3781   }
3782
3783   if (channel_topics) {
3784     int i;
3785
3786     for (i = 0; i < channel_users_modes_c; i++) {
3787       if (!channel_topics[i])
3788         continue;
3789
3790       silc_buffer_push(channel_topics[i],
3791                        channel_topics[i]->data -
3792                        channel_topics[i]->head);
3793       SILC_LOG_HEXDUMP(("channel topic"), channel_topics[i]->data,
3794                        channel_topics[i]->len);
3795       silc_server_packet_send_dest(server, remote,
3796                                    SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3797                                    channel_ids[i], SILC_ID_CHANNEL,
3798                                    channel_topics[i]->data,
3799                                    channel_topics[i]->len,
3800                                    FALSE);
3801       silc_buffer_free(channel_topics[i]);
3802     }
3803     silc_free(channel_topics);
3804   }
3805
3806   silc_free(channel_ids);
3807 }
3808
3809 /* Failure timeout callback. If this is called then we will immediately
3810    process the received failure. We always process the failure with timeout
3811    since we do not want to blindly trust to received failure packets.
3812    This won't be called (the timeout is cancelled) if the failure was
3813    bogus (it is bogus if remote does not close the connection after sending
3814    the failure). */
3815
3816 SILC_TASK_CALLBACK(silc_server_failure_callback)
3817 {
3818   SilcServerFailureContext f = (SilcServerFailureContext)context;
3819
3820   if (f->sock->protocol) {
3821     f->sock->protocol->state = SILC_PROTOCOL_STATE_FAILURE;
3822     silc_protocol_execute(f->sock->protocol, f->server->schedule, 0, 0);
3823   }
3824
3825   silc_free(f);
3826 }
3827
3828 /* Assembles user list and users mode list from the `channel'. */
3829
3830 void silc_server_get_users_on_channel(SilcServer server,
3831                                       SilcChannelEntry channel,
3832                                       SilcBuffer *user_list,
3833                                       SilcBuffer *mode_list,
3834                                       SilcUInt32 *user_count)
3835 {
3836   SilcChannelClientEntry chl;
3837   SilcHashTableList htl;
3838   SilcBuffer client_id_list;
3839   SilcBuffer client_mode_list;
3840   SilcBuffer idp;
3841   SilcUInt32 list_count = 0, len = 0;
3842
3843   silc_hash_table_list(channel->user_list, &htl);
3844   while (silc_hash_table_get(&htl, NULL, (void *)&chl))
3845     len += (silc_id_get_len(chl->client->id, SILC_ID_CLIENT) + 4);
3846   silc_hash_table_list_reset(&htl);
3847
3848   client_id_list = silc_buffer_alloc(len);
3849   client_mode_list =
3850     silc_buffer_alloc(4 * silc_hash_table_count(channel->user_list));
3851   silc_buffer_pull_tail(client_id_list, SILC_BUFFER_END(client_id_list));
3852   silc_buffer_pull_tail(client_mode_list, SILC_BUFFER_END(client_mode_list));
3853
3854   silc_hash_table_list(channel->user_list, &htl);
3855   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
3856     /* Client ID */
3857     idp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
3858     silc_buffer_put(client_id_list, idp->data, idp->len);
3859     silc_buffer_pull(client_id_list, idp->len);
3860     silc_buffer_free(idp);
3861
3862     /* Client's mode on channel */
3863     SILC_PUT32_MSB(chl->mode, client_mode_list->data);
3864     silc_buffer_pull(client_mode_list, 4);
3865
3866     list_count++;
3867   }
3868   silc_hash_table_list_reset(&htl);
3869   silc_buffer_push(client_id_list,
3870                    client_id_list->data - client_id_list->head);
3871   silc_buffer_push(client_mode_list,
3872                    client_mode_list->data - client_mode_list->head);
3873
3874   *user_list = client_id_list;
3875   *mode_list = client_mode_list;
3876   *user_count = list_count;
3877 }
3878
3879 /* Saves users and their modes to the `channel'. */
3880
3881 void silc_server_save_users_on_channel(SilcServer server,
3882                                        SilcSocketConnection sock,
3883                                        SilcChannelEntry channel,
3884                                        SilcClientID *noadd,
3885                                        SilcBuffer user_list,
3886                                        SilcBuffer mode_list,
3887                                        SilcUInt32 user_count)
3888 {
3889   int i;
3890   SilcUInt16 idp_len;
3891   SilcUInt32 mode;
3892   SilcClientID *client_id;
3893   SilcClientEntry client;
3894   SilcIDCacheEntry cache;
3895   SilcChannelClientEntry chl;
3896   bool global;
3897
3898   SILC_LOG_DEBUG(("Start"));
3899
3900   for (i = 0; i < user_count; i++) {
3901     /* Client ID */
3902     SILC_GET16_MSB(idp_len, user_list->data + 2);
3903     idp_len += 4;
3904     client_id = silc_id_payload_parse_id(user_list->data, idp_len, NULL);
3905     silc_buffer_pull(user_list, idp_len);
3906     if (!client_id)
3907       continue;
3908
3909     /* Mode */
3910     SILC_GET32_MSB(mode, mode_list->data);
3911     silc_buffer_pull(mode_list, 4);
3912
3913     if (noadd && SILC_ID_CLIENT_COMPARE(client_id, noadd)) {
3914       silc_free(client_id);
3915       continue;
3916     }
3917
3918     global = FALSE;
3919
3920     /* Check if we have this client cached already. */
3921     client = silc_idlist_find_client_by_id(server->local_list, client_id,
3922                                            server->server_type, &cache);
3923     if (!client) {
3924       client = silc_idlist_find_client_by_id(server->global_list,
3925                                              client_id, server->server_type,
3926                                              &cache);
3927       global = TRUE;
3928     }
3929     if (!client) {
3930       /* If router did not find such Client ID in its lists then this must
3931          be bogus client or some router in the net is buggy. */
3932       if (server->server_type == SILC_ROUTER) {
3933         silc_free(client_id);
3934         continue;
3935       }
3936
3937       /* We don't have that client anywhere, add it. The client is added
3938          to global list since server didn't have it in the lists so it must be
3939          global. */
3940       client = silc_idlist_add_client(server->global_list, NULL, NULL, NULL,
3941                                       silc_id_dup(client_id, SILC_ID_CLIENT),
3942                                       sock->user_data, NULL, 0);
3943       if (!client) {
3944         SILC_LOG_ERROR(("Could not add new client to the ID Cache"));
3945         silc_free(client_id);
3946         continue;
3947       }
3948
3949       client->data.status |= SILC_IDLIST_STATUS_REGISTERED;
3950     } else {
3951       /* Found, if it is from global list we'll assure that we won't
3952          expire it now that the entry is on channel. */
3953       if (global)
3954         cache->expire = 0;
3955     }
3956
3957     silc_free(client_id);
3958
3959     if (!silc_server_client_on_channel(client, channel, &chl)) {
3960       /* Client was not on the channel, add it. */
3961       chl = silc_calloc(1, sizeof(*chl));
3962       chl->client = client;
3963       chl->mode = mode;
3964       chl->channel = channel;
3965       silc_hash_table_add(channel->user_list, chl->client, chl);
3966       silc_hash_table_add(client->channels, chl->channel, chl);
3967       channel->user_count++;
3968     } else {
3969       /* Update mode */
3970       chl->mode = mode;
3971     }
3972   }
3973 }
3974
3975 /* Saves channels and channels user modes to the `client'.  Removes
3976    the client from those channels that are not sent in the list but
3977    it has joined. */
3978
3979 void silc_server_save_user_channels(SilcServer server,
3980                                     SilcSocketConnection sock,
3981                                     SilcClientEntry client,
3982                                     SilcBuffer channels,
3983                                     SilcBuffer channels_user_modes)
3984 {
3985   SilcDList ch;
3986   SilcUInt32 *chumodes;
3987   SilcChannelPayload entry;
3988   SilcChannelEntry channel;
3989   SilcChannelID *channel_id;
3990   SilcChannelClientEntry chl;
3991   SilcHashTable ht = NULL;
3992   SilcHashTableList htl;
3993   char *name;
3994   int i = 0;
3995
3996   if (!channels ||!channels_user_modes)
3997     goto out;
3998   
3999   ch = silc_channel_payload_parse_list(channels->data, channels->len);
4000   if (ch && silc_get_mode_list(channels_user_modes, silc_dlist_count(ch),
4001                                &chumodes)) {
4002     ht = silc_hash_table_alloc(0, silc_hash_ptr, NULL, NULL, 
4003                                NULL, NULL, NULL, TRUE);
4004     silc_dlist_start(ch);
4005     while ((entry = silc_dlist_get(ch)) != SILC_LIST_END) {
4006       /* Check if we have this channel, and add it if we don't have it.
4007          Also add the client on the channel unless it is there already. */
4008       channel_id = silc_channel_get_id_parse(entry);
4009       channel = silc_idlist_find_channel_by_id(server->local_list, 
4010                                                channel_id, NULL);
4011       if (!channel)
4012         channel = silc_idlist_find_channel_by_id(server->global_list,
4013                                                  channel_id, NULL);
4014       if (!channel) {
4015         if (server->server_type != SILC_SERVER) {
4016           silc_free(channel_id);
4017           i++;
4018           continue;
4019         }
4020         
4021         /* We don't have that channel anywhere, add it. */
4022         name = silc_channel_get_name(entry, NULL);
4023         channel = silc_idlist_add_channel(server->global_list, strdup(name), 0,
4024                                           channel_id, server->router,
4025                                           NULL, NULL, 0);
4026         if (!channel) {
4027           silc_free(channel_id);
4028           i++;
4029           continue;
4030         }
4031         channel_id = NULL;
4032       }
4033
4034       channel->mode = silc_channel_get_mode(entry);
4035
4036       /* Add the client on the channel */
4037       if (!silc_server_client_on_channel(client, channel, &chl)) {
4038         chl = silc_calloc(1, sizeof(*chl));
4039         chl->client = client;
4040         chl->mode = chumodes[i++];
4041         chl->channel = channel;
4042         silc_hash_table_add(channel->user_list, chl->client, chl);
4043         silc_hash_table_add(client->channels, chl->channel, chl);
4044         channel->user_count++;
4045       } else {
4046         /* Update mode */
4047         chl->mode = chumodes[i++];
4048       }
4049
4050       silc_hash_table_add(ht, channel, channel);
4051       silc_free(channel_id);
4052     }
4053     silc_channel_payload_list_free(ch);
4054     silc_free(chumodes);
4055   }
4056
4057  out:
4058   /* Go through the list again and remove client from channels that
4059      are no part of the list. */
4060   if (ht) {
4061     silc_hash_table_list(client->channels, &htl);
4062     while (silc_hash_table_get(&htl, NULL, (void **)&chl)) {
4063       if (!silc_hash_table_find(ht, chl->channel, NULL, NULL)) {
4064         silc_hash_table_del(chl->channel->user_list, chl->client);
4065         silc_hash_table_del(chl->client->channels, chl->channel);
4066         silc_free(chl);
4067       }
4068     }
4069     silc_hash_table_list_reset(&htl);
4070     silc_hash_table_free(ht);
4071   } else {
4072     silc_hash_table_list(client->channels, &htl);
4073     while (silc_hash_table_get(&htl, NULL, (void **)&chl)) {
4074       silc_hash_table_del(chl->channel->user_list, chl->client);
4075       silc_hash_table_del(chl->client->channels, chl->channel);
4076       silc_free(chl);
4077     }
4078     silc_hash_table_list_reset(&htl);
4079   }
4080 }
4081
4082 /* Lookups route to the client indicated by the `id_data'. The connection
4083    object and internal data object is returned. Returns NULL if route
4084    could not be found to the client. If the `client_id' is specified then
4085    it is used and the `id_data' is ignored. */
4086
4087 SilcSocketConnection
4088 silc_server_get_client_route(SilcServer server,
4089                              unsigned char *id_data,
4090                              SilcUInt32 id_len,
4091                              SilcClientID *client_id,
4092                              SilcIDListData *idata,
4093                              SilcClientEntry *client_entry)
4094 {
4095   SilcClientID *id;
4096   SilcClientEntry client;
4097
4098   SILC_LOG_DEBUG(("Start"));
4099
4100   if (client_entry)
4101     *client_entry = NULL;
4102
4103   /* Decode destination Client ID */
4104   if (!client_id) {
4105     id = silc_id_str2id(id_data, id_len, SILC_ID_CLIENT);
4106     if (!id) {
4107       SILC_LOG_ERROR(("Could not decode destination Client ID, dropped"));
4108       return NULL;
4109     }
4110   } else {
4111     id = silc_id_dup(client_id, SILC_ID_CLIENT);
4112   }
4113
4114   /* If the destination belongs to our server we don't have to route
4115      the packet anywhere but to send it to the local destination. */
4116   client = silc_idlist_find_client_by_id(server->local_list, id, TRUE, NULL);
4117   if (client) {
4118     silc_free(id);
4119
4120     /* If we are router and the client has router then the client is in
4121        our cell but not directly connected to us. */
4122     if (server->server_type == SILC_ROUTER && client->router) {
4123       /* We are of course in this case the client's router thus the route
4124          to the client is the server who owns the client. So, we will send
4125          the packet to that server. */
4126       if (idata)
4127         *idata = (SilcIDListData)client->router;
4128       return client->router->connection;
4129     }
4130
4131     /* Seems that client really is directly connected to us */
4132     if (idata)
4133       *idata = (SilcIDListData)client;
4134     if (client_entry)
4135       *client_entry = client;
4136     return client->connection;
4137   }
4138
4139   /* Destination belongs to someone not in this server. If we are normal
4140      server our action is to send the packet to our router. */
4141   if (server->server_type != SILC_ROUTER && !server->standalone) {
4142     silc_free(id);
4143     if (idata)
4144       *idata = (SilcIDListData)server->router;
4145     return server->router->connection;
4146   }
4147
4148   /* We are router and we will perform route lookup for the destination
4149      and send the packet to fastest route. */
4150   if (server->server_type == SILC_ROUTER && !server->standalone) {
4151     /* Check first that the ID is valid */
4152     client = silc_idlist_find_client_by_id(server->global_list, id,
4153                                            TRUE, NULL);
4154     if (client) {
4155       SilcSocketConnection dst_sock;
4156
4157       dst_sock = silc_server_route_get(server, id, SILC_ID_CLIENT);
4158
4159       silc_free(id);
4160       if (idata)
4161         *idata = (SilcIDListData)dst_sock->user_data;
4162       return dst_sock;
4163     }
4164   }
4165
4166   silc_free(id);
4167   return NULL;
4168 }
4169
4170 /* Encodes and returns channel list of channels the `client' has joined.
4171    Secret channels are not put to the list. */
4172
4173 SilcBuffer silc_server_get_client_channel_list(SilcServer server,
4174                                                SilcClientEntry client,
4175                                                bool get_private,
4176                                                bool get_secret,
4177                                                SilcBuffer *user_mode_list)
4178 {
4179   SilcBuffer buffer = NULL;
4180   SilcChannelEntry channel;
4181   SilcChannelClientEntry chl;
4182   SilcHashTableList htl;
4183   unsigned char *cid;
4184   SilcUInt32 id_len;
4185   SilcUInt16 name_len;
4186   int len;
4187
4188   if (user_mode_list)
4189     *user_mode_list = NULL;
4190
4191   silc_hash_table_list(client->channels, &htl);
4192   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
4193     channel = chl->channel;
4194
4195     if (channel->mode & SILC_CHANNEL_MODE_SECRET && !get_secret)
4196       continue;
4197     if (channel->mode & SILC_CHANNEL_MODE_PRIVATE && !get_private)
4198       continue;
4199
4200     cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
4201     id_len = silc_id_get_len(channel->id, SILC_ID_CHANNEL);
4202     name_len = strlen(channel->channel_name);
4203
4204     len = 4 + name_len + id_len + 4;
4205     buffer = silc_buffer_realloc(buffer,
4206                                  (buffer ? buffer->truelen + len : len));
4207     silc_buffer_pull_tail(buffer, (buffer->end - buffer->data));
4208     silc_buffer_format(buffer,
4209                        SILC_STR_UI_SHORT(name_len),
4210                        SILC_STR_UI_XNSTRING(channel->channel_name,
4211                                             name_len),
4212                        SILC_STR_UI_SHORT(id_len),
4213                        SILC_STR_UI_XNSTRING(cid, id_len),
4214                        SILC_STR_UI_INT(chl->channel->mode),
4215                        SILC_STR_END);
4216     silc_buffer_pull(buffer, len);
4217     silc_free(cid);
4218
4219     if (user_mode_list) {
4220       *user_mode_list = silc_buffer_realloc(*user_mode_list,
4221                                             (*user_mode_list ?
4222                                              (*user_mode_list)->truelen + 4 :
4223                                              4));
4224       silc_buffer_pull_tail(*user_mode_list, ((*user_mode_list)->end -
4225                                               (*user_mode_list)->data));
4226       SILC_PUT32_MSB(chl->mode, (*user_mode_list)->data);
4227       silc_buffer_pull(*user_mode_list, 4);
4228     }
4229   }
4230   silc_hash_table_list_reset(&htl);
4231
4232   if (buffer)
4233     silc_buffer_push(buffer, buffer->data - buffer->head);
4234   if (user_mode_list && *user_mode_list)
4235     silc_buffer_push(*user_mode_list, ((*user_mode_list)->data -
4236                                        (*user_mode_list)->head));
4237
4238   return buffer;
4239 }
4240
4241 /* Finds client entry by Client ID and if it is not found then resolves
4242    it using WHOIS command. */
4243
4244 SilcClientEntry silc_server_get_client_resolve(SilcServer server,
4245                                                SilcClientID *client_id,
4246                                                bool always_resolve,
4247                                                bool *resolved)
4248 {
4249   SilcClientEntry client;
4250
4251   if (resolved)
4252     *resolved = FALSE;
4253
4254   client = silc_idlist_find_client_by_id(server->local_list, client_id,
4255                                          TRUE, NULL);
4256   if (!client) {
4257     client = silc_idlist_find_client_by_id(server->global_list,
4258                                            client_id, TRUE, NULL);
4259     if (!client && server->server_type == SILC_ROUTER)
4260       return NULL;
4261   }
4262
4263   if (!client && server->standalone)
4264     return NULL;
4265
4266   if (!client || !client->nickname || !client->username ||
4267       always_resolve) {
4268     SilcBuffer buffer, idp;
4269
4270     if (client) {
4271       client->data.status |= SILC_IDLIST_STATUS_RESOLVING;
4272       client->data.status &= ~SILC_IDLIST_STATUS_RESOLVED;
4273       client->resolve_cmd_ident = ++server->cmd_ident;
4274     }
4275
4276     idp = silc_id_payload_encode(client_id, SILC_ID_CLIENT);
4277     buffer = silc_command_payload_encode_va(SILC_COMMAND_WHOIS,
4278                                             server->cmd_ident, 1,
4279                                             4, idp->data, idp->len);
4280     silc_server_packet_send(server, client ? client->router->connection :
4281                             server->router->connection,
4282                             SILC_PACKET_COMMAND, 0,
4283                             buffer->data, buffer->len, FALSE);
4284     silc_buffer_free(idp);
4285     silc_buffer_free(buffer);
4286
4287     if (resolved)
4288       *resolved = TRUE;
4289
4290     return NULL;
4291   }
4292
4293   return client;
4294 }
4295
4296 /* A timeout callback for the re-key. We will be the initiator of the
4297    re-key protocol. */
4298
4299 SILC_TASK_CALLBACK(silc_server_rekey_callback)
4300 {
4301   SilcSocketConnection sock = (SilcSocketConnection)context;
4302   SilcIDListData idata = (SilcIDListData)sock->user_data;
4303   SilcServer server = (SilcServer)idata->rekey->context;
4304   SilcProtocol protocol;
4305   SilcServerRekeyInternalContext *proto_ctx;
4306
4307   SILC_LOG_DEBUG(("Start"));
4308
4309   /* Allocate internal protocol context. This is sent as context
4310      to the protocol. */
4311   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
4312   proto_ctx->server = (void *)server;
4313   proto_ctx->sock = sock;
4314   proto_ctx->responder = FALSE;
4315   proto_ctx->pfs = idata->rekey->pfs;
4316
4317   /* Perform rekey protocol. Will call the final callback after the
4318      protocol is over. */
4319   silc_protocol_alloc(SILC_PROTOCOL_SERVER_REKEY,
4320                       &protocol, proto_ctx, silc_server_rekey_final);
4321   sock->protocol = protocol;
4322
4323   /* Run the protocol */
4324   silc_protocol_execute(protocol, server->schedule, 0, 0);
4325
4326   /* Re-register re-key timeout */
4327   silc_schedule_task_add(server->schedule, sock->sock,
4328                          silc_server_rekey_callback,
4329                          context, idata->rekey->timeout, 0,
4330                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
4331 }
4332
4333 /* The final callback for the REKEY protocol. This will actually take the
4334    new key material into use. */
4335
4336 SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final)
4337 {
4338   SilcProtocol protocol = (SilcProtocol)context;
4339   SilcServerRekeyInternalContext *ctx =
4340     (SilcServerRekeyInternalContext *)protocol->context;
4341   SilcServer server = (SilcServer)ctx->server;
4342   SilcSocketConnection sock = ctx->sock;
4343
4344   SILC_LOG_DEBUG(("Start"));
4345
4346   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
4347       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
4348     /* Error occured during protocol */
4349     SILC_LOG_ERROR(("Error occurred during rekey protocol"));
4350     silc_protocol_cancel(protocol, server->schedule);
4351     silc_protocol_free(protocol);
4352     sock->protocol = NULL;
4353     if (ctx->packet)
4354       silc_packet_context_free(ctx->packet);
4355     if (ctx->ske)
4356       silc_ske_free(ctx->ske);
4357     silc_free(ctx);
4358     return;
4359   }
4360
4361   /* Purge the outgoing data queue to assure that all rekey packets really
4362      go to the network before we quit the protocol. */
4363   silc_server_packet_queue_purge(server, sock);
4364
4365   /* Cleanup */
4366   silc_protocol_free(protocol);
4367   sock->protocol = NULL;
4368   if (ctx->packet)
4369     silc_packet_context_free(ctx->packet);
4370   if (ctx->ske)
4371     silc_ske_free(ctx->ske);
4372   silc_free(ctx);
4373 }
4374
4375 /* Task callback used to retrieve network statistical information from
4376    router server once in a while. */
4377
4378 SILC_TASK_CALLBACK(silc_server_get_stats)
4379 {
4380   SilcServer server = (SilcServer)context;
4381   SilcBuffer idp, packet;
4382
4383   SILC_LOG_DEBUG(("Retrieving stats from router"));
4384
4385   if (!server->standalone) {
4386     idp = silc_id_payload_encode(server->router->id, SILC_ID_SERVER);
4387     packet = silc_command_payload_encode_va(SILC_COMMAND_STATS, 
4388                                             ++server->cmd_ident, 1,
4389                                             1, idp->data, idp->len);
4390     silc_server_packet_send(server, server->router->connection,
4391                             SILC_PACKET_COMMAND, 0, packet->data,
4392                             packet->len, FALSE);
4393     silc_buffer_free(packet);
4394     silc_buffer_free(idp);
4395   }
4396
4397   silc_schedule_task_add(server->schedule, 0, silc_server_get_stats,
4398                          server, 120, 0, SILC_TASK_TIMEOUT,
4399                          SILC_TASK_PRI_LOW);
4400 }