diff options
author | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-03-21 17:41:29 +0100 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-03-21 17:41:29 +0100 |
commit | 3c6f5161b2903c1bf59bcc959301a7390c3c5c79 (patch) | |
tree | 87aaeaea67881739220cf7a89d7b9a1a668e20f2 | |
parent | 02681c391cbc1cc08f2dea5d8499f301d9321147 (diff) | |
download | ouroboros-3c6f5161b2903c1bf59bcc959301a7390c3c5c79.tar.gz ouroboros-3c6f5161b2903c1bf59bcc959301a7390c3c5c79.zip |
tools: Simple echo application
This adds a simple echo application written to show application how to
use the API. It also updates the dev.h header file with the insights
gained from performing this excercise.
-rw-r--r-- | include/ouroboros/common.h | 2 | ||||
-rw-r--r-- | include/ouroboros/dev.h | 32 | ||||
-rw-r--r-- | src/lib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/lib/dev.c | 104 | ||||
-rw-r--r-- | src/tools/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/tools/echo/CMakeLists.txt | 16 | ||||
-rw-r--r-- | src/tools/echo/echo.c | 57 | ||||
-rw-r--r-- | src/tools/echo/echo_client.c | 69 | ||||
-rw-r--r-- | src/tools/echo/echo_server.c | 103 | ||||
-rw-r--r-- | src/tools/irm/irm.c | 3 |
10 files changed, 368 insertions, 20 deletions
diff --git a/include/ouroboros/common.h b/include/ouroboros/common.h index 1ff4267b..7114ed73 100644 --- a/include/ouroboros/common.h +++ b/include/ouroboros/common.h @@ -28,8 +28,6 @@ #include <stdbool.h> #include <errno.h> -typedef uint32_t port_id_t; - typedef struct { uint8_t * data; size_t size; diff --git a/include/ouroboros/dev.h b/include/ouroboros/dev.h index 217352ef..39194abd 100644 --- a/include/ouroboros/dev.h +++ b/include/ouroboros/dev.h @@ -23,30 +23,30 @@ #ifndef OUROBOROS_DEV_H #define OUROBOROS_DEV_H -#include "common.h" - -struct qos_spec * list_qos_cubes(rina_name_t dst, - struct qos_spec min_qos); +#include <ouroboros/common.h> /* Returns file descriptor */ -int ap_reg(rina_name_t name, char ** difs); -int ap_unreg(rina_name_t name, char ** difs); +int ap_reg(char * ap_name, char * ae_name, + char ** difs, size_t difs_size); +int ap_unreg(char * ap_name, char * ae_name, + char ** difs, size_t difs_size); -/* Returns file descriptor (> 0) */ -int flow_accept(int fd, rina_name_t * name); -int flow_alloc_resp(int fd, int result); +/* Returns file descriptor (> 0) and client name(s) */ +int flow_accept(int fd, char * ap_name, char * ae_name); +int flow_alloc_resp(int fd, int result); /* Returns file descriptor */ -int flow_alloc(rina_name_t src, rina_name_t dst, - struct qos_spec qos, int oflags); +int flow_alloc(char * dst_ap_name, char * dst_ae_name, + char * src_ap_name, char * src_ae_name, + struct qos_spec * qos, int oflags); /* If flow is accepted returns a value > 0 */ -int flow_alloc_res(int fd); -int flow_dealloc(int fd); +int flow_alloc_res(int fd); +int flow_dealloc(int fd); /* Wraps around fnctl */ -int flow_cntl(int fd, int oflags); -int flow_write(int fd, buffer_t * sdu); -int flow_read(int fd, buffer_t * sdu); +int flow_cntl(int fd, int oflags); +ssize_t flow_write(int fd, void * buf, size_t count); +ssize_t flow_read(int fd, void * buf, size_t count); #endif diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index eaff2ddb..e81f3475 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -9,6 +9,7 @@ set(SOURCE_FILES bitmap.c cdap.c da.c + dev.c du_buff.c ipcp.c irm.c diff --git a/src/lib/dev.c b/src/lib/dev.c new file mode 100644 index 00000000..c072c5ef --- /dev/null +++ b/src/lib/dev.c @@ -0,0 +1,104 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * API for applications + * + * Sander Vrijders <sander.vrijders@intec.ugent.be> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define OUROBOROS_PREFIX "libouroboros-dev" + +#include <ouroboros/logs.h> +#include <ouroboros/dev.h> + +int ap_reg(char * ap_name, char * ae_name, + char ** difs, size_t difs_size) +{ + LOG_MISSING; + + return -1; +} + +int ap_unreg(char * ap_name, char * ae_name, + char ** difs, size_t difs_size) +{ + LOG_MISSING; + + return -1; +} + +int flow_accept(int fd, char * ap_name, char * ae_name) +{ + LOG_MISSING; + + return -1; +} + +int flow_alloc_resp(int fd, int result) +{ + LOG_MISSING; + + return -1; +} + +int flow_alloc(char * dst_ap_name, char * dst_ae_name, + char * src_ap_name, char * src_ae_name, + struct qos_spec * qos, int oflags) +{ + LOG_MISSING; + + return -1; +} + +int flow_alloc_res(int fd) +{ + LOG_MISSING; + + return -1; +} + +int flow_dealloc(int fd) +{ + LOG_MISSING; + + return -1; +} + +int flow_cntl(int fd, int oflags) +{ + LOG_MISSING; + + return -1; +} + +ssize_t flow_write(int fd, + void * buf, + size_t count) +{ + LOG_MISSING; + + return -1; +} + +ssize_t flow_read(int fd, + void * buf, + size_t count) +{ + LOG_MISSING; + + return -1; +} diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt index 6e00c17b..73b749f8 100644 --- a/src/tools/CMakeLists.txt +++ b/src/tools/CMakeLists.txt @@ -1 +1,2 @@ add_subdirectory(irm) +add_subdirectory(echo) diff --git a/src/tools/echo/CMakeLists.txt b/src/tools/echo/CMakeLists.txt new file mode 100644 index 00000000..b3d88089 --- /dev/null +++ b/src/tools/echo/CMakeLists.txt @@ -0,0 +1,16 @@ +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +include_directories(${CMAKE_SOURCE_DIR}/include) +include_directories(${CMAKE_BINARY_DIR}/include) + +set(SOURCE_FILES + # Add source files here + echo.c +) + +add_executable(echo-app ${SOURCE_FILES}) + +target_link_libraries(echo-app LINK_PUBLIC ouroboros) + +install(TARGETS echo-app RUNTIME DESTINATION bin) diff --git a/src/tools/echo/echo.c b/src/tools/echo/echo.c new file mode 100644 index 00000000..849c0ca8 --- /dev/null +++ b/src/tools/echo/echo.c @@ -0,0 +1,57 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * A simple echo application + * + * Sander Vrijders <sander.vrijders@intec.ugent.be> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <stdio.h> +#include <string.h> + +#define SERVER_AP_NAME "echo-server" +#define BUF_SIZE 256 + +#include "echo_client.c" +#include "echo_server.c" + +static void usage() +{ + printf("Usage: echo-app [OPTION]...\n" + "Sends an echo between a server and a client\n\n" + " -l, --listen Run in server mode\n" + " --help Display this help text and exit\n"); +} + +int main(int argc, char ** argv) { + + argc--; + argv++; + while (argc > 0) { + if (strcmp(*argv, "-l") == 0 || + strcmp(*argv, "--listen") == 0) { + return server_main(); + } else { + usage(); + return 0; + } + argc--; + argv++; + } + + return client_main(); +} diff --git a/src/tools/echo/echo_client.c b/src/tools/echo/echo_client.c new file mode 100644 index 00000000..2f80a52a --- /dev/null +++ b/src/tools/echo/echo_client.c @@ -0,0 +1,69 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * A simple echo application + * + * Sander Vrijders <sander.vrijders@intec.ugent.be> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define CLIENT_AP_NAME "echo-client" + +#include <ouroboros/dev.h> +#include <ouroboros/rina_name.h> + +int client_main() +{ + int fd = 0; + int result = 0; + uint8_t buf[BUF_SIZE]; + char * message = "Client says hi!"; + ssize_t count = 0; + + fd = flow_alloc(SERVER_AP_NAME, NULL, + CLIENT_AP_NAME, NULL, + NULL, 0); + if (fd < 0) { + printf("Failed to allocate flow\n"); + return -1; + } + + result = flow_alloc_res(fd); + if (result < 0) { + printf("Flow allocation refused\n"); + flow_dealloc(fd); + return -1; + } + + if (flow_write(fd, message, strlen(message) + 1) == -1) { + printf("Failed to write SDU\n"); + flow_dealloc(fd); + return -1; + } + + count = flow_read(fd, buf, BUF_SIZE); + if (count < 0) { + printf("Failed to read SDU\n"); + flow_dealloc(fd); + return -1; + } + + printf("Server replied with %.*s\n", (int) count, buf); + + flow_dealloc(fd); + + return 0; +} diff --git a/src/tools/echo/echo_server.c b/src/tools/echo/echo_server.c new file mode 100644 index 00000000..f9682ab7 --- /dev/null +++ b/src/tools/echo/echo_server.c @@ -0,0 +1,103 @@ +/* + * Ouroboros - Copyright (C) 2016 + * + * A simple echo application + * + * Sander Vrijders <sander.vrijders@intec.ugent.be> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <stdbool.h> +#include <signal.h> +#include <unistd.h> +#include <stdlib.h> + +#include <ouroboros/dev.h> +#include <ouroboros/rina_name.h> + +#define DIF_NAME "*" + +void shutdown_server(int signo) +{ + char * dif = DIF_NAME; + + if (ap_unreg(SERVER_AP_NAME, NULL, &dif, 1)) { + printf("Failed to unregister application\n"); + exit(EXIT_FAILURE); + } + + exit(EXIT_SUCCESS); +} + +int server_main() +{ + int server_fd = 0; + int client_fd = 0; + char * dif = DIF_NAME; + char * client_name = NULL; + uint8_t buf[BUF_SIZE]; + ssize_t count = 0; + + 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"); + return -1; + } + + server_fd = ap_reg(SERVER_AP_NAME, NULL, &dif, 1); + if (server_fd < 0) { + printf("Failed to register application\n"); + return -1; + } + + while (true) { + client_fd = flow_accept(server_fd, + client_name, NULL); + if (client_fd < 0) { + printf("Failed to accept flow\n"); + continue; + } + + printf("New flow from %s", client_name); + + if (flow_alloc_resp(client_fd, 0)) { + printf("Failed to give an allocate response\n"); + flow_dealloc(client_fd); + continue; + } + + count = flow_read(client_fd, buf, BUF_SIZE); + if (count < 0) { + printf("Failed to read SDU\n"); + flow_dealloc(client_fd); + continue; + } + + printf("Message from client is %.*s\n", (int) count, buf); + + if (flow_write(client_fd, buf, count) == -1) { + printf("Failed to write SDU\n"); + flow_dealloc(client_fd); + continue; + } + + flow_dealloc(client_fd); + } + + return 0; +} diff --git a/src/tools/irm/irm.c b/src/tools/irm/irm.c index 426118d1..895d52c2 100644 --- a/src/tools/irm/irm.c +++ b/src/tools/irm/irm.c @@ -73,8 +73,7 @@ static int do_cmd(const char * argv0, return -1; } - -int main (int argc, char ** argv) { +int main(int argc, char ** argv) { if (argc < 2) { usage(); |