From eb9f44379d5316e7f7e9311d7a66d2041eca743a Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sat, 7 May 2016 16:11:09 +0200 Subject: irmd: flow allocation and fast path This commit has a first implementation of flow allocation (the "slow path") and read/write (the "fast path") for ouroboros. It provides basic but unstable communications over the shared memory. It required a lot of changes all over the stack, and fixes a number of previously undetected issues. This PR still need heavy revision regarding data model, locking and cleanup. lib/dev: modifications to the API. It now uses an ap_init() call to set the AP name and sets the Instance ID to the pid of the process. It also binds the AP to the shared memory and creates tables for mappings in the fast path. A call to ap_fini() releases the resources. lib/shm_ap_rbuff: added ring buffer for data exchange between processes in the fast path. It passes an index in the shm_du_map. lib/shm_du_map: rewrote API to work with calls from dev.c. Garbage collector added. Tests updated to new API. ipcpd/ipcp-data: removed everything related to flows, as these are universal for all ap's and kept in ap_data (dev.c), or similar structs for shim ipcps. shim-udp: added flow allocator and read/write functions and shm elements. irmd: revised data model and structures necessary for flow allocation. tools: echo updated to new dev.h API. messaging system was updated to comply with new flow allocation messages. All exchanges use pid and port_id to bootstrap the fast path. --- src/tools/echo/echo_server.c | 53 ++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 19 deletions(-) (limited to 'src/tools/echo/echo_server.c') diff --git a/src/tools/echo/echo_server.c b/src/tools/echo/echo_server.c index e457e22b..4b1a17b1 100644 --- a/src/tools/echo/echo_server.c +++ b/src/tools/echo/echo_server.c @@ -20,6 +20,8 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include + #include #include #include @@ -27,71 +29,82 @@ #include +#ifdef OUROBOROS_CONFIG_DEBUG + #define OUROBOROS_PREFIX "echo-server" + #include +#endif + #define DIF_NAME "*" void shutdown_server(int signo) { char * dif = DIF_NAME; - if (ap_unreg(SERVER_AP_NAME, &dif, 1)) { - printf("Failed to unregister application\n"); + if (ap_unreg(&dif, 1)) { + printf("Failed to unregister application.\n"); + ap_fini(); exit(EXIT_FAILURE); } + ap_fini(); exit(EXIT_SUCCESS); } int server_main() { - int server_fd = 0; - int client_fd = 0; + int server_fd = 0; + int client_fd = 0; char * dif = DIF_NAME; char * client_name = NULL; - uint8_t buf[BUF_SIZE]; + char buf[BUF_SIZE]; ssize_t count = 0; - printf("Starting the server\n"); + printf("Starting the server.\n"); /* Manual cleanup is required for now */ if (signal(SIGINT, shutdown_server) == SIG_ERR) { - printf("Can't install signal handler\n"); + printf("Can't install signal handler.\n"); return -1; } - server_fd = ap_reg(SERVER_AP_NAME, &dif, 1); - if (server_fd < 0) { - printf("Failed to register application\n"); + if(ap_init(SERVER_AP_NAME)) { return -1; } - printf("Echo server started...\n"); + server_fd = ap_reg(&dif, 1); + if (server_fd < 0) { + printf("Failed to register application.\n"); + ap_fini(); + return -1; + } while (true) { client_fd = flow_accept(server_fd, - client_name, NULL); + &client_name, NULL); if (client_fd < 0) { - continue; + printf("Failed to accept flow.\n"); + break; } - printf("New flow from %s\n", client_name); + printf("New flow from %s.\n", client_name); if (flow_alloc_resp(client_fd, 0)) { - printf("Failed to give an allocate response\n"); + printf("Failed to give an allocate response.\n"); flow_dealloc(client_fd); continue; } - count = flow_read(client_fd, buf, BUF_SIZE); + count = flow_read(client_fd, (void **) &buf, BUF_SIZE); if (count < 0) { - printf("Failed to read SDU\n"); + printf("Failed to read SDU.\n"); flow_dealloc(client_fd); continue; } - printf("Message from client is %.*s\n", (int) count, buf); + printf("Message from client is %.*s.\n", (int) count, buf); if (flow_write(client_fd, buf, count) == -1) { - printf("Failed to write SDU\n"); + printf("Failed to write SDU.\n"); flow_dealloc(client_fd); continue; } @@ -99,5 +112,7 @@ int server_main() flow_dealloc(client_fd); } + ap_fini(); + return 0; } -- cgit v1.2.3 From 7d0fcf6392be6a738d0ba7450b62f8c48062279a Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sun, 8 May 2016 16:14:35 +0200 Subject: lib/irmd/ipcpd/tools: fixes comments on eb9f443 --- src/irmd/main.c | 18 +++++++++++------- src/lib/bitmap.c | 9 ++++++--- src/lib/dev.c | 20 +++++++++++++++++--- src/tools/echo/echo_client.c | 4 +++- src/tools/echo/echo_server.c | 8 +------- 5 files changed, 38 insertions(+), 21 deletions(-) (limited to 'src/tools/echo/echo_server.c') diff --git a/src/irmd/main.c b/src/irmd/main.c index 75b8506e..a6403612 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -53,7 +53,7 @@ #endif #ifndef IRMD_THREADPOOL_SIZE - #define IRMD_THREADPOOL_SIZE 10 + #define IRMD_THREADPOOL_SIZE 3 #endif @@ -467,7 +467,7 @@ static int bootstrap_ipcp(instance_name_t * api, return -1; } - LOG_INFO("Bootstrapped IPCP %s-%d. in DIF %s", + LOG_INFO("Bootstrapped IPCP %s-%d in DIF %s.", api->name, api->id, conf->dif_name); return 0; @@ -1178,7 +1178,7 @@ static struct irm * irm_create() i->sockfd = server_socket_open(IRM_SOCK_PATH); if (i->sockfd < 0) { - irm_destroy(instance); + irm_destroy(i); return NULL; } @@ -1200,10 +1200,14 @@ int main() sig_act.sa_sigaction = &irmd_sig_handler; sig_act.sa_flags = SA_SIGINFO; - sigaction(SIGINT, &sig_act, NULL); - sigaction(SIGTERM, &sig_act, NULL); - sigaction(SIGHUP, &sig_act, NULL); - sigaction(SIGPIPE, &sig_act, NULL); + if (sigaction(SIGINT, &sig_act, NULL) < 0) + exit(1); + if (sigaction(SIGTERM, &sig_act, NULL) < 0) + exit(1); + if (sigaction(SIGHUP, &sig_act, NULL) < 0) + exit(1); + if (sigaction(SIGPIPE, &sig_act, NULL) < 0) + exit(1); instance = irm_create(); if (instance == NULL) diff --git a/src/lib/bitmap.c b/src/lib/bitmap.c index 0e3c968f..e84145b2 100644 --- a/src/lib/bitmap.c +++ b/src/lib/bitmap.c @@ -112,7 +112,7 @@ struct bmp * bmp_create(size_t bits, ssize_t offset) return NULL; tmp->bitmap = malloc(BITS_TO_LONGS(bits) * sizeof(unsigned long)); - if (!tmp->bitmap) { + if (tmp->bitmap == NULL) { free(tmp); return NULL; } @@ -142,6 +142,9 @@ int bmp_destroy(struct bmp * b) static ssize_t bad_id(struct bmp * b) { + if (b == NULL) + return -1; + return b->offset - 1; } @@ -177,7 +180,7 @@ static bool is_id_valid(struct bmp * b, bool bmp_is_id_valid(struct bmp * b, ssize_t id) { - if (!b) + if (b == NULL) return false; return is_id_valid(b, id); @@ -188,7 +191,7 @@ int bmp_release(struct bmp * b, { ssize_t rid; - if (!b) + if (b == NULL) return -1; if (!is_id_valid(b, id)) diff --git a/src/lib/dev.c b/src/lib/dev.c index 40bf2dc3..c99e8cdb 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -249,12 +249,26 @@ int flow_accept(int fd, return -1; } + *ap_name = strdup(recv_msg->ap_name); + if (*ap_name == NULL) { + bmp_release(_ap_instance->fds, cfd); + irm_msg__free_unpacked(recv_msg, NULL); + return -1; + } + + if (ae_name != NULL) { + *ae_name = strdup(recv_msg->ae_name); + if (*ae_name == NULL) { + bmp_release(_ap_instance->fds, cfd); + irm_msg__free_unpacked(recv_msg, NULL); + return -1; + } + } + _ap_instance->flows[cfd].port_id = recv_msg->port_id; _ap_instance->flows[cfd].oflags = FLOW_O_DEFAULT; - *ap_name = strdup(recv_msg->ap_name); - if (ae_name != NULL) - *ae_name = strdup(recv_msg->ae_name); + irm_msg__free_unpacked(recv_msg, NULL); diff --git a/src/tools/echo/echo_client.c b/src/tools/echo/echo_client.c index 36942028..9cf56cee 100644 --- a/src/tools/echo/echo_client.c +++ b/src/tools/echo/echo_client.c @@ -33,8 +33,10 @@ int client_main() char * message = "Client says hi!"; ssize_t count = 0; - if(ap_init(CLIENT_AP_NAME)) + if(ap_init(CLIENT_AP_NAME)) { + printf("Failed to init AP."); return -1; + } fd = flow_alloc(SERVER_AP_NAME, NULL, NULL); if (fd < 0) { diff --git a/src/tools/echo/echo_server.c b/src/tools/echo/echo_server.c index 4b1a17b1..d9af1c1f 100644 --- a/src/tools/echo/echo_server.c +++ b/src/tools/echo/echo_server.c @@ -20,8 +20,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include - #include #include #include @@ -29,11 +27,6 @@ #include -#ifdef OUROBOROS_CONFIG_DEBUG - #define OUROBOROS_PREFIX "echo-server" - #include -#endif - #define DIF_NAME "*" void shutdown_server(int signo) @@ -68,6 +61,7 @@ int server_main() } if(ap_init(SERVER_AP_NAME)) { + printf("Failed to init AP."); return -1; } -- cgit v1.2.3