From 4a6d383192ac59195cfe927f5a0b1eb104da5550 Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Thu, 6 Jun 2024 22:33:46 +0200 Subject: open / keyx sync implemented; vconn close fixed; rendezvous hashing fixed --- ecp/server/server.c | 173 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 113 insertions(+), 60 deletions(-) (limited to 'ecp/server/server.c') diff --git a/ecp/server/server.c b/ecp/server/server.c index fd8b317..91287e2 100644 --- a/ecp/server/server.c +++ b/ecp/server/server.c @@ -24,13 +24,12 @@ static SRVConfig srv_config; static int proc_forked = 0; -static pthread_t rcvr_thd[MAX_THREADS]; + +/* dir client result sync */ static pthread_mutex_t dir_sync_mutex; static pthread_cond_t dir_sync_cond; static int dir_sync_res = 0; -static FILE *log_file = NULL; -int log_level; static const char *log_level_str[] = { "ERROR", "INFO", @@ -131,7 +130,7 @@ static int core_logger(const char *format, ...) { return 0; } -int ecp_init(ECPContext *ctx, ECPConnHandler *vconn_handler, ECPConnHandler *vlink_handler) { +static int ecp_init(ECPContext *ctx, ECPConnHandler *vconn_handler, ECPConnHandler *vlink_handler) { int rv; rv = ecp_ctx_init(ctx, conn_auth, conn_new, conn_free, handle_err, core_logger); @@ -146,10 +145,29 @@ int ecp_init(ECPContext *ctx, ECPConnHandler *vconn_handler, ECPConnHandler *vli return ECP_OK; } +int conn_expired(ECPConnection *conn, ecp_sts_t now) { + switch (conn->type) { + case CTYPE_DIR: + return _ecp_conn_is_zombie(conn, now, ANN_PERIOD * 3); + case ECP_CTYPE_VLINK: + if (conn->parent) { + return _ecp_conn_is_zombie(conn, now, VCONN_EXPIRE_TO); + } else { + return _ecp_conn_is_zombie(conn, now, KEYX_PERIOD * 3); + } + return _ecp_conn_is_zombie(conn, now, KEYX_PERIOD * 3); + case ECP_CTYPE_VCONN: + return _ecp_conn_is_zombie(conn, now, VCONN_EXPIRE_TO); + case ECP_CTYPE_DIR: + return _ecp_conn_is_zombie(conn, now, DIR_EXPIRE_TO); + } + return 0; +} + void log_vprintf(int level, const char *format, va_list ap) { FILE *file; - if (level > log_level) return; + if (level > srv_config.log_level) return; if (level >= (sizeof(log_level_str) / sizeof(char *))) return; file = srv_config.log_file ? srv_config.log_file : stderr; @@ -183,7 +201,7 @@ void log_vprintf(int level, const char *format, va_list ap) { void log_printf(int level, const char *format, ...) { va_list ap; - if (level > log_level) return; + if (level > srv_config.log_level) return; va_start(ap, format); log_vprintf(level, format, ap); @@ -275,29 +293,30 @@ static int start_receivers(ECPSocket *sock) { int i, rv; for (i=0; icount; i++) { - if (list->items[i].roles & ECP_ROLE_DIR) dir_cnt++; + for (i=0; icount; i++) { + if (dir_list->items[i].roles & ECP_ROLE_DIR) dir_cnt++; } - rv = dir_init_dir_cnt(dir_cnt, list->serial); + rv = dir_init_dir_cnt(dir_cnt, dir_list->serial); if (rv) fail("Bad timing\n"); - for (i=0; icount; i++) { - dir_process_item(&list->items[i], sock, NULL); + for (i=0; icount; i++) { + dir_process_item(&dir_list->items[i], srv_config.sock, NULL); } - ecp_dir_list_destroy(list); + ecp_dir_list_destroy(dir_list); pthread_mutex_lock(&dir_sync_mutex); dir_sync_res = 1; @@ -306,16 +325,16 @@ static void dir_result(ECPSocket *sock, ECPDirList *list, int rv) { } int main(int argc, char *argv[]) { - char *endptr; - char *init_switch; ecp_ecdh_public_t remote_pub; ecp_tr_addr_t remote_addr; ECPContext ctx; ECPSocket sock; - ECPConnection dir_conn; ECPConnHandler vconn_handler; ECPConnHandler vlink_handler; - ECPConnHandler dir_handler; + char opt; + char *opt_arg; + char *endptr; + char *init_switch; int _argi, _argc, remote, fd; int rv; @@ -328,72 +347,74 @@ int main(int argc, char *argv[]) { srv_config.rcvr_thd_num = 1; while (_argc && (argv[_argi][0] == '-')) { - switch (argv[_argi][1]) { + if (strlen(argv[_argi]) < 2) usage(argv[0]); + opt = argv[_argi][1]; + switch (opt) { case 'd': { _argi++; _argc--; + break; + } + + case 't': + case 'l': + case 'f': + case 'u': + case 'g': { + if (strlen(argv[_argi]) > 2) { + opt_arg = argv[_argi] + 2; + _argi++; + _argc--; + } else { + _argi++; + _argc--; + if (_argc == 0) usage(argv[0]); + opt_arg = argv[_argi]; + _argi++; + _argc--; + } + break; + } + + default: + usage(argv[0]); + } + switch (opt) { + case 'd': { srv_config.detach = 1; break; } case 't': { - _argi++; - _argc--; - if (_argc == 0) usage(argv[0]); - srv_config.rcvr_thd_num = (unsigned int)strtol(argv[_argi], &endptr, 10); - if (endptr[0] != '\0') fail("Bad number of receiver threads: %s\n", argv[_argi]); + srv_config.rcvr_thd_num = (unsigned int)strtol(opt_arg, &endptr, 10); + if (endptr[0] != '\0') fail("Bad number of receiver threads: %s\n", opt_arg); if (srv_config.rcvr_thd_num > MAX_THREADS) fail ("Maximum number of threads allowed: %d\n", MAX_THREADS); - _argi++; - _argc--; break; } case 'l': { - _argi++; - _argc--; - if (_argc == 0) usage(argv[0]); - log_level = (uint8_t)strtol(argv[_argi], &endptr, 10); - if (endptr[0] != '\0') fail("Bad log level: %s\n", argv[_argi]); - if (log_level > LOG_MAX_LEVEL) fail("Maximum log level allowed: %d\n", LOG_MAX_LEVEL); - _argi++; - _argc--; + srv_config.log_level = (unsigned int)strtol(opt_arg, &endptr, 10); + if (endptr[0] != '\0') fail("Bad log level: %s\n", opt_arg); + if (srv_config.log_level > LOG_MAX_LEVEL) fail("Maximum log level allowed: %d\n", LOG_MAX_LEVEL); break; } case 'f': { - _argi++; - _argc--; - if (_argc == 0) usage(argv[0]); - srv_config.log_fn = strdup(argv[_argi]); - _argi++; - _argc--; + srv_config.log_fn = strdup(opt_arg); break; } case 'u': { - _argi++; - _argc--; - if (_argc == 0) usage(argv[0]); - srv_config.uid = (uid_t)strtol(argv[_argi], &endptr, 10); - if (endptr[0] != '\0') fail("Bad uid: %s\n", argv[_argi]); - _argi++; - _argc--; + srv_config.uid = (uid_t)strtol(opt_arg, &endptr, 10); + if (endptr[0] != '\0') fail("Bad uid: %s\n", opt_arg); break; } case 'g': { - _argi++; - _argc--; - if (_argc == 0) usage(argv[0]); - srv_config.gid = (gid_t)strtol(argv[_argi], &endptr, 10); - if (endptr[0] != '\0') fail("Bad gid: %s\n", argv[_argi]); - _argi++; - _argc--; + srv_config.gid = (gid_t)strtol(opt_arg, &endptr, 10); + if (endptr[0] != '\0') fail("Bad gid: %s\n", opt_arg); break; } - - default: - usage(argv[0]); } } @@ -487,6 +508,7 @@ int main(int argc, char *argv[]) { rv = ecp_sock_open(&sock, &srv_config.my_addr); if (rv) fail("ecp_sock_open err:%d\n", rv); + srv_config.sock = &sock; if (srv_config.uid || srv_config.gid) { if (srv_config.gid) { @@ -511,11 +533,37 @@ int main(int argc, char *argv[]) { init_switch = getenv("ECP_INITSW"); if (remote) { if (init_switch == NULL) { + ECPContext ctx; + ECPSocket sock; + ECPConnHandler dir_handler; + ECPConnection *dir_conn; + + rv = pthread_mutex_init(&dir_sync_mutex, NULL); + if (rv) fail("pthread_mutex_init (client) failed\n"); + + rv = pthread_cond_init(&dir_sync_cond, NULL); + if (rv) fail("pthread_cond_init (client) failed\n"); + + rv = ecp_ctx_init(&ctx, NULL, NULL, (ecp_conn_free_t)free, handle_err, core_logger); + if (rv) fail("ecp_ctx_init (client) err:%d\n", rv); + rv = ecp_dir_set_handler(&ctx, &dir_handler, dir_result); - if (rv) fail("ecp_dir_set_handler err:%d\n", rv); + if (rv) fail("ecp_dir_set_handler (client) err:%d\n", rv); + + rv = ecp_sock_create(&sock, &ctx, NULL); + if (rv) fail("ecp_sock_create (client) err:%d\n", rv); + + rv = ecp_sock_open(&sock, NULL); + if (rv) fail("ecp_sock_open (client) err:%d\n", rv); + + rv = ecp_start_receiver(&sock); + if (rv) fail("ecp_start_receiver (client) err:%d\n", rv); - rv = ecp_dir_get(&dir_conn, &sock, &remote_pub, &remote_addr, 0); - if (rv) fail("ecp_dir_get err:%d\n", rv); + dir_conn = malloc(sizeof(ECPConnection)); + if (dir_conn == NULL) fail("dir_conn malloc (client) failed\n"); + + rv = ecp_dir_get(dir_conn, &sock, &remote_pub, &remote_addr, 0); + if (rv) fail("ecp_dir_get (client) err:%d\n", rv); pthread_mutex_lock(&dir_sync_mutex); while (dir_sync_res == 0) { @@ -523,6 +571,11 @@ int main(int argc, char *argv[]) { } pthread_mutex_unlock(&dir_sync_mutex); LOG(LOG_DEBUG, "ecp_dir_get: done\n"); + + rv = ecp_stop_receiver(&sock); + if (rv) fail("ecp_stop_receiver (client) err:%d\n", rv); + + ecp_sock_close(&sock); } else { rv = dir_init_ann(&sock, &remote_pub, &remote_addr); if (rv) fail("dir_init_ann err:%d\n", rv); -- cgit v1.2.3