summaryrefslogtreecommitdiff
path: root/ecp/src/ecp/core.h
diff options
context:
space:
mode:
Diffstat (limited to 'ecp/src/ecp/core.h')
-rw-r--r--ecp/src/ecp/core.h149
1 files changed, 82 insertions, 67 deletions
diff --git a/ecp/src/ecp/core.h b/ecp/src/ecp/core.h
index 4b47bcb..9be0dc0 100644
--- a/ecp/src/ecp/core.h
+++ b/ecp/src/ecp/core.h
@@ -15,18 +15,18 @@
#define ECP_ERR_ALLOC -3
#define ECP_ERR_SIZE -4
#define ECP_ERR_BUSY -5
-#define ECP_ERR_EMPTY -6
-#define ECP_ERR_FULL -7
-#define ECP_ERR_MTYPE -8
-#define ECP_ERR_CTYPE -9
-#define ECP_ERR_HANDLER -10
-#define ECP_ERR_COOKIE -11
-
-#define ECP_ERR_NET_ADDR -12
-#define ECP_ERR_MAX_PARENT -13
-#define ECP_ERR_NEXT -14
-
-#define ECP_ERR_ECDH_KEY_DUP -21
+#define ECP_ERR_DUP -6
+#define ECP_ERR_EMPTY -7
+#define ECP_ERR_FULL -8
+#define ECP_ERR_MTYPE -9
+#define ECP_ERR_CTYPE -10
+#define ECP_ERR_HANDLER -11
+#define ECP_ERR_COOKIE -12
+
+#define ECP_ERR_NET_ADDR -13
+#define ECP_ERR_MAX_PARENT -14
+#define ECP_ERR_NEXT -15
+
#define ECP_ERR_ECDH_IDX -22
#define ECP_ERR_ENCRYPT -26
#define ECP_ERR_DECRYPT -27
@@ -43,6 +43,7 @@
#define ECP_MAX_CONN_KEY 2
#define ECP_MAX_NODE_KEY 2
#define ECP_MAX_CTYPE 8
+#define ECP_MAX_CTYPE_SYS 3
#define ECP_MAX_MTYPE 16
#define ECP_MAX_PARENT 3
#define ECP_MAX_SEQ_FWD 1024
@@ -121,31 +122,37 @@
#define ECP_CONN_FLAG_INB 0x80
#define ECP_CONN_FLAG_VBOX 0x01
#define ECP_CONN_FLAG_RBUF 0x02
+#define ECP_CONN_FLAG_GC 0x04
#define ECP_CONN_FLAG_MASK 0x7F
/* mutable flags */
-#define ECP_CONN_FLAG_REG 0x04
-#define ECP_CONN_FLAG_OPEN 0x08
+#define ECP_CONN_FLAG_REG 0x01
+#define ECP_CONN_FLAG_OPEN 0x02
+#define ECP_CONN_FLAG_CLOSED 0x04
#define ECP_SEND_FLAG_REPLY 0x01
#define ECP_SEND_FLAG_MORE 0x02
#define ecp_conn_has_vbox(conn) ((conn)->flags_im & ECP_CONN_FLAG_VBOX)
#define ecp_conn_has_rbuf(conn) ((conn)->flags_im & ECP_CONN_FLAG_RBUF)
+#define ecp_conn_is_gc(conn) ((conn)->flags_im & ECP_CONN_FLAG_GC)
#define ecp_conn_is_inb(conn) ((conn)->flags_im & ECP_CONN_FLAG_INB)
#define ecp_conn_is_outb(conn) (!((conn)->flags_im & ECP_CONN_FLAG_INB))
-#define ecp_conn_is_reg(conn) ((conn)->flags & ECP_CONN_FLAG_REG)
-#define ecp_conn_is_open(conn) ((conn)->flags & ECP_CONN_FLAG_OPEN)
#define ecp_conn_is_sys(conn) ((conn)->type & ECP_CTYPE_FLAG_SYS)
+#define _ecp_conn_is_reg(conn) ((conn)->flags & ECP_CONN_FLAG_REG)
+#define _ecp_conn_is_open(conn) ((conn)->flags & ECP_CONN_FLAG_OPEN)
+#define _ecp_conn_is_closed(conn) ((conn)->flags & ECP_CONN_FLAG_CLOSED)
#define ecp_conn_set_inb(conn) ((conn)->flags_im |= ECP_CONN_FLAG_INB)
#define ecp_conn_set_outb(conn) ((conn)->flags_im &= ~ECP_CONN_FLAG_INB)
-#define ecp_conn_set_reg(conn) ((conn)->flags |= ECP_CONN_FLAG_REG)
-#define ecp_conn_set_open(conn) ((conn)->flags |= ECP_CONN_FLAG_OPEN)
+#define _ecp_conn_set_reg(conn) ((conn)->flags |= ECP_CONN_FLAG_REG)
+#define _ecp_conn_set_open(conn) ((conn)->flags |= ECP_CONN_FLAG_OPEN)
+#define _ecp_conn_set_closed(conn) ((conn)->flags |= ECP_CONN_FLAG_CLOSED)
-#define ecp_conn_clr_reg(conn) ((conn)->flags &= ~ECP_CONN_FLAG_REG)
-#define ecp_conn_clr_open(conn) ((conn)->flags &= ~ECP_CONN_FLAG_OPEN)
+#define _ecp_conn_clr_reg(conn) ((conn)->flags &= ~ECP_CONN_FLAG_REG)
+#define _ecp_conn_clr_open(conn) ((conn)->flags &= ~ECP_CONN_FLAG_OPEN)
+#define _ecp_conn_clr_closed(conn) ((conn)->flags &= ~ECP_CONN_FLAG_CLOSED)
typedef uint32_t ecp_ack_t;
#define ECP_SIZE_ACKB (sizeof(ecp_ack_t)*8)
@@ -174,9 +181,8 @@ typedef uint64_t ecp_nonce_t;
struct ECP2Buffer;
struct ECPSocket;
struct ECPConnection;
-
-#ifdef ECP_WITH_DIRSRV
-struct ECPDirList;
+#ifdef ECP_WITH_FRAG
+struct ECPFragIter;
#endif
#ifdef ECP_WITH_HTABLE
@@ -186,15 +192,16 @@ struct ECPDirList;
#include "transport.h"
#include "timer.h"
+typedef int (*ecp_conn_expired_t) (struct ECPConnection *conn, ecp_sts_t now, ecp_sts_t to);
+
typedef void (*ecp_err_handler_t) (struct ECPConnection *conn, unsigned char mtype, int err);
-typedef ssize_t (*ecp_dir_handler_t) (struct ECPConnection *conn, unsigned char *msg, size_t msg_size, struct ECP2Buffer *b);
-typedef struct ECPConnection * (*ecp_conn_alloc_t) (struct ECPSocket *sock, unsigned char type);
+typedef struct ECPConnection * (*ecp_conn_new_t) (struct ECPSocket *sock, unsigned char type);
typedef void (*ecp_conn_free_t) (struct ECPConnection *conn);
typedef ssize_t (*ecp_msg_handler_t) (struct ECPConnection *conn, ecp_seq_t seq, unsigned char mtype, unsigned char *msg, size_t msg_size, struct ECP2Buffer *b);
typedef int (*ecp_open_handler_t) (struct ECPConnection *conn, struct ECP2Buffer *b);
typedef void (*ecp_close_handler_t) (struct ECPConnection *conn);
-typedef ssize_t (*ecp_open_send_t) (struct ECPConnection *conn, unsigned char *cookie);
+typedef ssize_t (*ecp_send_open_t) (struct ECPConnection *conn, unsigned char *cookie);
typedef struct ECPBuffer {
unsigned char *buffer;
@@ -241,24 +248,21 @@ typedef struct ECPConnHandler {
ecp_msg_handler_t handle_msg;
ecp_open_handler_t handle_open;
ecp_close_handler_t handle_close;
- ecp_open_send_t send_open;
+ ecp_send_open_t send_open;
} ECPConnHandler;
typedef struct ECPContext {
ecp_err_handler_t handle_err;
- ecp_dir_handler_t handle_dir;
- ecp_conn_alloc_t conn_alloc;
+ ecp_conn_new_t conn_new; /* inbound connections only */
ecp_conn_free_t conn_free;
ECPConnHandler *handler[ECP_MAX_CTYPE];
-#ifdef ECP_WITH_DIRSRV
- struct ECPDirSrv *dir_srv;
-#endif
+ ECPConnHandler *handler_sys[ECP_MAX_CTYPE_SYS];
} ECPContext;
typedef struct ECPConnTable {
#ifdef ECP_WITH_HTABLE
ecp_ht_table_t *keys;
- ecp_ht_table_t *keys_inb;
+ ecp_ht_table_t *keys_gc;
ecp_ht_table_t *addrs;
#else
struct ECPConnection *arr[ECP_MAX_SOCK_CONN];
@@ -266,7 +270,7 @@ typedef struct ECPConnTable {
#endif
#ifdef ECP_WITH_PTHREAD
pthread_mutex_t mutex;
- pthread_mutex_t mutex_inb;
+ pthread_mutex_t mutex_gc;
#endif
} ECPConnTable;
@@ -304,70 +308,79 @@ typedef struct ECPConnection {
unsigned char rkey_curr;
ECPDHShkey shkey[ECP_MAX_NODE_KEY][ECP_MAX_NODE_KEY];
ecp_sts_t access_ts;
-#ifdef ECP_WITH_PTHREAD
- pthread_mutex_t mutex;
-#endif
+ void *param;
#ifdef ECP_WITH_VCONN
struct ECPConnection *parent;
- struct ECPConnection *next;
unsigned short pcount;
#endif
+#ifdef ECP_WITH_FRAG
+ struct ECPFragIter *iter;
+#endif
+#ifdef ECP_WITH_PTHREAD
+ pthread_mutex_t mutex;
+#endif
} ECPConnection;
int ecp_dhkey_gen(ECPDHKey *key);
-int ecp_init(ECPContext *ctx);
-int ecp_ctx_init(ECPContext *ctx, ecp_err_handler_t handle_err, ecp_dir_handler_t handle_dir, ecp_conn_alloc_t conn_alloc, ecp_conn_free_t conn_free);
-int ecp_ctx_set_handler(ECPContext *ctx, ECPConnHandler *handler, unsigned char ctype);
+int ecp_ctx_init(ECPContext *ctx, ecp_err_handler_t handle_err, ecp_conn_new_t conn_new, ecp_conn_free_t conn_free);
+int ecp_ctx_set_handler(ECPContext *ctx, unsigned char ctype, ECPConnHandler *handler);
+ECPConnHandler *ecp_ctx_get_handler(ECPContext *ctx, unsigned char ctype);
+
+int ecp_addr_init(ecp_tr_addr_t *addr, void *addr_s);
-int ecp_node_init(ECPNode *node, ecp_ecdh_public_t *public, void *addr);
+void ecp_node_init(ECPNode *node, ecp_ecdh_public_t *public, ecp_tr_addr_t *addr);
void ecp_node_set_pub(ECPNode *node, ecp_ecdh_public_t *public);
int ecp_node_set_addr(ECPNode *node, void *addr);
int ecp_sock_init(ECPSocket *sock, ECPContext *ctx, ECPDHKey *key);
int ecp_sock_create(ECPSocket *sock, ECPContext *ctx, ECPDHKey *key);
void ecp_sock_destroy(ECPSocket *sock);
-int ecp_sock_open(ECPSocket *sock, void *myaddr);
+int ecp_sock_open(ECPSocket *sock, ecp_tr_addr_t *myaddr);
void ecp_sock_close(ECPSocket *sock);
int ecp_sock_minkey_new(ECPSocket *sock);
int ecp_sock_dhkey_new(ECPSocket *sock);
int ecp_sock_dhkey_get(ECPSocket *sock, unsigned char idx, ECPDHKey *key);
int ecp_sock_dhkey_get_pub(ECPSocket *sock, unsigned char *idx, ecp_ecdh_public_t *public);
void ecp_sock_get_nonce(ECPSocket *sock, ecp_nonce_t *nonce);
+
+void ecp_sock_expire(ECPSocket *sock, ecp_sts_t to, ecp_conn_expired_t conn_expired);
int ecp_sock_expire_inb(ECPSocket *sock, ecp_sts_t to);
int ecp_cookie_gen(ECPSocket *sock, unsigned char *cookie, unsigned char *public_buf);
int ecp_cookie_verify(ECPSocket *sock, unsigned char *cookie, unsigned char *public_buf);
-int ecp_conn_alloc(ECPSocket *sock, unsigned char ctype, ECPConnection **_conn);
-void ecp_conn_free(ECPConnection *conn);
-
+ECPConnection *ecp_conn_new_inb(ECPSocket *sock, unsigned char ctype);
void ecp_conn_init(ECPConnection *conn, ECPSocket *sock, unsigned char ctype);
-void ecp_conn_reinit(ECPConnection *conn);
-int ecp_conn_create(ECPConnection *conn, ECPSocket *sock, unsigned char ctype);
-int ecp_conn_create_inb(ECPConnection *conn, ECPSocket *sock, unsigned char ctype);
+int ecp_conn_reset(ECPConnection *conn);
+int ecp_conn_create(ECPConnection *conn, ECPConnection *parent);
+int ecp_conn_create_inb(ECPConnection *conn, ECPConnection *parent, unsigned char s_idx, unsigned char c_idx, ecp_ecdh_public_t *public, ECPDHPub *remote_key, ecp_aead_key_t *shkey);
+int ecp_conn_create_outb(ECPConnection *conn, ECPConnection *parent, ECPNode *node);
+int ecp_conn_reset_outb(ECPConnection *conn);
void ecp_conn_destroy(ECPConnection *conn);
-
-void ecp_conn_set_flags(ECPConnection *conn, unsigned char flags);
-void ecp_conn_clr_flags(ECPConnection *conn, unsigned char flags);
-void ecp_conn_set_remote_key(ECPConnection *conn, ECPDHPub *key);
-void ecp_conn_set_remote_addr(ECPConnection *conn, ecp_tr_addr_t *addr);
-
-int ecp_conn_init_inb(ECPConnection *conn, ECPConnection *parent, unsigned char s_idx, unsigned char c_idx, ecp_ecdh_public_t *public, ECPDHPub *remote_key, ecp_aead_key_t *shkey);
-int ecp_conn_init_outb(ECPConnection *conn, ECPNode *node);
+void ecp_conn_free(ECPConnection *conn);
int ecp_conn_insert(ECPConnection *conn);
-int ecp_conn_insert_inb(ECPConnection *conn);
+int ecp_conn_insert_gc(ECPConnection *conn);
void ecp_conn_remove(ECPConnection *conn, unsigned short *refcount);
void ecp_conn_remove_addr(ECPConnection *conn);
+int _ecp_conn_open(ECPConnection *conn, ECPConnection *parent, ECPNode *node, int retry);
int ecp_conn_open(ECPConnection *conn, ECPNode *node);
-int ecp_conn_reset(ECPConnection *conn);
+int ecp_conn_try_open(ECPConnection *conn, ECPNode *node);
int _ecp_conn_close(ECPConnection *conn);
int ecp_conn_close(ECPConnection *conn);
+void ecp_conn_mark_closed(ECPConnection *conn);
+int _ecp_conn_expired(ECPConnection *conn, ecp_sts_t now, ecp_sts_t to);
+int ecp_conn_is_zombie(ECPConnection *conn, ecp_sts_t now, ecp_sts_t to);
void ecp_conn_refcount_inc(ECPConnection *conn);
void ecp_conn_refcount_dec(ECPConnection *conn);
+void ecp_conn_set_flags(ECPConnection *conn, unsigned char flags);
+void ecp_conn_clr_flags(ECPConnection *conn, unsigned char flags);
+void ecp_conn_set_remote_key(ECPConnection *conn, ECPDHPub *key);
+void ecp_conn_set_remote_addr(ECPConnection *conn, ecp_tr_addr_t *addr);
+
int ecp_conn_dhkey_new(ECPConnection *conn);
int ecp_conn_dhkey_get(ECPConnection *conn, unsigned char idx, ECPDHKey *key);
int ecp_conn_dhkey_get_remote(ECPConnection *conn, unsigned char idx, ECPDHPub *key);
@@ -375,24 +388,26 @@ int ecp_conn_dhkey_get_pub(ECPConnection *conn, unsigned char *idx, ecp_ecdh_pub
int ecp_conn_dhkey_set_pub(ECPConnection *conn, unsigned char idx, ecp_ecdh_public_t *public);
void ecp_conn_dhkey_set_curr(ECPConnection *conn);
-void ecp_conn_handler_init(ECPConnHandler *handler, ecp_msg_handler_t handle_msg, ecp_open_handler_t handle_open, ecp_close_handler_t handle_close, ecp_open_send_t send_open);
+void ecp_conn_handler_init(ECPConnHandler *handler, ecp_msg_handler_t handle_msg, ecp_open_handler_t handle_open, ecp_close_handler_t handle_close, ecp_send_open_t send_open);
ecp_msg_handler_t ecp_get_msg_handler(ECPConnection *conn);
ecp_open_handler_t ecp_get_open_handler(ECPConnection *conn);
ecp_close_handler_t ecp_get_close_handler(ECPConnection *conn);
-ecp_dir_handler_t ecp_get_dir_handler(ECPConnection *conn);
+ecp_send_open_t ecp_get_send_open_f(ECPConnection *conn);
void ecp_err_handle(ECPConnection *conn, unsigned char mtype, int err);
-ssize_t ecp_send_init_req(ECPConnection *conn);
-ssize_t ecp_handle_init_req(ECPSocket *sock, ECPConnection *parent, ecp_tr_addr_t *addr, unsigned char c_idx, unsigned char *public_buf, ecp_aead_key_t *shkey);
+ssize_t ecp_send_init_req(ECPConnection *conn, int retry);
+ssize_t ecp_handle_init_req(ECPSocket *sock, ECPConnection *parent, ecp_tr_addr_t *addr, unsigned char c_idx, unsigned char *public_buf, ecp_aead_key_t *shkey, ECP2Buffer *bufs);
ssize_t ecp_send_init_rep(ECPSocket *sock, ECPConnection *parent, ecp_tr_addr_t *addr, unsigned char c_idx, unsigned char *public_buf, ecp_aead_key_t *shkey);
-ssize_t ecp_handle_init_rep(ECPConnection *conn, unsigned char *msg, size_t msg_size);
+ssize_t ecp_handle_init_rep(ECPConnection *conn, unsigned char *msg, size_t msg_size, ECP2Buffer *bufs);
+
ssize_t ecp_write_open_req(ECPConnection *conn, ECPBuffer *payload);
ssize_t ecp_send_open_req(ECPConnection *conn, unsigned char *cookie);
ssize_t ecp_handle_open_req(ECPSocket *sock, ECPConnection *parent, unsigned char s_idx, unsigned char c_idx, unsigned char *public_buf, unsigned char *msg, size_t msg_size, ecp_aead_key_t *shkey, ECPConnection **_conn);
ssize_t ecp_send_open_rep(ECPConnection *conn);
-ssize_t ecp_handle_open(ECPConnection *conn, unsigned char mtype, unsigned char *msg, size_t msg_size, ECP2Buffer *bufs);
+ssize_t ecp_check_open(ECPConnection *conn, unsigned char mtype, unsigned char *msg, size_t msg_size);
+int ecp_handle_open(ECPConnection *conn, ECP2Buffer *bufs);
-ssize_t ecp_send_keyx_req(ECPConnection *conn);
+ssize_t ecp_send_keyx_req(ECPConnection *conn, int retry);
ssize_t ecp_send_keyx_rep(ECPConnection *conn);
ssize_t ecp_handle_keyx(ECPConnection *conn, unsigned char mtype, unsigned char *msg, size_t msg_size, ECP2Buffer *bufs);
@@ -400,7 +415,7 @@ ssize_t ecp_msg_handle(ECPConnection *conn, ecp_seq_t seq, unsigned char mtype,
ssize_t ecp_pld_handle_one(ECPConnection *conn, ecp_seq_t seq, unsigned char *payload, size_t pld_size, ECP2Buffer *bufs);
ssize_t ecp_pld_handle(ECPConnection *conn, ecp_seq_t seq, unsigned char *payload, size_t _pld_size, ECP2Buffer *bufs);
-ssize_t ecp_unpack(ECPSocket *sock, ECPConnection *parent, ecp_tr_addr_t *addr, ECP2Buffer *bufs, size_t _pkt_size, ECPConnection **_conn, unsigned char **_payload, ecp_seq_t *_seq);
+ssize_t ecp_unpack(ECPSocket *sock, ECPConnection *parent, ecp_tr_addr_t *addr, ECP2Buffer *bufs, size_t _pkt_size, ECPConnection **_conn, unsigned char **_payload, ecp_seq_t *_seq, int *is_open_msg);
ssize_t ecp_pkt_handle(ECPSocket *sock, ECPConnection *parent, ecp_tr_addr_t *addr, ECP2Buffer *bufs, size_t pkt_size);
ssize_t ecp_pkt_send(ECPSocket *sock, ECPBuffer *packet, size_t pkt_size, unsigned char flags, ECPTimerItem *ti, ecp_tr_addr_t *addr);