summaryrefslogtreecommitdiff
path: root/ecp/src/ecp/vconn/vconn.c
diff options
context:
space:
mode:
authorUros Majstorovic <majstor@majstor.org>2024-06-03 04:06:21 +0200
committerUros Majstorovic <majstor@majstor.org>2024-06-03 04:06:21 +0200
commit109f39e09630409a30a9f4e8183f539c499f07ba (patch)
tree4492b38e1840be67e9ffedadb30df8f8baf9a0a7 /ecp/src/ecp/vconn/vconn.c
parent4c2c25f80b3cc173f09f6113e0ee623866948b87 (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.c67
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;