summaryrefslogtreecommitdiff
path: root/ecp/server/dir.h
diff options
context:
space:
mode:
Diffstat (limited to 'ecp/server/dir.h')
-rw-r--r--ecp/server/dir.h89
1 files changed, 67 insertions, 22 deletions
diff --git a/ecp/server/dir.h b/ecp/server/dir.h
index cbc0c87..24af3bc 100644
--- a/ecp/server/dir.h
+++ b/ecp/server/dir.h
@@ -1,35 +1,80 @@
-#define MAX_DIR_ITEM 30
-#define MAX_EXPIRE_CNT 100
-#define MAX_ANNOUNCE_CNT 100
+#include <ecp/dir/dir.h>
-#define NODE_EXP_TIME 86400
+#define MAX_DIR_ITEM_IN_MSG ((ECP_MAX_PLD - (4 + sizeof(uint16_t))) / ECP_SIZE_DIR_ITEM)
-typedef struct DirNode {
+#define MAX_DIR_MSG 10
+#define MAX_DIR_ITEM (MAX_DIR_MSG * MAX_DIR_ITEM_IN_MSG)
+#define MAX_DIR_ITEM_DIR 100
+#define MAX_REGION 10
+
+#define MAX_VKEY ((MAX_DIR_ITEM_DIR / 2) + 1)
+#define MIN_VKEY_REQ 2 /* minimum number of vkeys required for non directory server */
+
+#define MAX_NODE_ANNOUNCE 100
+#define MAX_NODE_REMOVE 100
+
+#define CTYPE_DIR 0x00
+
+#define MTYPE_DIR_ANN 0x00
+#define MTYPE_DIR_SHADOW 0x01
+#define MTYPE_DIR_ORIGIN_REQ 0x02
+#define MTYPE_DIR_ORIGIN_REP 0x03
+
+#define PROC_BLOCK_ALL 0
+#define PROC_BLOCK_ANN 1
+#define PROC_ALLOW_ALL 2
+
+#define ANN_PERIOD 600 /* announce priod (s); can't exceed 1h */
+#define CONN_EXPIRE_TO 60
+
+#define DIR_UFLAG_RECONNECT 0x80
+
+typedef struct DIRNode {
ECPDirItem dir_item;
- int refcount;
int zombie;
- ecp_sts_t access_ts;
+ int verified;
+ int ann_local;
+ int is_new;
+ ecp_ecdh_public_t vkey[MAX_VKEY];
+ unsigned short vkey_cnt;
+ ECPConnection *conn;
pthread_mutex_t mutex;
-} DirNode;
+} DIRNode;
+
+typedef struct DIRList {
+ struct {
+ uint8_t count;
+ unsigned char buffer[MAX_DIR_ITEM_IN_MSG * ECP_SIZE_DIR_ITEM];
+ } msg[MAX_DIR_MSG];
+ uint8_t msg_count;
+} DIRList;
-typedef struct DirList {
- unsigned char msg[ECP_MAX_PLD];
- uint16_t count;
-} DirList;
+typedef struct DIROnline {
+ DIRList list[MAX_REGION];
+ uint16_t serial;
+} DIROnline;
+
+ssize_t dir_send_online(ECPConnection *conn, uint8_t region);
+ssize_t dir_handle_client_msg(struct ECPConnection *conn, ecp_seq_t seq, unsigned char mtype, unsigned char *msg, size_t msg_size, struct ECP2Buffer *b);
ssize_t dir_send_ann(ECPConnection *conn);
ssize_t dir_send_shadow(ECPConnection *conn);
-ssize_t dir_send_online(ECPConnection *conn);
ssize_t dir_handle_ann(ECPConnection *conn, unsigned char *msg, size_t msg_size);
-ssize_t dir_handle_req(ECPConnection *conn, unsigned char *msg, size_t msg_size);
ssize_t dir_handle_shadow(ECPConnection *conn, unsigned char *msg, size_t msg_size);
ssize_t dir_handle_msg(struct ECPConnection *conn, ecp_seq_t seq, unsigned char mtype, unsigned char *msg, size_t msg_size, struct ECP2Buffer *b);
-int dir_handle_open(ECPConnection *conn, ECP2Buffer *bufs);
-int dir_process_item(ECPDirItem *dir_item, ecp_sts_t access_ts);
-DirNode *dir_create_node(ECPDirItem *dir_item, ecp_sts_t access_ts);
-void dir_destroy_node(DirNode *node);
-int dir_open_conn(ECPSocket *sock, ECPNode *node);
-DirNode *dir_search_conn(ECPConnection *conn);
-void dir_announce(ECPSocket *sock);
+
+void dir_process_item(ECPDirItem *dir_item, ECPSocket *sock, ecp_ecdh_public_t *s_public);
+int dir_open_conn(DIRNode *node, ECPSocket *sock);
+int dir_create_node(ECPDirItem *dir_item, ECPSocket *sock, DIRNode **node);
+void dir_destroy_node(DIRNode *node);
+
+void dir_online_switch(ECPSocket *sock, int inc_serial);
+void dir_remove_nodes(DIRNode *remove_node[], int remove_cnt);
+void dir_announce_allow(void);
+void dir_announce_block(void);
+void dit_init_serial(uint16_t serial);
+void dir_announce(ECPSocket *sock, int ann_period);
int dir_start_announce(ECPSocket *sock);
-int dir_init(ECPContext *ctx);
+void dir_init_switch(ECPSocket *sock, int init_ann);
+int dir_init_ann(ECPSocket *sock, ECPNode *node);
+int dir_init(ECPSocket *sock);