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