diff options
Diffstat (limited to 'src/tools/cbr')
-rw-r--r-- | src/tools/cbr/CMakeLists.txt | 16 | ||||
-rw-r--r-- | src/tools/cbr/cbr.c | 159 | ||||
-rw-r--r-- | src/tools/cbr/cbr_client.c | 164 | ||||
-rw-r--r-- | src/tools/cbr/cbr_server.c | 260 |
4 files changed, 0 insertions, 599 deletions
diff --git a/src/tools/cbr/CMakeLists.txt b/src/tools/cbr/CMakeLists.txt deleted file mode 100644 index 158b5c87..00000000 --- a/src/tools/cbr/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -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 - cbr.c - ) - -add_executable(cbr ${SOURCE_FILES}) - -target_link_libraries(cbr LINK_PUBLIC ouroboros-dev) - -install(TARGETS cbr RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/src/tools/cbr/cbr.c b/src/tools/cbr/cbr.c deleted file mode 100644 index abba8ebe..00000000 --- a/src/tools/cbr/cbr.c +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - 2018 - * - * CBR traffic generator - * - * Dimitri Staessens <[email protected]> - * Sander Vrijders <[email protected]> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#define _POSIX_C_SOURCE 199506L -#define __XSI_VISIBLE 500 - -#include <stdio.h> -#include <string.h> -#include <sys/time.h> -#include <limits.h> -#include <time.h> -#include <stdbool.h> - -#define BUF_SIZE 1500 - -#include "cbr_client.c" - -struct s { - long interval; - long timeout; -} server_settings; - -#include "cbr_server.c" - -static void usage(void) -{ - printf("Usage: cbr [OPTION]...\n" - "Sends SDUs from client to server at a constant bit rate.\n\n" - " -l, --listen Run in server mode\n" - "\n" - "Server options:\n" - " -i, --interval Server report interval (s)\n" - " -t, --timeout Server timeout interval (s)\n" - "\n" - "Client options:\n" - " -n, --server_apn Specify the name of the server.\n" - " -d, --duration Duration for sending (s)\n" - " -f, --flood Send SDUs as fast as possible\n" - " -s, --size SDU size (B)\n" - " -r, --rate Rate (b/s)\n" - " --sleep Sleep in between sending SDUs\n" - "\n\n" - " --help Display this help text and exit\n"); -} - -int main(int argc, char ** argv) -{ - int duration = 60; /* One minute test */ - int size = 1000; /* 1000 byte SDUs */ - long rate = 1000000; /* 1 Mb/s */ - bool flood = false; - bool sleep = false; - int ret = 0; - char * rem = NULL; - char * s_apn = NULL; - - bool server = false; - - server_settings.interval = 1; /* One second reporting interval */ - server_settings.timeout = 1; - - argc--; - argv++; - while (argc > 0) { - if (strcmp(*argv, "-i") == 0 || - strcmp(*argv, "--interval") == 0) { - server_settings.interval = strtol(*(++argv), &rem, 10); - --argc; - } else if (strcmp(*argv, "-t") == 0 || - strcmp(*argv, "--timeout") == 0) { - server_settings.timeout = strtol(*(++argv), &rem, 10); - --argc; - } else if (strcmp(*argv, "-n") == 0 || - strcmp(*argv, "--server_apn") == 0) { - s_apn = *(++argv); - --argc; - } else if (strcmp(*argv, "-d") == 0 || - strcmp(*argv, "--duration") == 0) { - duration = strtol(*(++argv), &rem, 10); - --argc; - } else if (strcmp(*argv, "-s") == 0 || - strcmp(*argv, "--size") == 0) { - size = strtol(*(++argv), &rem, 10); - --argc; - } else if (strcmp(*argv, "-r") == 0 || - strcmp(*argv, "--rate") == 0) { - rate = strtol(*(++argv), &rem, 10); - if (*rem == 'k') - rate *= 1000; - if (*rem == 'M') - rate *= MILLION; - if (*rem == 'G') - rate *= BILLION; - --argc; - } else if (strcmp(*argv, "-l") == 0 || - strcmp(*argv, "--listen") == 0) { - server = true; - } else if (strcmp(*argv, "-f") == 0 || - strcmp(*argv, "--flood") == 0) { - flood = true; - } else if (strcmp(*argv, "--sleep") == 0) { - sleep = true; - } else { - usage(); - return 0; - } - argc--; - argv++; - } - - if (server) { - ret = server_main(); - } else { - if (s_apn == NULL) { - printf("No server specified.\n"); - usage(); - return 0; - } - - ret = client_main(s_apn, duration, size, rate, flood, sleep); - } - - return ret; -} diff --git a/src/tools/cbr/cbr_client.c b/src/tools/cbr/cbr_client.c deleted file mode 100644 index bf527317..00000000 --- a/src/tools/cbr/cbr_client.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - 2018 - * - * A simple CBR generator - * - * Dimitri Staessens <[email protected]> - * Sander Vrijders <[email protected]> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <ouroboros/dev.h> -#include <ouroboros/time_utils.h> - -#include <signal.h> - -volatile bool stop; - -static void shutdown_client(int signo, siginfo_t * info, void * c) -{ - (void) info; - (void) c; - - switch(signo) { - case SIGINT: - case SIGTERM: - case SIGHUP: - stop = true; - default: - return; - } -} - -static void busy_wait_until(const struct timespec * deadline) -{ - struct timespec now; - clock_gettime(CLOCK_REALTIME, &now); - while (now.tv_sec < deadline->tv_sec) - clock_gettime(CLOCK_REALTIME, &now); - while (now.tv_sec == deadline->tv_sec - && now.tv_nsec < deadline->tv_nsec) - clock_gettime(CLOCK_REALTIME, &now); -} - -int client_main(char * server, - int duration, - int size, - long rate, - bool flood, - bool sleep) -{ - struct sigaction sig_act; - - int fd = 0; - char buf[size]; - long seqnr = 0; - long gap = size * 8.0 * (BILLION / (double) rate); - - struct timespec start; - struct timespec end; - struct timespec intv = {(gap / BILLION), gap % BILLION}; - int ms; - - stop = false; - - memset(&sig_act, 0, sizeof sig_act); - sig_act.sa_sigaction = &shutdown_client; - sig_act.sa_flags = 0; - - if (sigaction(SIGINT, &sig_act, NULL) || - sigaction(SIGTERM, &sig_act, NULL) || - sigaction(SIGHUP, &sig_act, NULL) || - sigaction(SIGPIPE, &sig_act, NULL)) { - printf("Failed to install sighandler.\n"); - return -1; - } - - printf("Client started, duration %d, rate %lu b/s, size %d B.\n", - duration, rate, size); - - fd = flow_alloc(server, NULL, NULL); - if (fd < 0) { - printf("Failed to allocate flow.\n"); - return -1; - } - - clock_gettime(CLOCK_REALTIME, &start); - if (!flood) { - while (!stop) { - clock_gettime(CLOCK_REALTIME, &end); - ts_add(&end, &intv, &end); - memcpy(buf, &seqnr, sizeof(seqnr)); - - if (flow_write(fd, buf, size) < 0) { - stop = true; - continue; - } - - if (sleep) - nanosleep(&intv, NULL); - else - busy_wait_until(&end); - - ++seqnr; - - if (ts_diff_us(&start, &end) / MILLION >= duration) - stop = true; - } - } else { /* flood */ - while (!stop) { - clock_gettime(CLOCK_REALTIME, &end); - if (flow_write(fd, buf, (size_t) size) < 0) { - stop = true; - continue; - } - - ++seqnr; - - if (ts_diff_us(&start, &end) / MILLION - >= (long) duration) - stop = true; - } - - } - - clock_gettime(CLOCK_REALTIME, &end); - - ms = ts_diff_ms(&start, &end); - - printf("sent statistics: " - "%9ld SDUs, %12ld bytes in %9d ms, %4.4f Mb/s\n", - seqnr, seqnr * size, ms, (seqnr / (ms * 1000.0)) * size * 8.0); - - flow_dealloc(fd); - - return 0; -} diff --git a/src/tools/cbr/cbr_server.c b/src/tools/cbr/cbr_server.c deleted file mode 100644 index 874155ed..00000000 --- a/src/tools/cbr/cbr_server.c +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - 2018 - * - * A simple CBR generator - * - * Dimitri Staessens <[email protected]> - * Sander Vrijders <[email protected]> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <ouroboros/dev.h> -#include <ouroboros/time_utils.h> -#include <ouroboros/fccntl.h> - -#include <stdbool.h> - -#ifdef __FreeBSD__ -#define __XSI_VISIBLE 500 -#endif - -#include <signal.h> -#include <unistd.h> -#include <stdlib.h> -#include <pthread.h> - -#define THREADS_SIZE 10 - -pthread_t listen_thread; -pthread_t threads[THREADS_SIZE]; -int fds[THREADS_SIZE]; -int fds_count = 0; -int fds_index = 0; -pthread_mutex_t fds_lock; -pthread_cond_t fds_signal; - -static void shutdown_server(int signo, siginfo_t * info, void * c) -{ - (void) info; - (void) c; - - switch(signo) { - case SIGINT: - case SIGTERM: - case SIGHUP: - pthread_cancel(listen_thread); - default: - return; - } -} - -static void handle_flow(int fd) -{ - int count = 0; - char buf[BUF_SIZE]; - - struct timespec now; - struct timespec alive; - struct timespec intv = {server_settings.interval, 0}; - - struct timespec iv_start; - struct timespec iv_end; - - bool stop = false; - - long sdus = 0; - long sdus_intv = 0; - long bytes_read = 0; - long bytes_read_intv = 0; - - - clock_gettime(CLOCK_REALTIME, &iv_start); - alive = iv_start; - ts_add(&iv_start, &intv, &iv_end); - - fccntl(fd, FLOWSFLAGS, FLOWFNONBLOCK); - - while (!stop) { - clock_gettime(CLOCK_REALTIME, &now); - - count = flow_read(fd, buf, BUF_SIZE); - - if (count > 0) { - clock_gettime(CLOCK_REALTIME, &alive); - sdus++; - bytes_read += count; - } - - if (ts_diff_us(&alive, &now) - > server_settings.timeout * MILLION) { - printf("Test on flow %d timed out\n", fd); - stop = true; - } - - if (stop || ts_diff_ms(&now, &iv_end) < 0) { - long us = ts_diff_us(&iv_start, &now); - printf("Flow %4d: %9ld SDUs (%12ld bytes) in %9ld ms" - " => %9.4f p/s, %9.4f Mb/s\n", - fd, - sdus - sdus_intv, - bytes_read - bytes_read_intv, - us / 1000, - ((sdus - sdus_intv) / (double) us) * MILLION, - 8 * ((bytes_read - bytes_read_intv) - / (double)(us))); - iv_start = iv_end; - sdus_intv = sdus; - bytes_read_intv = bytes_read; - ts_add(&iv_start, &intv, &iv_end); - } - } - - flow_dealloc(fd); -} - -static void * worker(void * o) -{ - int cli_fd; - - (void) o; - - while (true) { - pthread_mutex_lock(&fds_lock); - pthread_cleanup_push((void(*)(void *)) pthread_mutex_unlock, - (void *) &fds_lock); - while (fds[fds_index] == -1) - pthread_cond_wait(&fds_signal, &fds_lock); - - cli_fd = fds[fds_index]; - fds[fds_index] = -1; - - pthread_cleanup_pop(true); - - handle_flow(cli_fd); - - pthread_mutex_lock(&fds_lock); - fds_count--; - - pthread_cond_signal(&fds_signal); - pthread_mutex_unlock(&fds_lock); - } - - return 0; -} - -static void * listener(void * o) -{ - int fd = 0; - qosspec_t qs; - - (void) o; - - printf("Server started, interval is %ld s, timeout is %ld s.\n", - server_settings.interval, server_settings.timeout); - - while (true) { - pthread_mutex_lock(&fds_lock); - pthread_cleanup_push((void(*)(void *)) pthread_mutex_unlock, - (void *) &fds_lock); - - while (fds_count == THREADS_SIZE) { - printf("Can't accept any more flows, waiting.\n"); - pthread_cond_wait(&fds_signal, &fds_lock); - } - - pthread_cleanup_pop(true); - - fd = flow_accept(&qs, NULL); - if (fd < 0) { - printf("Failed to accept flow.\n"); - break; - } - - printf("New flow.\n"); - - pthread_mutex_lock(&fds_lock); - - fds_count++; - fds_index = (fds_index + 1) % THREADS_SIZE; - fds[fds_index] = fd; - - pthread_cond_signal(&fds_signal); - pthread_mutex_unlock(&fds_lock); - } - - return 0; -} - -int server_main(void) -{ - struct sigaction sig_act; - int i; - - memset(&sig_act, 0, sizeof sig_act); - sig_act.sa_sigaction = &shutdown_server; - sig_act.sa_flags = 0; - - for (i = 0; i < THREADS_SIZE; i++) - fds[i] = -1; - - if (sigaction(SIGINT, &sig_act, NULL) || - sigaction(SIGTERM, &sig_act, NULL) || - sigaction(SIGHUP, &sig_act, NULL) || - sigaction(SIGPIPE, &sig_act, NULL)) { - printf("Failed to install sighandler.\n"); - return -1; - } - - if (pthread_mutex_init(&fds_lock, NULL)) { - printf("Failed to init mutex.\n"); - exit(EXIT_FAILURE); - } - - if (pthread_cond_init(&fds_signal, NULL)) { - printf("Failed to init cond.\n"); - return -1; - } - - for (i = 0; i < THREADS_SIZE; i++) - pthread_create(&threads[i], NULL, worker, NULL); - - pthread_create(&listen_thread, NULL, listener, NULL); - - pthread_join(listen_thread, NULL); - - for (i = 0; i < THREADS_SIZE; i++) - pthread_cancel(threads[i]); - - for (i = 0; i < THREADS_SIZE; i++) - pthread_join(threads[i], NULL); - - return 0; -} |