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