diff options
author | Uros Majstorovic <majstor@majstor.org> | 2024-06-03 04:06:21 +0200 |
---|---|---|
committer | Uros Majstorovic <majstor@majstor.org> | 2024-06-03 04:06:21 +0200 |
commit | 109f39e09630409a30a9f4e8183f539c499f07ba (patch) | |
tree | 4492b38e1840be67e9ffedadb30df8f8baf9a0a7 /ecp/src/ecp/vconn/vconn.c | |
parent | 4c2c25f80b3cc173f09f6113e0ee623866948b87 (diff) |
improved (v)conn init / open / init vlink / open vlink API; implemented randezvous hashing
Diffstat (limited to 'ecp/src/ecp/vconn/vconn.c')
-rw-r--r-- | ecp/src/ecp/vconn/vconn.c | 67 |
1 files changed, 49 insertions, 18 deletions
diff --git a/ecp/src/ecp/vconn/vconn.c b/ecp/src/ecp/vconn/vconn.c index e8d9b35..615474c 100644 --- a/ecp/src/ecp/vconn/vconn.c +++ b/ecp/src/ecp/vconn/vconn.c @@ -249,17 +249,31 @@ ssize_t ecp_vconn_pack_parent(ECPConnection *conn, ECPBuffer *payload, ECPBuffer return rv; } -void ecp_vconn_init(ECPVConnOutb vconn[], ecp_ecdh_public_t keys[], size_t vconn_size, ECPSocket *sock) { - ECPDHPub key; +void ecp_vconn_init(ECPVConnOutb vconn[], size_t vconn_size, ECPConnection *conn, ECPSocket *sock) { int i; - key.valid = 1; for (i=0; i<vconn_size; i++) { - memcpy(&key.public, &keys[i], sizeof(keys[i])); ecp_conn_init(&vconn[i].b, sock, ECP_CTYPE_VCONN); if (i != 0) ecp_conn_set_flags(&vconn[i].b, ECP_CONN_FLAG_NOFREE); - ecp_conn_set_remote_key(&vconn[i].b, &key); - if (i < vconn_size - 1) { + if (i != vconn_size - 1) { + vconn[i].next = &vconn[i + 1].b; + } else { + vconn[i].next = conn; + } + } +} + +void ecp_vconn_init_vlink(ECPVConnOutb vconn[], size_t vconn_size, ECPSocket *sock) { + int i; + + for (i=0; i<vconn_size; i++) { + if (i != vconn_size - 1) { + ecp_conn_init(&vconn[i].b, sock, ECP_CTYPE_VCONN); + } else { + ecp_vlink_init(&vconn[i].b, sock); + } + if (i != 0) ecp_conn_set_flags(&vconn[i].b, ECP_CONN_FLAG_NOFREE); + if (i != vconn_size - 1) { vconn[i].next = &vconn[i + 1].b; } else { vconn[i].next = NULL; @@ -280,22 +294,39 @@ void ecp_vconn_init_inb(ECPVConnInb *vconn, ECPSocket *sock) { #endif /* ECP_WITH_HTABLE */ -int ecp_vconn_open(ECPVConnOutb *vconn, ECPConnection *conn, ECPNode *node) { - ECPVConnOutb *_vconn; - int rv; +int ecp_vconn_open(ECPVConnOutb *vconn, ecp_ecdh_public_t vconn_pub[], ecp_tr_addr_t *addr, ecp_ecdh_public_t *public) { + ECPConnection *conn; + int i, rv; - _vconn = vconn; - while (_vconn->next) { - _vconn = (ECPVConnOutb *)_vconn->next; + i = 0; + conn = &vconn->b; + while (conn->type == ECP_CTYPE_VCONN) { + ecp_conn_set_remote_key(conn, &vconn_pub[i]); + conn = ((ECPVConnOutb *)conn)->next; + i++; } + if (public) ecp_conn_set_remote_key(conn, public); + if (addr) ecp_conn_set_remote_addr(&vconn->b, addr); + + rv = _ecp_conn_open(&vconn->b, NULL, 1); + return rv; +} + +int ecp_vconn_open_vlink(ECPVConnOutb *vconn, ecp_ecdh_public_t vconn_pub[], ecp_tr_addr_t *addr) { + ECPConnection *conn; + int i, rv; - _vconn->next = conn; - if (node) { - ecp_conn_set_remote_key(conn, &node->key_perma); - ecp_conn_set_remote_addr(&vconn->b, &node->addr); + i = 0; + conn = &vconn->b; + while (conn->type == ECP_CTYPE_VCONN) { + ecp_conn_set_remote_key(conn, &vconn_pub[i]); + conn = ((ECPVConnOutb *)conn)->next; + i++; } + ecp_conn_set_remote_key(conn, &vconn_pub[i]); + if (addr) ecp_conn_set_remote_addr(&vconn->b, addr); - rv = _ecp_conn_open(&vconn->b, NULL, NULL, 1); + rv = _ecp_conn_open(&vconn->b, NULL, 1); return rv; } @@ -332,7 +363,7 @@ int ecp_vconn_handle_open(ECPConnection *conn, ECP2Buffer *bufs) { /* we should release incoming packet before sending next open packet */ ecp_tr_release(bufs->packet, 1); - rv = _ecp_conn_open(vconn->next, conn, NULL, 1); + rv = _ecp_conn_open(vconn->next, conn, 1); /* err will be handled by ecp_vconn_handle_err */ return rv; |