projects
/
silc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Added preliminary backup router support for standalone routers.
[silc.git]
/
apps
/
silcd
/
server_backup.c
diff --git
a/apps/silcd/server_backup.c
b/apps/silcd/server_backup.c
index 70322dd93b4ebfff4de2af22809369cf73f82cd1..299f1eee1b681e8700a27aaf2d3338f0d6b64786 100644
(file)
--- a/
apps/silcd/server_backup.c
+++ b/
apps/silcd/server_backup.c
@@
-125,8
+125,6
@@
SilcServerEntry silc_server_backup_get(SilcServer server,
return NULL;
for (i = 0; i < server->backup->servers_count; i++) {
return NULL;
for (i = 0; i < server->backup->servers_count; i++) {
- SILC_LOG_HEXDUMP(("IP"), server_id->ip.data, 16);
- SILC_LOG_HEXDUMP(("IP"), server->backup->servers[i].ip.data, 16);
if (server->backup->servers[i].server &&
!memcmp(&server->backup->servers[i].ip, &server_id->ip.data,
sizeof(server_id->ip.data)))
if (server->backup->servers[i].server &&
!memcmp(&server->backup->servers[i].ip, &server_id->ip.data,
sizeof(server_id->ip.data)))
@@
-137,19
+135,22
@@
SilcServerEntry silc_server_backup_get(SilcServer server,
}
/* Deletes the backup server `server_entry'. */
}
/* Deletes the backup server `server_entry'. */
+
void silc_server_backup_del(SilcServer server, SilcServerEntry server_entry)
{
int i;
void silc_server_backup_del(SilcServer server, SilcServerEntry server_entry)
{
int i;
- SILC_LOG_DEBUG(("Start"));
-
if (!server->backup)
return ;
for (i = 0; i < server->backup->servers_count; i++) {
if (server->backup->servers[i].server == server_entry) {
if (!server->backup)
return ;
for (i = 0; i < server->backup->servers_count; i++) {
if (server->backup->servers[i].server == server_entry) {
+ SILC_LOG_DEBUG(("Removing %s as backup router",
+ server_entry->server_name ? server_entry->server_name :
+ ""));
server->backup->servers[i].server = NULL;
server->backup->servers[i].server = NULL;
- return;
+ memset(server->backup->servers[i].ip.data, 0,
+ sizeof(server->backup->servers[i].ip.data));
}
}
}
}
}
}
@@
-288,6
+289,8
@@
void silc_server_backup_broadcast(SilcServer server,
if (!backup || backup->connection == sender ||
server->backup->servers[i].local == FALSE)
continue;
if (!backup || backup->connection == sender ||
server->backup->servers[i].local == FALSE)
continue;
+ if (server->backup->servers[i].server == server->id_entry)
+ continue;
idata = (SilcIDListData)backup;
sock = backup->connection;
idata = (SilcIDListData)backup;
sock = backup->connection;
@@
-334,8
+337,6
@@
void silc_server_backup_send(SilcServer server,
if (!server->backup || server->server_type != SILC_ROUTER)
return;
if (!server->backup || server->server_type != SILC_ROUTER)
return;
- SILC_LOG_DEBUG(("Start"));
-
for (i = 0; i < server->backup->servers_count; i++) {
backup = server->backup->servers[i].server;
if (!backup)
for (i = 0; i < server->backup->servers_count; i++) {
backup = server->backup->servers[i].server;
if (!backup)
@@
-346,8
+347,14
@@
void silc_server_backup_send(SilcServer server,
if (local && server->backup->servers[i].local == FALSE)
continue;
if (local && server->backup->servers[i].local == FALSE)
continue;
+ if (server->backup->servers[i].server == server->id_entry)
+ continue;
sock = backup->connection;
sock = backup->connection;
+
+ SILC_LOG_DEBUG(("Sending %s packet to backup router %s (%s)",
+ silc_get_packet_name(type), sock->hostname, sock->ip));
+
silc_server_packet_send(server, backup->connection, type, flags,
data, data_len, force_send);
}
silc_server_packet_send(server, backup->connection, type, flags,
data, data_len, force_send);
}
@@
-376,8
+383,6
@@
void silc_server_backup_send_dest(SilcServer server,
if (!server->backup || server->server_type != SILC_ROUTER)
return;
if (!server->backup || server->server_type != SILC_ROUTER)
return;
- SILC_LOG_DEBUG(("Start"));
-
for (i = 0; i < server->backup->servers_count; i++) {
backup = server->backup->servers[i].server;
if (!backup)
for (i = 0; i < server->backup->servers_count; i++) {
backup = server->backup->servers[i].server;
if (!backup)
@@
-388,8
+393,14
@@
void silc_server_backup_send_dest(SilcServer server,
if (local && server->backup->servers[i].local == FALSE)
continue;
if (local && server->backup->servers[i].local == FALSE)
continue;
+ if (server->backup->servers[i].server == server->id_entry)
+ continue;
sock = backup->connection;
sock = backup->connection;
+
+ SILC_LOG_DEBUG(("Sending %s packet to backup router %s (%s)",
+ silc_get_packet_name(type), sock->hostname, sock->ip));
+
silc_server_packet_send_dest(server, backup->connection, type, flags,
dst_id, dst_id_type, data, data_len,
force_send);
silc_server_packet_send_dest(server, backup->connection, type, flags,
dst_id, dst_id_type, data, data_len,
force_send);
@@
-478,7
+489,7
@@
void silc_server_backup_resume_router(SilcServer server,
immediately after we've connected to our primary router. */
if (sock->type == SILC_SOCKET_TYPE_ROUTER &&
immediately after we've connected to our primary router. */
if (sock->type == SILC_SOCKET_TYPE_ROUTER &&
- s
erver->router == sock->user_data
&&
+ s
ock && SILC_PRIMARY_ROUTE(server) == sock
&&
type == SILC_SERVER_BACKUP_REPLACED) {
/* We have been replaced by an backup router in our cell. We must
mark our primary router connection disabled since we are not allowed
type == SILC_SERVER_BACKUP_REPLACED) {
/* We have been replaced by an backup router in our cell. We must
mark our primary router connection disabled since we are not allowed
@@
-990,7
+1001,7
@@
SILC_TASK_CALLBACK_GLOBAL(silc_server_protocol_backup)
/* Switch announced informations to our primary router of using the
backup router. */
silc_server_update_servers_by_server(server, ctx->sock->user_data,
/* Switch announced informations to our primary router of using the
backup router. */
silc_server_update_servers_by_server(server, ctx->sock->user_data,
- server->router);
+ server->router
, TRUE
);
silc_server_update_clients_by_server(server, ctx->sock->user_data,
server->router, TRUE, FALSE);
if (server->server_type == SILC_SERVER)
silc_server_update_clients_by_server(server, ctx->sock->user_data,
server->router, TRUE, FALSE);
if (server->server_type == SILC_SERVER)
@@
-1089,7
+1100,6
@@
SILC_TASK_CALLBACK_GLOBAL(silc_server_protocol_backup)
case SILC_PROTOCOL_STATE_END:
{
case SILC_PROTOCOL_STATE_END:
{
- SilcIDListData idata;
SilcServerEntry router, backup_router;
/* We should have been received RESUMED packet from our primary
SilcServerEntry router, backup_router;
/* We should have been received RESUMED packet from our primary
@@
-1103,35
+1113,37
@@
SILC_TASK_CALLBACK_GLOBAL(silc_server_protocol_backup)
SILC_LOG_DEBUG(("********************************"));
SILC_LOG_DEBUG(("Received RESUMED packet"));
SILC_LOG_DEBUG(("********************************"));
SILC_LOG_DEBUG(("Received RESUMED packet"));
- /* We have now new primary router. All traffic goes there from now on. */
if (server->backup_router)
server->server_type = SILC_BACKUP_ROUTER;
if (server->backup_router)
server->server_type = SILC_BACKUP_ROUTER;
+ /* We have now new primary router. All traffic goes there from now on. */
router = (SilcServerEntry)ctx->sock->user_data;
if (silc_server_backup_replaced_get(server, router->id,
&backup_router)) {
if (backup_router == server->router) {
router = (SilcServerEntry)ctx->sock->user_data;
if (silc_server_backup_replaced_get(server, router->id,
&backup_router)) {
if (backup_router == server->router) {
+ /* We have new primary router now */
server->id_entry->router = router;
server->router = router;
server->id_entry->router = router;
server->router = router;
+ server->router->data.status &= ~SILC_IDLIST_STATUS_DISABLED;
+
SILC_LOG_INFO(("Switching back to primary router %s",
server->router->server_name));
SILC_LOG_INFO(("Switching back to primary router %s",
server->router->server_name));
- SILC_LOG_DEBUG(("Switching back to primary router %s",
- server->router->server_name));
- idata = (SilcIDListData)server->router;
-
idata->status &= ~
SILC_IDLIST_STATUS_DISABLED;
+
+ /* We cannot talk to backup router connection anymore, it's
+ enabled again if primary goes down. */
+
backup_router->data.status |=
SILC_IDLIST_STATUS_DISABLED;
} else {
} else {
- SILC_LOG_INFO(("Resuming the use of router %s",
+ /* We are connected to new primary and now continue using it */
+ router->data.status &= ~SILC_IDLIST_STATUS_DISABLED;
+ SILC_LOG_INFO(("Resuming the use of primary router %s",
router->server_name));
router->server_name));
- SILC_LOG_DEBUG(("Resuming the use of router %s",
- router->server_name));
- idata = (SilcIDListData)router;
- idata->status &= ~SILC_IDLIST_STATUS_DISABLED;
}
/* Update the client entries of the backup router to the new
router */
}
/* Update the client entries of the backup router to the new
router */
- silc_server_update_servers_by_server(server, backup_router, router);
+ silc_server_update_servers_by_server(server, backup_router, router,
+ FALSE);
silc_server_update_clients_by_server(server, backup_router,
router, TRUE, FALSE);
if (server->server_type == SILC_SERVER)
silc_server_update_clients_by_server(server, backup_router,
router, TRUE, FALSE);
if (server->server_type == SILC_SERVER)
@@
-1190,7
+1202,7
@@
SILC_TASK_CALLBACK(silc_server_protocol_backup_done)
SilcIDCacheList list;
SilcIDCacheEntry id_cache;
SilcIDCacheList list;
SilcIDCacheEntry id_cache;
- SILC_LOG_DEBUG(("
Start
"));
+ SILC_LOG_DEBUG(("
Backup resuming protocol is ended
"));
if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
@@
-1207,6
+1219,9
@@
SILC_TASK_CALLBACK(silc_server_protocol_backup_done)
if (sock->protocol == protocol) {
sock->protocol = NULL;
if (sock->protocol == protocol) {
sock->protocol = NULL;
+ SILC_LOG_DEBUG(("***************1 %s:%d",
+ sock->ip, sock->port));
+
if (server_entry->data.status & SILC_IDLIST_STATUS_DISABLED)
server_entry->data.status &= ~SILC_IDLIST_STATUS_DISABLED;
}
if (server_entry->data.status & SILC_IDLIST_STATUS_DISABLED)
server_entry->data.status &= ~SILC_IDLIST_STATUS_DISABLED;
}
@@
-1227,6
+1242,8
@@
SILC_TASK_CALLBACK(silc_server_protocol_backup_done)
if (sock->protocol == protocol) {
sock->protocol = NULL;
if (sock->protocol == protocol) {
sock->protocol = NULL;
+ SILC_LOG_DEBUG(("***************2"));
+
if (server_entry->data.status & SILC_IDLIST_STATUS_DISABLED)
server_entry->data.status &= ~SILC_IDLIST_STATUS_DISABLED;
}
if (server_entry->data.status & SILC_IDLIST_STATUS_DISABLED)
server_entry->data.status &= ~SILC_IDLIST_STATUS_DISABLED;
}