- if (idata) {
- cipher = idata->send_key;
- hmac = idata->hmac_send;
- sequence = idata->psn_send++;
- block_len = silc_cipher_get_block_len(cipher);
-
- /* Check for mandatory rekey */
- if (sequence == SILC_SERVER_REKEY_THRESHOLD)
- silc_schedule_task_add(server->schedule, sock->sock,
- silc_server_rekey_callback, sock, 0, 1,
- SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
- }
-
- if (dst_id) {
- dst_id_data = silc_id_id2str(dst_id, dst_id_type);
- dst_id_len = silc_id_get_len(dst_id, dst_id_type);
- }
-
- if (src_id) {
- src_id_data = silc_id_id2str(src_id, src_id_type);
- src_id_len = silc_id_get_len(src_id, src_id_type);
- }
-
- /* Set the packet context pointers */
- packetdata.type = type;
- packetdata.flags = flags;
- packetdata.src_id = src_id_data;
- packetdata.src_id_len = src_id_len;
- packetdata.src_id_type = src_id_type;
- packetdata.dst_id = dst_id_data;
- packetdata.dst_id_len = dst_id_len;
- packetdata.dst_id_type = dst_id_type;
- data_len = SILC_PACKET_DATALEN(data_len, (SILC_PACKET_HEADER_LEN +
- packetdata.src_id_len +
- dst_id_len));
- packetdata.truelen = data_len + SILC_PACKET_HEADER_LEN +
- packetdata.src_id_len + dst_id_len;
- SILC_PACKET_PADLEN(packetdata.truelen, block_len, packetdata.padlen);
-
- /* Create the outgoing packet */
- if (!silc_packet_assemble(&packetdata, NULL, cipher, hmac, sock, data,
- data_len, (const SilcBuffer)&packet)) {
- SILC_LOG_ERROR(("Cannot assemble packe"));
- goto out;
- }
-
- /* Encrypt the packet */
- silc_packet_encrypt(cipher, hmac, sequence, (SilcBuffer)&packet, packet.len);
-
- SILC_LOG_HEXDUMP(("Outgoing packet (%d), len %d", sequence, packet.len),
- packet.data, packet.len);
-
- /* Now actually send the packet */
- silc_server_packet_send_real(server, sock, force_send);