summaryrefslogtreecommitdiff
path: root/ecp/server/dir.c
diff options
context:
space:
mode:
authorUros Majstorovic <majstor@majstor.org>2024-05-10 19:49:06 +0200
committerUros Majstorovic <majstor@majstor.org>2024-05-10 19:49:06 +0200
commitce55165b6952f9325c34b0008b5116b16736c4cb (patch)
tree7c85cb58e0eff3c9a884c499ad87ba6069dbc6ce /ecp/server/dir.c
parent3f814b6f30a9ae296805ebab49114fb24ab3b0d1 (diff)
server support for fragmented dir reply; fixed shadow reply messages accordingly
Diffstat (limited to 'ecp/server/dir.c')
-rw-r--r--ecp/server/dir.c72
1 files changed, 36 insertions, 36 deletions
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) {