diff options
-rw-r--r-- | ecp/src/ecp/core.c | 76 | ||||
-rw-r--r-- | ecp/src/ecp/core.h | 1 |
2 files changed, 68 insertions, 9 deletions
diff --git a/ecp/src/ecp/core.c b/ecp/src/ecp/core.c index 03fa815..9fd857b 100644 --- a/ecp/src/ecp/core.c +++ b/ecp/src/ecp/core.c @@ -643,6 +643,57 @@ void ecp_sock_expire(ECPSocket *sock, ecp_conn_expired_t conn_expired) { conn_table_expire(sock, conn_expired); } +ECPConnection *ecp_sock_search_gc(ECPSocket *sock, ecp_ecdh_public_t *public) { + ECPConnection *conn = NULL; + int i, rv; + +#ifdef ECP_WITH_HTABLE +#ifdef ECP_WITH_PTHREAD + pthread_mutex_lock(&sock->conn_table.mutex_gc); +#endif + + conn = ecp_ht_search(sock->conn_table.keys_gc, public); + if (conn) { + rv = ecp_conn_refcount_inc(conn); + if (rv) conn = NULL; + } + +#ifdef ECP_WITH_PTHREAD + pthread_mutex_lock(&sock->conn_table.mutex_gc); +#endif +#else /* ECP_WITH_HTABLE */ +#ifdef ECP_WITH_PTHREAD + pthread_mutex_lock(&sock->conn_table.mutex); +#endif + + for (i=0; i<sock->conn_table.size; i++) { + ECPConnection *_conn = sock->conn_table.arr[i]; + +#ifdef ECP_WITH_PTHREAD + pthread_mutex_lock(&_conn->mutex); +#endif + + if (_ecp_conn_in_gct(_conn) && (memcmp(&_conn->remote.key_perma.public, public) == 0)) { + /* conn has to be registered to be in conn_table */ + _conn->refcount++; + conn = _conn; + } + +#ifdef ECP_WITH_PTHREAD + pthread_mutex_unlock(&_conn->mutex); +#endif + + if (conn) break; + } + +#ifdef ECP_WITH_PTHREAD + pthread_mutex_lock(&sock->conn_table.mutex); +#endif +#endif /* ECP_WITH_HTABLE */ + + return conn; +} + void ecp_atag_gen(ECPSocket *sock, unsigned char *public_buf, unsigned char *atag, ecp_nonce_t *nonce) { unsigned char msg[ECP_SIZE_ECDH_PUB+ECP_SIZE_NONCE]; ecp_hmac_key_t key; @@ -1154,16 +1205,17 @@ int ecp_conn_insert_gc(ECPConnection *conn) { ECPSocket *sock = conn->sock; int rv = ECP_OK; +#ifdef ECP_WITH_HTABLE #ifdef ECP_WITH_PTHREAD pthread_mutex_lock(&sock->conn_table.mutex_gc); #endif +#endif rv = ecp_conn_refcount_inc(conn); if (!rv) { #ifdef ECP_WITH_HTABLE rv = ecp_ht_insert(sock->conn_table.keys_gc, &conn->remote.key_perma.public, conn); - if (rv) ecp_conn_refcount_dec(conn); #else /* ECP_WITH_HTABLE */ @@ -1171,18 +1223,23 @@ int ecp_conn_insert_gc(ECPConnection *conn) { pthread_mutex_lock(&conn->mutex); #endif - _ecp_conn_push_gct(conn); + if (!_ecp_conn_is_reg(conn)) rv = ECP_CONN_CLOSED; + if (!rv) _ecp_conn_push_gct(conn); #ifdef ECP_WITH_PTHREAD pthread_mutex_unlock(&conn->mutex); #endif #endif /* ECP_WITH_HTABLE */ + + if (rv) ecp_conn_refcount_dec(conn); } +#ifdef ECP_WITH_HTABLE #ifdef ECP_WITH_PTHREAD pthread_mutex_unlock(&sock->conn_table.mutex_gc); #endif +#endif return rv; } @@ -1199,8 +1256,8 @@ int _ecp_conn_remove(ECPConnection *conn) { if (!_ecp_conn_is_reg(conn)) rv = ECP_ERR_CLOSED; if (!rv && _ecp_conn_is_open(conn)) rv = ECP_ERR_BUSY; if (!rv) { - conn_table_remove(conn); _ecp_conn_clr_reg(conn); + conn_table_remove(conn); } #ifdef ECP_WITH_PTHREAD @@ -1220,8 +1277,8 @@ void ecp_conn_remove(ECPConnection *conn) { #endif if (_ecp_conn_is_reg(conn)) { - conn_table_remove(conn); _ecp_conn_clr_reg(conn); + conn_table_remove(conn); } #ifdef ECP_WITH_PTHREAD @@ -1250,12 +1307,17 @@ void ecp_conn_remove_gc(ECPConnection *conn) { ECPSocket *sock = conn->sock; ECPConnection *_conn = NULL; +#ifdef ECP_WITH_HTABLE #ifdef ECP_WITH_PTHREAD pthread_mutex_lock(&sock->conn_table.mutex_gc); #endif -#ifdef ECP_WITH_HTABLE _conn = ecp_ht_remove_kv(sock->conn_table.keys_gc, &conn->remote.key_perma.public, conn); + +#ifdef ECP_WITH_PTHREAD + pthread_mutex_unlock(&sock->conn_table.mutex_gc); +#endif + #else /* ECP_WITH_HTABLE */ #ifdef ECP_WITH_PTHREAD @@ -1273,10 +1335,6 @@ void ecp_conn_remove_gc(ECPConnection *conn) { #endif /* ECP_WITH_HTABLE */ -#ifdef ECP_WITH_PTHREAD - pthread_mutex_unlock(&sock->conn_table.mutex_gc); -#endif - if (_conn) { ecp_conn_refcount_dec(conn); } diff --git a/ecp/src/ecp/core.h b/ecp/src/ecp/core.h index 8b76895..36c5e42 100644 --- a/ecp/src/ecp/core.h +++ b/ecp/src/ecp/core.h @@ -399,6 +399,7 @@ 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_expire(ECPSocket *sock, ecp_conn_expired_t conn_expired); +ECPConnection *ecp_sock_search_gc(ECPSocket *sock, ecp_ecdh_public_t *public); void ecp_atag_gen(ECPSocket *sock, unsigned char *public_buf, unsigned char *atag, ecp_nonce_t *nonce); int ecp_cookie_verify(ECPSocket *sock, unsigned char *cookie, unsigned char *public_buf); |