updates.
[silc.git] / apps / silcd / server_backup.h
diff --git a/apps/silcd/server_backup.h b/apps/silcd/server_backup.h
new file mode 100644 (file)
index 0000000..25fe49d
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+
+  server_backup.h 
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2001 Pekka Riikonen
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; version 2 of the License.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+*/
+
+#ifndef SERVER_BACKUP_H
+#define SERVER_BACKUP_H
+
+/* Adds the `backup_server' to be one of our backup router. This can be
+   called multiple times to set multiple backup routers. If `local' is
+   TRUE then the `backup_server' is in the local cell, if FALSE it is
+   in some other cell. */
+void silc_server_backup_add(SilcServer server, SilcServerEntry backup_server,
+                           bool local);
+
+/* Returns the first backup router context. Returns NULL if we do not have
+   any backup servers. This removes the returned server from being 
+   backup router and needs to be added later with silc_server_backup_add
+   if it needs to be backup router again. */
+SilcServerEntry silc_server_backup_get(SilcServer server);
+
+/* Deletes the backup server `server_entry. */
+void silc_server_backup_del(SilcServer server, 
+                           SilcServerEntry server_entry);
+
+/* Marks the IP address and port from the `server_id' as  being replaced
+   by backup router indicated by the `server'. If the router connects at
+   a later time we can check whether it has been replaced by an backup
+   router. */
+void silc_server_backup_replaced_add(SilcServer server, 
+                                    SilcServerID *server_id,
+                                    SilcServerEntry server_entry);
+
+/* Checks whether the IP address and port from the `server_id' has been
+   replaced by an backup router. If it has been then this returns TRUE
+   and the bacup router entry to the `server' pointer if non-NULL. Returns
+   FALSE if the router is not replaced by backup router. */
+bool silc_server_backup_replaced_get(SilcServer server,
+                                    SilcServerID *server_id,
+                                    SilcServerEntry *server_entry);
+
+/* Deletes the IP address and port from the `server_id' from being replaced
+   by an backup router. */
+void silc_server_backup_replaced_del(SilcServer server,
+                                    SilcServerID *server_id);
+
+/* Broadcast the received packet indicated by `packet' to all of our backup 
+   routers. All router wide information is passed using broadcast packets. 
+   That is why all backup routers need to get this data too. It is expected
+   that the caller already knows that the `packet' is broadcast packet. */
+void silc_server_backup_broadcast(SilcServer server, 
+                                 SilcSocketConnection sender,
+                                 SilcPacketContext *packet);
+
+/* A generic routine to send data to all backup routers. If the `sender'
+   is provided it will indicate the original sender of the packet and the
+   packet won't be resent to that entity. The `data' is the data that will
+   be assembled to packet context before sending. The packet will be
+   encrypted this function. If the `force_send' is TRUE the data is sent
+   immediately and not put to queue. If `local' is TRUE then the packet
+   will be sent only to local backup routers inside the cell. If false the
+   packet can go from one cell to the other. This function has no effect
+   if there are no any backup routers. */
+void silc_server_backup_send(SilcServer server,
+                            SilcServerEntry sender,
+                            SilcPacketType type,
+                            SilcPacketFlags flags,
+                            unsigned char *data,
+                            uint32 data_len,
+                            bool force_send,
+                            bool local);
+
+/* Same as silc_server_backup_send but sets a specific Destination ID to
+   the packet. The Destination ID is indicated by the `dst_id' and the
+   ID type `dst_id_type'. For example, packets destined to channels must
+   be sent using this function. */
+void silc_server_backup_send_dest(SilcServer server,
+                                 SilcServerEntry sender,
+                                 SilcPacketType type,
+                                 SilcPacketFlags flags,
+                                 void *dst_id,
+                                 SilcIdType dst_id_type,
+                                 unsigned char *data,
+                                 uint32 data_len,
+                                 bool force_send,
+                                 bool local);
+
+/* Processes incoming RESUME_ROUTER packet. This can give the packet
+   for processing to the protocol handler or allocate new protocol if
+   start command is received. */
+void silc_server_backup_resume_router(SilcServer server, 
+                                     SilcSocketConnection sock, 
+                                     SilcPacketContext *packet);
+
+/* Constantly tries to reconnect to a primary router indicated by the
+   `ip' and `port'. The `connected' callback will be called when the
+   connection is created. */
+void silc_server_backup_reconnect(SilcServer server,
+                                 const char *ip, uint16 port,
+                                 SilcServerConnectRouterCallback callback,
+                                 void *context);
+
+/* Called when we've established connection back to our primary router
+   when we've acting as backup router and have replaced the primary router
+   in the cell. This function will start the backup resuming protocol. */
+void silc_server_backup_connected(SilcServer server,
+                                 SilcServerEntry server_entry,
+                                 void *context);
+
+/* Backup resuming protocol. This protocol is executed when the primary
+   router wants to resume its position as being primary router. */
+SILC_TASK_CALLBACK_GLOBAL(silc_server_protocol_backup);
+
+#endif /* SERVER_BACKUP_H */