From 5f55d9d4d14635678e7f582215e3642de2e232a4 Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Mon, 6 May 2024 02:08:31 +0200 Subject: new ecp directory and vconn server --- ecp/server/dir.h | 89 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 67 insertions(+), 22 deletions(-) (limited to 'ecp/server/dir.h') 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 -#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); -- cgit v1.2.3