From ce55165b6952f9325c34b0008b5116b16736c4cb Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Fri, 10 May 2024 19:49:06 +0200 Subject: server support for fragmented dir reply; fixed shadow reply messages accordingly --- ecp/server/dir.c | 72 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) (limited to 'ecp/server/dir.c') diff --git a/ecp/server/dir.c b/ecp/server/dir.c index 1dca021..738c787 100644 --- a/ecp/server/dir.c +++ b/ecp/server/dir.c @@ -58,18 +58,17 @@ ssize_t dir_send_online(ECPConnection *conn, uint8_t region) { ssize_t rv_snd; ecp_pld_set_type(payload.buffer, payload.size, ECP_MTYPE_DIR_REP); + ecp_pld_set_frag(payload.buffer, payload.size, i, list->msg_count, 0); msg = ecp_pld_get_msg(payload.buffer, payload.size); msg_size = 0; - msg[0] = i; // frag_cnt - msg[1] = list->msg_count; // frag_tot - msg[2] = list->msg[i].count; // item_cnt - msg[3] = region; // region - msg[4] = dir_online->serial >> 8; // serial - msg[5] = dir_online->serial; + msg[0] = list->msg[i].count; // item_cnt + msg[1] = region; // region + msg[2] = dir_online->serial >> 8; // serial + msg[3] = dir_online->serial; - msg += 4 + sizeof(uint16_t); - msg_size += 4 + sizeof(uint16_t); + msg += 2 + sizeof(uint16_t); + msg_size += 2 + sizeof(uint16_t); memcpy(msg, list->msg[i].buffer, list->msg[i].count * ECP_SIZE_DIR_ITEM); msg_size += list->msg[i].count * ECP_SIZE_DIR_ITEM; @@ -125,7 +124,7 @@ ssize_t dir_send_ann(ECPConnection *conn) { ecp_pld_set_type(payload.buffer, payload.size, MTYPE_DIR_ANN); msg = ecp_pld_get_msg(payload.buffer, payload.size); msg[0] = srv_config->region; - msg[1] = srv_config->capabilities; + msg[1] = srv_config->roles; return ecp_pld_send(conn, &packet, &payload, ECP_SIZE_PLD(2, MTYPE_DIR_ANN), 0); } @@ -157,16 +156,16 @@ ssize_t dir_send_shadow(ECPConnection *conn) { ecp_pld_set_type(payload.buffer, payload.size, MTYPE_DIR_SHADOW); msg = ecp_pld_get_msg(payload.buffer, payload.size); - memset(msg, 0, 4 + sizeof(uint16_t)); // frag_cnt, frag_tot, item_cnt, region, serial - pthread_rwlock_rdlock(&dir_shadow_rwlock); + count = 0; + msg_size = 0; if (ecp_ht_count(dir_shadow) > 0) { unsigned char *_msg; size_t _msg_size; int _rv; - _msg = msg + 4 + sizeof(uint16_t); + _msg = msg + 1; _msg_size = 0; ecp_ht_itr_create(&itr, dir_shadow); if (node_next) { @@ -178,7 +177,6 @@ ssize_t dir_send_shadow(ECPConnection *conn) { node_next = NULL; } - count = 0; do { node = ecp_ht_itr_value(&itr); @@ -200,20 +198,22 @@ ssize_t dir_send_shadow(ECPConnection *conn) { _rv = ecp_ht_itr_advance(&itr); } while (_rv == ECP_OK); - msg[2] = count; - msg_size = 4 + sizeof(uint16_t) + _msg_size; + msg[0] = count; + msg_size = 1 + _msg_size; } /* no need to copy node_next key, since announce is verified nodes will not be removed during online switch node removal */ pthread_rwlock_unlock(&dir_shadow_rwlock); - rv_snd = ecp_pld_send(conn, &packet, &payload, ECP_SIZE_PLD(msg_size, MTYPE_DIR_SHADOW), 0); - if (rv_snd < 0) { - rv = rv_snd; - break; + if (msg_size) { + rv_snd = ecp_pld_send(conn, &packet, &payload, ECP_SIZE_PLD(msg_size, MTYPE_DIR_SHADOW), 0); + if (rv_snd < 0) { + rv = rv_snd; + break; + } + rv += rv_snd; } - rv += rv_snd; } while (node_next); return rv; @@ -270,7 +270,7 @@ ssize_t dir_send_origin_rep(ECPConnection *conn, ecp_ecdh_public_t *public) { ssize_t dir_handle_ann(ECPConnection *conn, unsigned char *msg, size_t msg_size) { ECPDirItem dir_item; uint8_t region; - uint8_t capabilities; + uint8_t roles; size_t rsize; ssize_t rv; int ann_enable; @@ -285,8 +285,8 @@ ssize_t dir_handle_ann(ECPConnection *conn, unsigned char *msg, size_t msg_size) if (!ann_enable) return rsize; region = msg[0]; - capabilities = msg[1]; - if ((capabilities & ECP_DIR_CAP_DIR) && !acl_dir_inlist(&conn->remote.key_perma.public)) { + roles = msg[1]; + if ((roles & ECP_ROLE_DIR) && !acl_dir_inlist(&conn->remote.key_perma.public)) { LOG(LOG_ERR, "dir_handle_ann: not a directory server\n"); return ECP_ERR; } @@ -294,7 +294,7 @@ ssize_t dir_handle_ann(ECPConnection *conn, unsigned char *msg, size_t msg_size) memset(&dir_item, 0, sizeof(ECPDirItem)); dir_item.node = conn->remote; dir_item.region = region; - dir_item.capabilities = capabilities; + dir_item.roles = roles; if (dir_item.region >= MAX_REGION) { LOG(LOG_ERR, "dir_handle_ann: bad region\n"); @@ -314,12 +314,12 @@ ssize_t dir_handle_shadow(ECPConnection *conn, unsigned char *msg, size_t msg_si size_t rsize; int i, ann_enable; - if (msg_size < 4 + sizeof(uint16_t)) return ECP_ERR_SIZE; + if (msg_size < 1) return ECP_ERR_SIZE; - count = msg[2]; - msg += 4 + sizeof(uint16_t); // frag_cnt, frag_tot, item_cnt, region, serial + count = msg[0]; // item_cnt + msg += 1; - rsize = 4 + sizeof(uint16_t) + count * ECP_SIZE_DIR_ITEM; + rsize = 1 + count * ECP_SIZE_DIR_ITEM; if (msg_size < rsize) return ECP_ERR_SIZE; pthread_rwlock_rdlock(&dir_timer_rwlock); @@ -364,7 +364,7 @@ ssize_t dir_handle_msg(struct ECPConnection *conn, ecp_seq_t seq, unsigned char case MTYPE_DIR_ANN: { int is_dir; - is_dir = srv_config->capabilities & ECP_DIR_CAP_DIR; + is_dir = srv_config->roles & ECP_ROLE_DIR; if (!is_dir || ecp_conn_is_outb(conn)) return ECP_ERR; return dir_handle_ann(conn, msg, msg_size); @@ -379,7 +379,7 @@ ssize_t dir_handle_msg(struct ECPConnection *conn, ecp_seq_t seq, unsigned char case MTYPE_DIR_ORIGIN_REQ: { int is_dir; - is_dir = srv_config->capabilities & ECP_DIR_CAP_DIR; + is_dir = srv_config->roles & ECP_ROLE_DIR; if (!is_dir || ecp_conn_is_outb(conn)) return ECP_ERR; return dir_handle_origin_req(conn, msg, msg_size); @@ -447,7 +447,7 @@ void dir_process_item(ECPDirItem *dir_item, ECPSocket *sock, ecp_ecdh_public_t * if (!key_ex) { unsigned int vkey_req; - if (node->dir_item.capabilities & ECP_DIR_CAP_DIR) { + if (node->dir_item.roles & ECP_ROLE_DIR) { vkey_req = vkey_req_dir; } else { vkey_req = MIN_VKEY_REQ; @@ -521,7 +521,7 @@ int dir_create_node(ECPDirItem *dir_item, ECPSocket *sock, DIRNode **node) { _node->is_new = 1; /* open connection to other directory servers */ - if ((dir_item->capabilities & ECP_DIR_CAP_DIR) && (memcmp(&dir_item->node.key_perma.public, &srv_config->key_perma.public, sizeof(srv_config->key_perma.public)) != 0)) { + if ((dir_item->roles & ECP_ROLE_DIR) && (memcmp(&dir_item->node.key_perma.public, &srv_config->key_perma.public, sizeof(srv_config->key_perma.public)) != 0)) { rv = dir_open_conn(_node, sock); if (rv) { pthread_mutex_destroy(&_node->mutex); @@ -615,7 +615,7 @@ void dir_online_switch(ECPSocket *sock, int inc_serial) { count[region]++; } } - if (node->dir_item.capabilities & ECP_DIR_CAP_DIR) { + if (node->dir_item.roles & ECP_ROLE_DIR) { dir_cnt++; } node_cnt++; @@ -727,7 +727,7 @@ void dir_online_switch(ECPSocket *sock, int inc_serial) { } } - if (srv_config->capabilities & ECP_DIR_CAP_DIR) acl_load_ht(); + if (srv_config->roles & ECP_ROLE_DIR) acl_load_ht(); LOG(LOG_DEBUG, "dir_online_switch: node:%d dir:%d serial:%d\n", node_cnt, dir_cnt, dir_online ? dir_online->serial : 0); } @@ -786,7 +786,7 @@ void dir_announce(ECPSocket *sock, int ann_period) { do { node = ecp_ht_itr_value(&itr); - if ((node->dir_item.capabilities & ECP_DIR_CAP_DIR) && (memcmp(&node->dir_item.node.key_perma.public, &srv_config->key_perma.public, sizeof(srv_config->key_perma.public)) != 0)) { + if ((node->dir_item.roles & ECP_ROLE_DIR) && (memcmp(&node->dir_item.node.key_perma.public, &srv_config->key_perma.public, sizeof(srv_config->key_perma.public)) != 0)) { if (announce_cnt < MAX_NODE_ANNOUNCE) { announce_node[announce_cnt] = node; announce_cnt++; @@ -954,7 +954,7 @@ int dir_init(ECPSocket *sock) { /* dir_process_enable and dir_online.serial will be set from timer */ dir_vkey_req = 1; srv_config = srv_get_config(); - is_dir = srv_config->capabilities & ECP_DIR_CAP_DIR; + is_dir = srv_config->roles & ECP_ROLE_DIR; rv = pthread_rwlock_init(&dir_shadow_rwlock, NULL); if (rv) { -- cgit v1.2.3