SILC_LOG_DEBUG(("End of stream received, sock %p", stream));
- if (!idata)
- return;
-
if (server->router_conn && server->router_conn->sock == stream &&
!server->router && server->standalone) {
- if (idata->sconn && idata->sconn->callback)
+ if (idata && idata->sconn && idata->sconn->callback)
(*idata->sconn->callback)(server, NULL, idata->sconn->callback_context);
silc_server_create_connections(server);
silc_server_free_sock_user_data(server, stream, NULL);
} else {
/* If backup disconnected then mark that resuming will not be allowed */
- if (server->server_type == SILC_ROUTER && !server->backup_router &&
+ if (idata &&
+ server->server_type == SILC_ROUTER && !server->backup_router &&
idata->conn_type == SILC_CONN_SERVER) {
SilcServerEntry server_entry = (SilcServerEntry)idata;
if (server_entry->server_type == SILC_BACKUP_ROUTER)
server->backup_closed = TRUE;
}
- if (idata->sconn && idata->sconn->callback)
+ if (idata && idata->sconn && idata->sconn->callback)
(*idata->sconn->callback)(server, NULL, idata->sconn->callback_context);
silc_server_free_sock_user_data(server, stream, NULL);
}
silc_server_free_sock_user_data(server, stream, NULL);
} else {
/* If backup disconnected then mark that resuming will not be allowed */
- if (server->server_type == SILC_ROUTER && !server->backup_router &&
- idata->conn_type == SILC_CONN_SERVER) {
+ if (server->server_type == SILC_ROUTER && !server->backup_router &&
+ idata->conn_type == SILC_CONN_SERVER) {
SilcServerEntry server_entry = (SilcServerEntry)idata;
if (server_entry->server_type == SILC_BACKUP_ROUTER)
server->backup_closed = TRUE;
case SILC_PACKET_KEY_AGREEMENT:
/*
- * Received heartbeat.
+ * Received key agreement.
*/
if (packet->flags & SILC_PACKET_FLAG_LIST)
break;
param->qos_rate_limit, param->qos_bytes_limit,
param->qos_limit_sec, param->qos_limit_usec);
+ /* Perform heartbeat */
+ if (param->keepalive_secs) {
+ SILC_LOG_DEBUG(("Perform heartbeat every %d seconds",
+ param->keepalive_secs));
+ silc_schedule_task_add_timeout(server->schedule, silc_server_do_heartbeat,
+ sock, param->keepalive_secs, 0);
+ }
+
silc_server_config_unref(&entry->cconfig);
silc_server_config_unref(&entry->sconfig);
silc_server_config_unref(&entry->rconfig);
entry->op = silc_ske_responder(ske, packet_stream, ¶ms);
}
+/* Perform heartbeat */
+
+SILC_TASK_CALLBACK(silc_server_do_heartbeat)
+{
+ SilcServer server = app_context;
+ SilcPacketStream sock = context;
+ silc_server_send_heartbeat(server, sock);
+}
+
/********************************** Rekey ***********************************/
silc_schedule_task_del_by_all(server->schedule, 0, silc_server_do_rekey,
sock);
+ silc_schedule_task_del_by_all(server->schedule, 0, silc_server_do_heartbeat,
+ sock);
/* Cancel active protocols */
if (idata) {