5 Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
7 Copyright (C) 1997 - 2000 Pekka Riikonen
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.
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.
21 * Server packet routines to send packets.
25 #include "serverincludes.h"
26 #include "server_internal.h"
28 /* Routine that sends packet or marks packet to be sent. This is used
29 directly only in special cases. Normal cases should use
30 silc_server_packet_send. Returns < 0 error. */
32 int silc_server_packet_send_real(SilcServer server,
33 SilcSocketConnection sock,
39 ret = silc_packet_send(sock, force_send);
43 /* Mark that there is some outgoing data available for this connection.
44 This call sets the connection both for input and output (the input
45 is set always and this call keeps the input setting, actually).
46 Actual data sending is performed by silc_server_packet_process. */
47 SILC_SET_CONNECTION_FOR_OUTPUT(sock->sock);
49 /* Mark to socket that data is pending in outgoing buffer. This flag
50 is needed if new data is added to the buffer before the earlier
51 put data is sent to the network. */
52 SILC_SET_OUTBUF_PENDING(sock);
57 /* Assembles a new packet to be sent out to network. This doesn't actually
58 send the packet but creates the packet and fills the outgoing data
59 buffer and marks the packet ready to be sent to network. However, If
60 argument force_send is TRUE the packet is sent immediately and not put
61 to queue. Normal case is that the packet is not sent immediately. */
63 void silc_server_packet_send(SilcServer server,
64 SilcSocketConnection sock,
66 SilcPacketFlags flags,
68 unsigned int data_len,
72 SilcIdType dst_id_type = SILC_ID_NONE;
77 /* Get data used in the packet sending, keys and stuff */
79 case SILC_SOCKET_TYPE_CLIENT:
80 dst_id = ((SilcClientEntry)sock->user_data)->id;
81 dst_id_type = SILC_ID_CLIENT;
83 case SILC_SOCKET_TYPE_SERVER:
84 case SILC_SOCKET_TYPE_ROUTER:
85 dst_id = ((SilcServerEntry)sock->user_data)->id;
86 dst_id_type = SILC_ID_SERVER;
92 silc_server_packet_send_dest(server, sock, type, flags, dst_id,
93 dst_id_type, data, data_len, force_send);
96 /* Assembles a new packet to be sent out to network. This doesn't actually
97 send the packet but creates the packet and fills the outgoing data
98 buffer and marks the packet ready to be sent to network. However, If
99 argument force_send is TRUE the packet is sent immediately and not put
100 to queue. Normal case is that the packet is not sent immediately.
101 Destination information is sent as argument for this function. */
103 void silc_server_packet_send_dest(SilcServer server,
104 SilcSocketConnection sock,
106 SilcPacketFlags flags,
108 SilcIdType dst_id_type,
110 unsigned int data_len,
113 SilcPacketContext packetdata;
114 SilcIDListData idata;
115 SilcCipher cipher = NULL;
116 SilcHmac hmac = NULL;
117 unsigned char *dst_id_data = NULL;
118 unsigned int dst_id_len = 0;
120 SILC_LOG_DEBUG(("Sending packet, type %d", type));
122 /* Get data used in the packet sending, keys and stuff */
123 idata = (SilcIDListData)sock->user_data;
126 dst_id_data = silc_id_id2str(dst_id, dst_id_type);
127 dst_id_len = silc_id_get_len(dst_id_type);
130 /* Set the packet context pointers */
131 packetdata.type = type;
132 packetdata.flags = flags;
133 packetdata.src_id = silc_id_id2str(server->id, server->id_type);
134 packetdata.src_id_len = SILC_ID_SERVER_LEN;
135 packetdata.src_id_type = server->id_type;
136 packetdata.dst_id = dst_id_data;
137 packetdata.dst_id_len = dst_id_len;
138 packetdata.dst_id_type = dst_id_type;
139 packetdata.truelen = data_len + SILC_PACKET_HEADER_LEN +
140 packetdata.src_id_len + dst_id_len;
141 packetdata.padlen = SILC_PACKET_PADLEN(packetdata.truelen);
142 packetdata.rng = server->rng;
144 /* Prepare outgoing data buffer for packet sending */
145 silc_packet_send_prepare(sock,
146 SILC_PACKET_HEADER_LEN +
147 packetdata.src_id_len +
148 packetdata.dst_id_len,
152 SILC_LOG_DEBUG(("Putting data to outgoing buffer, len %d", data_len));
154 packetdata.buffer = sock->outbuf;
156 /* Put the data to the buffer */
157 if (data && data_len)
158 silc_buffer_put(sock->outbuf, data, data_len);
160 /* Create the outgoing packet */
161 silc_packet_assemble(&packetdata);
164 cipher = idata->send_key;
168 /* Encrypt the packet */
169 silc_packet_encrypt(cipher, hmac, sock->outbuf, sock->outbuf->len);
171 SILC_LOG_HEXDUMP(("Outgoing packet, len %d", sock->outbuf->len),
172 sock->outbuf->data, sock->outbuf->len);
174 /* Now actually send the packet */
175 silc_server_packet_send_real(server, sock, force_send);
177 if (packetdata.src_id)
178 silc_free(packetdata.src_id);
179 if (packetdata.dst_id)
180 silc_free(packetdata.dst_id);
183 /* Broadcast received packet to our primary route. This function is used
184 by router to further route received broadcast packet. It is expected
185 that the broadcast flag from the packet is checked before calling this
186 function. This does not test or set the broadcast flag. */
188 void silc_server_packet_broadcast(SilcServer server,
189 SilcSocketConnection sock,
190 SilcPacketContext *packet)
192 SilcBuffer buffer = packet->buffer;
193 SilcIDListData idata;
196 SILC_LOG_DEBUG(("Broadcasting received broadcast packet"));
198 /* If the packet is originated from our primary route we are
199 not allowed to send the packet. */
200 id = silc_id_str2id(packet->src_id, packet->src_id_type);
201 if (id && SILC_ID_SERVER_COMPARE(id, server->router->id)) {
202 idata = (SilcIDListData)sock->user_data;
204 silc_buffer_push(buffer, buffer->data - buffer->head);
205 silc_packet_send_prepare(sock, 0, 0, buffer->len);
206 silc_buffer_put(sock->outbuf, buffer->data, buffer->len);
207 silc_packet_encrypt(idata->send_key, idata->hmac,
208 sock->outbuf, sock->outbuf->len);
210 SILC_LOG_HEXDUMP(("Broadcasted packet, len %d", sock->outbuf->len),
211 sock->outbuf->data, sock->outbuf->len);
213 /* Now actually send the packet */
214 silc_server_packet_send_real(server, sock, TRUE);
219 SILC_LOG_DEBUG(("Will not broadcast to primary route since it is the "
220 "original sender of this packet"));
224 /* Routes received packet to `sock'. This is used to route the packets that
225 router receives but are not destined to it. */
227 void silc_server_packet_route(SilcServer server,
228 SilcSocketConnection sock,
229 SilcPacketContext *packet)
231 SilcBuffer buffer = packet->buffer;
232 SilcIDListData idata;
234 SILC_LOG_DEBUG(("Routing received packet"));
236 idata = (SilcIDListData)sock->user_data;
238 silc_buffer_push(buffer, buffer->data - buffer->head);
239 silc_packet_send_prepare(sock, 0, 0, buffer->len);
240 silc_buffer_put(sock->outbuf, buffer->data, buffer->len);
241 silc_packet_encrypt(idata->send_key, idata->hmac,
242 sock->outbuf, sock->outbuf->len);
244 SILC_LOG_HEXDUMP(("Routed packet, len %d", sock->outbuf->len),
245 sock->outbuf->data, sock->outbuf->len);
247 /* Now actually send the packet */
248 silc_server_packet_send_real(server, sock, TRUE);
251 /* Internal routine to actually create the channel packet and send it
252 to network. This is common function in channel message sending. If
253 `channel_message' is TRUE this encrypts the message as it is strictly
254 a channel message. If FALSE normal encryption process is used. */
257 silc_server_packet_send_to_channel_real(SilcServer server,
258 SilcSocketConnection sock,
259 SilcPacketContext *packet,
263 unsigned int data_len,
267 packet->truelen = data_len + SILC_PACKET_HEADER_LEN +
268 packet->src_id_len + packet->dst_id_len;
270 /* Prepare outgoing data buffer for packet sending */
271 silc_packet_send_prepare(sock,
272 SILC_PACKET_HEADER_LEN +
278 packet->buffer = sock->outbuf;
280 /* Put the data to buffer, assemble and encrypt the packet. The packet
281 is encrypted with normal session key shared with the client. */
282 silc_buffer_put(sock->outbuf, data, data_len);
283 silc_packet_assemble(packet);
285 silc_packet_encrypt(cipher, hmac, sock->outbuf, SILC_PACKET_HEADER_LEN +
286 packet->src_id_len + packet->dst_id_len +
289 silc_packet_encrypt(cipher, hmac, sock->outbuf, sock->outbuf->len);
291 SILC_LOG_HEXDUMP(("Channel packet, len %d", sock->outbuf->len),
292 sock->outbuf->data, sock->outbuf->len);
294 /* Now actually send the packet */
295 silc_server_packet_send_real(server, sock, force_send);
298 /* This routine is used by the server to send packets to channel. The
299 packet sent with this function is distributed to all clients on
300 the channel. Usually this is used to send notify messages to the
301 channel, things like notify about new user joining to the channel.
302 If `route' is FALSE then the packet is sent only locally and will not
303 be routed anywhere (for router locally means cell wide). */
305 void silc_server_packet_send_to_channel(SilcServer server,
306 SilcChannelEntry channel,
310 unsigned int data_len,
313 SilcSocketConnection sock = NULL;
314 SilcPacketContext packetdata;
315 SilcClientEntry client = NULL;
316 SilcServerEntry *routed = NULL;
317 SilcChannelClientEntry chl;
318 SilcIDListData idata;
319 unsigned int routed_count = 0;
321 /* This doesn't send channel message packets */
322 if (type == SILC_PACKET_CHANNEL_MESSAGE)
325 SILC_LOG_DEBUG(("Sending packet to channel"));
327 /* Set the packet context pointers. */
328 packetdata.flags = 0;
329 packetdata.type = type;
330 packetdata.src_id = silc_id_id2str(server->id, SILC_ID_SERVER);
331 packetdata.src_id_len = SILC_ID_SERVER_LEN;
332 packetdata.src_id_type = SILC_ID_SERVER;
333 packetdata.dst_id = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
334 packetdata.dst_id_len = SILC_ID_CHANNEL_LEN;
335 packetdata.dst_id_type = SILC_ID_CHANNEL;
336 packetdata.rng = server->rng;
337 packetdata.truelen = data_len + SILC_PACKET_HEADER_LEN +
338 packetdata.src_id_len + packetdata.dst_id_len;
339 packetdata.padlen = SILC_PACKET_PADLEN(packetdata.truelen);
341 /* If there are global users in the channel we will send the message
342 first to our router for further routing. */
343 if (route && server->server_type == SILC_SERVER && !server->standalone &&
344 channel->global_users) {
345 SilcServerEntry router;
347 /* Get data used in packet header encryption, keys and stuff. */
348 router = server->router;
349 sock = (SilcSocketConnection)router->connection;
350 idata = (SilcIDListData)router;
352 SILC_LOG_DEBUG(("Sending channel message to router for routing"));
354 silc_server_packet_send_to_channel_real(server, sock, &packetdata,
355 idata->send_key, idata->hmac,
356 data, data_len, FALSE, force_send);
359 /* Send the message to clients on the channel's client list. */
360 silc_list_start(channel->user_list);
361 while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
362 client = chl->client;
364 /* If client has router set it is not locally connected client and
365 we will route the message to the router set in the client. Though,
366 send locally connected server in all cases. */
367 if (server->server_type == SILC_ROUTER && client && client->router &&
368 ((!route && client->router->router == server->id_entry) || route)) {
371 /* Check if we have sent the packet to this route already */
372 for (k = 0; k < routed_count; k++)
373 if (routed[k] == client->router)
375 if (k < routed_count)
378 /* Get data used in packet header encryption, keys and stuff. */
379 sock = (SilcSocketConnection)client->router->connection;
380 idata = (SilcIDListData)client->router;
382 /* Send the packet */
383 silc_server_packet_send_to_channel_real(server, sock, &packetdata,
384 idata->send_key, idata->hmac,
385 data, data_len, FALSE,
388 /* We want to make sure that the packet is routed to same router
389 only once. Mark this route as sent route. */
391 routed = silc_realloc(routed, sizeof(*routed) * (k + 1));
392 routed[k] = client->router;
398 if (server->server_type == SILC_ROUTER && !route)
401 if (server->server_type == SILC_SERVER && client->router)
404 /* Send to locally connected client */
407 /* Get data used in packet header encryption, keys and stuff. */
408 sock = (SilcSocketConnection)client->connection;
409 idata = (SilcIDListData)client;
411 /* Send the packet */
412 silc_server_packet_send_to_channel_real(server, sock, &packetdata,
413 idata->send_key, idata->hmac,
414 data, data_len, FALSE,
421 silc_free(packetdata.src_id);
422 silc_free(packetdata.dst_id);
425 /* This routine is explicitly used to relay messages to some channel.
426 Packets sent with this function we have received earlier and are
427 totally encrypted. This just sends the packet to all clients on
428 the channel. If the sender of the packet is someone on the channel
429 the message will not be sent to that client. The SILC Packet header
430 is encrypted with the session key shared between us and the client.
431 MAC is also computed before encrypting the header. Rest of the
432 packet will be untouched. */
434 void silc_server_packet_relay_to_channel(SilcServer server,
435 SilcSocketConnection sender_sock,
436 SilcChannelEntry channel,
438 SilcIdType sender_type,
440 unsigned int data_len,
444 SilcSocketConnection sock = NULL;
445 SilcPacketContext packetdata;
446 SilcClientEntry client = NULL;
447 SilcServerEntry *routed = NULL;
448 SilcChannelClientEntry chl;
449 unsigned int routed_count = 0;
450 SilcIDListData idata;
452 SILC_LOG_DEBUG(("Relaying packet to channel"));
454 /* Set the packet context pointers. */
455 packetdata.flags = 0;
456 packetdata.type = SILC_PACKET_CHANNEL_MESSAGE;
457 packetdata.src_id = silc_id_id2str(sender, sender_type);
458 packetdata.src_id_len = silc_id_get_len(sender_type);
459 packetdata.src_id_type = sender_type;
460 packetdata.dst_id = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
461 packetdata.dst_id_len = SILC_ID_CHANNEL_LEN;
462 packetdata.dst_id_type = SILC_ID_CHANNEL;
463 packetdata.rng = server->rng;
464 packetdata.padlen = SILC_PACKET_PADLEN((SILC_PACKET_HEADER_LEN +
465 packetdata.src_id_len +
466 packetdata.dst_id_len));
468 /* If there are global users in the channel we will send the message
469 first to our router for further routing. */
470 if (server->server_type == SILC_SERVER && !server->standalone &&
471 channel->global_users) {
472 SilcServerEntry router;
474 router = server->router;
476 /* Check that the sender is not our router. */
477 if (sender_sock != (SilcSocketConnection)router->connection) {
479 /* Get data used in packet header encryption, keys and stuff. */
480 sock = (SilcSocketConnection)router->connection;
481 idata = (SilcIDListData)router;
483 SILC_LOG_DEBUG(("Sending channel message to router for routing"));
485 silc_server_packet_send_to_channel_real(server, sock, &packetdata,
486 idata->send_key, idata->hmac,
487 data, data_len, TRUE,
492 /* Send the message to clients on the channel's client list. */
493 silc_list_start(channel->user_list);
494 while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
495 client = chl->client;
499 /* If sender is one on the channel do not send it the packet. */
500 if (!found && !SILC_ID_CLIENT_COMPARE(client->id, sender)) {
505 /* If the client has set router it means that it is not locally
506 connected client and we will route the packet further. */
507 if (server->server_type == SILC_ROUTER && client->router) {
510 /* Sender maybe server as well so we want to make sure that
511 we won't send the message to the server it came from. */
512 if (!found && !SILC_ID_SERVER_COMPARE(client->router->id, sender)) {
517 /* Check if we have sent the packet to this route already */
518 for (k = 0; k < routed_count; k++)
519 if (routed[k] == client->router)
521 if (k < routed_count)
524 /* Get data used in packet header encryption, keys and stuff. */
525 sock = (SilcSocketConnection)client->router->connection;
526 idata = (SilcIDListData)client->router;
528 /* Send the packet */
529 silc_server_packet_send_to_channel_real(server, sock, &packetdata,
530 idata->send_key, idata->hmac,
531 data, data_len, TRUE,
534 /* We want to make sure that the packet is routed to same router
535 only once. Mark this route as sent route. */
537 routed = silc_realloc(routed, sizeof(*routed) * (k + 1));
538 routed[k] = client->router;
544 if (server->server_type == SILC_SERVER && client->router)
547 /* Get data used in packet header encryption, keys and stuff. */
548 sock = (SilcSocketConnection)client->connection;
549 idata = (SilcIDListData)client;
551 SILC_LOG_DEBUG(("Sending packet to client %s (%s)",
552 sock->hostname, sock->ip));
554 /* Send the packet */
555 silc_server_packet_send_to_channel_real(server, sock, &packetdata,
556 idata->send_key, idata->hmac,
557 data, data_len, TRUE,
562 silc_free(packetdata.src_id);
563 silc_free(packetdata.dst_id);
566 /* This function is used to send packets strictly to all local clients
567 on a particular channel. This is used for example to distribute new
568 channel key to all our locally connected clients on the channel.
569 The packets are always encrypted with the session key shared between
570 the client, this means these are not _to the channel_ but _to the client_
573 void silc_server_packet_send_local_channel(SilcServer server,
574 SilcChannelEntry channel,
576 SilcPacketFlags flags,
578 unsigned int data_len,
581 SilcChannelClientEntry chl;
582 SilcSocketConnection sock = NULL;
584 SILC_LOG_DEBUG(("Start"));
586 /* Send the message to clients on the channel's client list. */
587 silc_list_start(channel->user_list);
588 while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
590 sock = (SilcSocketConnection)chl->client->connection;
592 /* Send the packet to the client */
593 silc_server_packet_send_dest(server, sock, type, flags, chl->client->id,
594 SILC_ID_CLIENT, data, data_len,
600 /* Routine used to send (relay, route) private messages to some destination.
601 If the private message key does not exist then the message is re-encrypted,
602 otherwise we just pass it along. This really is not used to send new
603 private messages (as server does not send them) but to relay received
606 void silc_server_send_private_message(SilcServer server,
607 SilcSocketConnection dst_sock,
610 SilcPacketContext *packet)
612 SilcBuffer buffer = packet->buffer;
614 /* Send and re-encrypt if private messge key does not exist */
615 if ((packet->flags & SILC_PACKET_FLAG_PRIVMSG_KEY) == FALSE) {
617 silc_buffer_push(buffer, SILC_PACKET_HEADER_LEN + packet->src_id_len
618 + packet->dst_id_len + packet->padlen);
619 silc_packet_send_prepare(dst_sock, 0, 0, buffer->len);
620 silc_buffer_put(dst_sock->outbuf, buffer->data, buffer->len);
622 /* Re-encrypt packet */
623 silc_packet_encrypt(cipher, hmac, dst_sock->outbuf, buffer->len);
625 /* Send the packet */
626 silc_server_packet_send_real(server, dst_sock, FALSE);
629 /* Key exist so just send it */
630 silc_buffer_push(buffer, SILC_PACKET_HEADER_LEN + packet->src_id_len
631 + packet->dst_id_len + packet->padlen);
632 silc_packet_send_prepare(dst_sock, 0, 0, buffer->len);
633 silc_buffer_put(dst_sock->outbuf, buffer->data, buffer->len);
634 silc_server_packet_send_real(server, dst_sock, FALSE);
638 /* Sends current motd to client */
640 void silc_server_send_motd(SilcServer server,
641 SilcSocketConnection sock)
646 if (server->config && server->config->motd &&
647 server->config->motd->motd_file) {
649 motd = silc_file_read(server->config->motd->motd_file, &motd_len);
653 silc_server_send_notify(server, sock, SILC_NOTIFY_TYPE_MOTD, 1,
659 /* Sends error message. Error messages may or may not have any
662 void silc_server_send_error(SilcServer server,
663 SilcSocketConnection sock,
664 const char *fmt, ...)
667 unsigned char buf[4096];
669 memset(buf, 0, sizeof(buf));
671 vsprintf(buf, fmt, ap);
674 silc_server_packet_send(server, sock, SILC_PACKET_ERROR, 0,
675 buf, strlen(buf), FALSE);
678 /* Sends notify message. If format is TRUE the variable arguments are
679 formatted and the formatted string is sent as argument payload. If it is
680 FALSE then each argument is sent as separate argument and their format
681 in the argument list must be { argument data, argument length }. */
683 void silc_server_send_notify(SilcServer server,
684 SilcSocketConnection sock,
686 unsigned int argc, ...)
693 packet = silc_notify_payload_encode(type, argc, ap);
694 silc_server_packet_send(server, sock, SILC_PACKET_NOTIFY, 0,
695 packet->data, packet->len, FALSE);
696 silc_buffer_free(packet);
699 /* Sends notify message destined to specific entity. */
701 void silc_server_send_notify_dest(SilcServer server,
702 SilcSocketConnection sock,
704 SilcIdType dest_id_type,
706 unsigned int argc, ...)
713 packet = silc_notify_payload_encode(type, argc, ap);
714 silc_server_packet_send_dest(server, sock, SILC_PACKET_NOTIFY, 0,
715 dest_id, dest_id_type,
716 packet->data, packet->len, FALSE);
717 silc_buffer_free(packet);
720 /* Sends notify message to a channel. The notify message sent is
721 distributed to all clients on the channel. If `router_notify' is TRUE
722 then the notify may be routed to primary route or to some other routers.
723 If FALSE it is assured that the notify is sent only locally. */
725 void silc_server_send_notify_to_channel(SilcServer server,
726 SilcChannelEntry channel,
727 unsigned char route_notify,
729 unsigned int argc, ...)
736 packet = silc_notify_payload_encode(type, argc, ap);
737 silc_server_packet_send_to_channel(server, channel,
738 SILC_PACKET_NOTIFY, route_notify,
739 packet->data, packet->len, FALSE);
740 silc_buffer_free(packet);
743 /* Send notify message to all clients the client has joined. It is quaranteed
744 that the message is sent only once to a client (ie. if a client is joined
745 on two same channel it will receive only one notify message). Also, this
746 sends only to local clients (locally connected if we are server, and to
747 local servers if we are router). */
749 void silc_server_send_notify_on_channels(SilcServer server,
750 SilcClientEntry client,
752 unsigned int argc, ...)
755 SilcSocketConnection sock = NULL;
756 SilcPacketContext packetdata;
758 SilcClientEntry *sent_clients = NULL;
759 unsigned int sent_clients_count = 0;
760 SilcServerEntry *routed = NULL;
761 unsigned int routed_count = 0;
762 SilcChannelEntry channel;
763 SilcChannelClientEntry chl, chl2;
764 SilcIDListData idata;
767 unsigned int data_len;
768 int force_send = FALSE;
771 SILC_LOG_DEBUG(("Start"));
773 if (!silc_list_count(client->channels))
777 packet = silc_notify_payload_encode(type, argc, ap);
779 data_len = packet->len;
781 /* Set the packet context pointers. */
782 packetdata.flags = 0;
783 packetdata.type = SILC_PACKET_NOTIFY;
784 packetdata.src_id = silc_id_id2str(server->id, SILC_ID_SERVER);
785 packetdata.src_id_len = SILC_ID_SERVER_LEN;
786 packetdata.src_id_type = SILC_ID_SERVER;
787 packetdata.rng = server->rng;
789 silc_list_start(client->channels);
790 while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
791 channel = chl->channel;
793 /* Send the message to all clients on the channel's client list. */
794 silc_list_start(channel->user_list);
795 while ((chl2 = silc_list_get(channel->user_list)) != SILC_LIST_END) {
798 /* Check if we have sent the packet to this client already */
799 for (k = 0; k < sent_clients_count; k++)
800 if (sent_clients[k] == c)
802 if (k < sent_clients_count)
805 /* If we are router and if this client has router set it is not
806 locally connected client and we will route the message to the
807 router set in the client. */
808 if (c && c->router && server->server_type == SILC_ROUTER) {
809 /* Check if we have sent the packet to this route already */
810 for (k = 0; k < routed_count; k++)
811 if (routed[k] == c->router)
813 if (k < routed_count)
816 /* Get data used in packet header encryption, keys and stuff. */
817 sock = (SilcSocketConnection)c->router->connection;
818 idata = (SilcIDListData)c->router;
820 packetdata.dst_id = silc_id_id2str(c->router->id, SILC_ID_SERVER);
821 packetdata.dst_id_len = SILC_ID_SERVER_LEN;
822 packetdata.dst_id_type = SILC_ID_SERVER;
823 packetdata.truelen = data_len + SILC_PACKET_HEADER_LEN +
824 packetdata.src_id_len + packetdata.dst_id_len;
825 packetdata.padlen = SILC_PACKET_PADLEN(packetdata.truelen);
827 /* Send the packet */
828 silc_server_packet_send_to_channel_real(server, sock, &packetdata,
829 idata->send_key, idata->hmac,
830 data, data_len, FALSE,
833 silc_free(packetdata.dst_id);
835 /* We want to make sure that the packet is routed to same router
836 only once. Mark this route as sent route. */
838 routed = silc_realloc(routed, sizeof(*routed) * (k + 1));
839 routed[k] = c->router;
845 if (server->server_type == SILC_SERVER && client->router)
848 /* Send to locally connected client */
851 /* Get data used in packet header encryption, keys and stuff. */
852 sock = (SilcSocketConnection)c->connection;
853 idata = (SilcIDListData)c;
855 packetdata.dst_id = silc_id_id2str(c->id, SILC_ID_CLIENT);
856 packetdata.dst_id_len = SILC_ID_CLIENT_LEN;
857 packetdata.dst_id_type = SILC_ID_CLIENT;
858 packetdata.truelen = data_len + SILC_PACKET_HEADER_LEN +
859 packetdata.src_id_len + packetdata.dst_id_len;
860 packetdata.padlen = SILC_PACKET_PADLEN(packetdata.truelen);
862 /* Send the packet */
863 silc_server_packet_send_to_channel_real(server, sock, &packetdata,
864 idata->send_key, idata->hmac,
865 data, data_len, FALSE,
868 silc_free(packetdata.dst_id);
870 /* Make sure that we send the notify only once per client. */
871 sent_clients = silc_realloc(sent_clients, sizeof(*sent_clients) *
872 (sent_clients_count + 1));
873 sent_clients[sent_clients_count] = c;
874 sent_clients_count++;
881 if (sent_clients_count)
882 silc_free(sent_clients);
883 silc_free(packetdata.src_id);
886 /* Sends New ID Payload to remote end. The packet is used to distribute
887 information about new registered clients, servers, channel etc. usually
888 to routers so that they can keep these information up to date.
889 If the argument `broadcast' is TRUE then the packet is sent as
892 void silc_server_send_new_id(SilcServer server,
893 SilcSocketConnection sock,
895 void *id, SilcIdType id_type,
900 SILC_LOG_DEBUG(("Start"));
902 idp = silc_id_payload_encode(id, id_type);
903 silc_server_packet_send(server, sock, SILC_PACKET_NEW_ID,
904 broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
905 idp->data, idp->len, FALSE);
906 silc_buffer_free(idp);
909 /* Sends Replace ID payload to remote end. This is used to replace old
910 ID with new ID sent in the packet. This is called for example when
911 user changes nickname and we create new ID for the user. If the
912 argument `broadcast' is TRUE then the packet is sent as
914 /* XXX It would be expected that the new id is same type as the old
917 void silc_server_send_replace_id(SilcServer server,
918 SilcSocketConnection sock,
920 void *old_id, SilcIdType old_id_type,
921 unsigned int old_id_len,
922 void *new_id, SilcIdType new_id_type,
923 unsigned int new_id_len)
929 SILC_LOG_DEBUG(("Start"));
931 oid = silc_id_id2str(old_id, old_id_type);
935 nid = silc_id_id2str(new_id, new_id_type);
939 packet = silc_buffer_alloc(2 + 2 + 2 + 2 + old_id_len + new_id_len);
940 silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
941 silc_buffer_format(packet,
942 SILC_STR_UI_SHORT(old_id_type),
943 SILC_STR_UI_SHORT(old_id_len),
944 SILC_STR_UI_XNSTRING(oid, old_id_len),
945 SILC_STR_UI_SHORT(new_id_type),
946 SILC_STR_UI_SHORT(new_id_len),
947 SILC_STR_UI_XNSTRING(nid, new_id_len),
950 silc_server_packet_send(server, sock, SILC_PACKET_REPLACE_ID,
951 broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
952 packet->data, packet->len, FALSE);
955 silc_buffer_free(packet);
958 /* This function is used to send Remove Channel User payload. This may sent
959 by server but is usually used only by router to notify other routers that
960 user has left a channel. Normal server sends this packet to its router
961 to notify that the router should not hold a record about this client
962 on a channel anymore. Router distributes it further to other routers. */
964 void silc_server_send_remove_channel_user(SilcServer server,
965 SilcSocketConnection sock,
967 void *client_id, void *channel_id)
970 unsigned char *clid, *chid;
972 SILC_LOG_DEBUG(("Start"));
974 clid = silc_id_id2str(client_id, SILC_ID_CLIENT);
978 chid = silc_id_id2str(channel_id, SILC_ID_CHANNEL);
982 packet = silc_buffer_alloc(2 + 2 + SILC_ID_CLIENT_LEN + SILC_ID_CHANNEL_LEN);
983 silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
984 silc_buffer_format(packet,
985 SILC_STR_UI_SHORT(SILC_ID_CLIENT_LEN),
986 SILC_STR_UI_XNSTRING(clid, SILC_ID_CLIENT_LEN),
987 SILC_STR_UI_SHORT(SILC_ID_CHANNEL_LEN),
988 SILC_STR_UI_XNSTRING(chid, SILC_ID_CHANNEL_LEN),
991 silc_server_packet_send(server, sock, SILC_PACKET_REMOVE_CHANNEL_USER,
992 broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
993 packet->data, packet->len, FALSE);
996 silc_buffer_free(packet);
999 /* Send New Channel Payload to notify about newly created channel in the
1000 SILC network. Normal server nevers sends this packet. Router uses this
1001 to notify other routers in the network about new channel. This packet
1004 void silc_server_send_new_channel(SilcServer server,
1005 SilcSocketConnection sock,
1009 unsigned int channel_id_len)
1013 unsigned int name_len = strlen(channel_name);
1015 SILC_LOG_DEBUG(("Start"));
1017 cid = silc_id_id2str(channel_id, SILC_ID_CHANNEL);
1021 packet = silc_buffer_alloc(2 + 2 + name_len + channel_id_len);
1022 silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
1023 silc_buffer_format(packet,
1024 SILC_STR_UI_SHORT(name_len),
1025 SILC_STR_UI_XNSTRING(channel_name, name_len),
1026 SILC_STR_UI_SHORT(channel_id_len),
1027 SILC_STR_UI_XNSTRING(cid, channel_id_len),
1030 silc_server_packet_send(server, sock, SILC_PACKET_NEW_CHANNEL,
1031 broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
1032 packet->data, packet->len, FALSE);
1035 silc_buffer_free(packet);
1038 /* Send New Channel User payload to notify routers in the network about new
1039 user on the channel. The packet is may be broadcasted. Normal server
1040 can send this but must not receive. Router can send and receive it. */
1042 void silc_server_send_new_channel_user(SilcServer server,
1043 SilcSocketConnection sock,
1046 unsigned int channel_id_len,
1048 unsigned int client_id_len)
1051 unsigned char *clid, *chid;
1053 SILC_LOG_DEBUG(("Start"));
1055 chid = silc_id_id2str(channel_id, SILC_ID_CHANNEL);
1059 clid = silc_id_id2str(client_id, SILC_ID_CLIENT);
1063 packet = silc_buffer_alloc(2 + 2 + channel_id_len + client_id_len);
1064 silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
1065 silc_buffer_format(packet,
1066 SILC_STR_UI_SHORT(channel_id_len),
1067 SILC_STR_UI_XNSTRING(chid, channel_id_len),
1068 SILC_STR_UI_SHORT(client_id_len),
1069 SILC_STR_UI_XNSTRING(clid, client_id_len),
1072 silc_server_packet_send(server, sock, SILC_PACKET_NEW_CHANNEL_USER,
1073 broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
1074 packet->data, packet->len, FALSE);
1077 silc_buffer_free(packet);
1080 /* Send Channel Key payload to distribute the new channel key. Normal server
1081 sends this to router when new client joins to existing channel. Router
1082 sends this to the local server who sent the join command in case where
1083 the channel did not exist yet. Both normal and router servers uses this
1084 also to send this to locally connected clients on the channel. This
1085 must not be broadcasted packet. Routers do not send this to each other. */
1087 void silc_server_send_channel_key(SilcServer server,
1088 SilcChannelEntry channel,
1089 unsigned char route)
1092 unsigned char *chid;
1093 unsigned int tmp_len;
1095 SILC_LOG_DEBUG(("Start"));
1097 chid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
1101 /* Encode channel key packet */
1102 tmp_len = strlen(channel->channel_key->cipher->name);
1103 packet = silc_channel_key_payload_encode(SILC_ID_CHANNEL_LEN, chid, tmp_len,
1104 channel->channel_key->cipher->name,
1105 channel->key_len / 8, channel->key);
1107 silc_server_packet_send_to_channel(server, channel, SILC_PACKET_CHANNEL_KEY,
1108 route, packet->data, packet->len, FALSE);
1109 silc_buffer_free(packet);
1113 /* Generic function to send any command. The arguments must be sent already
1114 encoded into correct form in correct order. */
1116 void silc_server_send_command(SilcServer server,
1117 SilcSocketConnection sock,
1118 SilcCommand command,
1119 unsigned int argc, ...)
1126 packet = silc_command_payload_encode_vap(command, 0, argc, ap);
1127 silc_server_packet_send(server, sock, SILC_PACKET_COMMAND, 0,
1128 packet->data, packet->len, TRUE);
1129 silc_buffer_free(packet);
1132 /* Function used to send REMOVE_ID packet. The packet is used to notify
1133 routers that certain ID should be removed. After that the ID will become
1134 invalid. If the argument `broadcast' is TRUE then the packet is sent as
1135 broadcast packet. */
1137 void silc_server_send_remove_id(SilcServer server,
1138 SilcSocketConnection sock,
1140 void *id, unsigned int id_len,
1145 SILC_LOG_DEBUG(("Start"));
1147 idp = silc_id_payload_encode(id, id_type);
1148 silc_server_packet_send(server, sock, SILC_PACKET_REMOVE_ID,
1149 broadcast ? SILC_PACKET_FLAG_BROADCAST : 0,
1150 idp->data, idp->len, FALSE);
1151 silc_buffer_free(idp);