From 9a51510ab3eb1b286f585b5025b356d3cea14f7f Mon Sep 17 00:00:00 2001 From: Brian Tierney Date: Sat, 24 Oct 2009 21:15:04 +0000 Subject: [PATCH] more cleanup: separate file for main routine --- src/Makefile | 2 +- src/iperf_api.c | 161 +--------------------------------------- src/iperf_api.h | 2 + src/main.c | 194 ++++++++++++++++++++++++++++++++++++++++++++++++ src/net.c | 4 +- src/tcp_info.c | 3 +- 6 files changed, 204 insertions(+), 162 deletions(-) create mode 100644 src/main.c diff --git a/src/Makefile b/src/Makefile index 3e5c10c..6c62d4c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,5 +1,5 @@ CFLAGS=-g -Wall -OBJS=iperf_api.o timer.o net.o tcp_window_size.o units.o uuid.o tcp_info.o locale.o +OBJS=main.o iperf_api.o timer.o net.o tcp_window_size.o units.o uuid.o tcp_info.o locale.o LDFLAGS= UNAME=$(shell uname) diff --git a/src/iperf_api.c b/src/iperf_api.c index dd99a50..2a0b3df 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -7,9 +7,9 @@ /* * TO DO list: - * test TCP_INFO on Linux * restructure code pull out main.c * cleanup/fix/test UDP mode + # IPV6 * add verbose and debug options * lots more testing * see issue tracker for other wish list items @@ -182,9 +182,8 @@ add_interval_list(struct iperf_stream_result * rp, struct iperf_interval_results ip->bytes_transferred = temp.bytes_transferred; ip->interval_duration = temp.interval_duration; -#if defined(linux) || defined(__FreeBSD__) ip->tcpInfo = temp.tcpInfo; -#endif + //printf("add_interval_list: Mbytes = %d, duration = %f \n", (int) (ip->bytes_transferred / 1000000), ip->interval_duration); if (!rp->interval_results) @@ -1729,159 +1728,3 @@ iperf_run(struct iperf_test * test) printf("Done iperf_run. \n"); } - -/**************************************************************************/ - -static struct option longopts[] = -{ - {"client", required_argument, NULL, 'c'}, - {"server", no_argument, NULL, 's'}, - {"time", required_argument, NULL, 't'}, - {"port", required_argument, NULL, 'p'}, - {"parallel", required_argument, NULL, 'P'}, - {"udp", no_argument, NULL, 'u'}, - {"tcpInfo", no_argument, NULL, 'T'}, - {"bandwidth", required_argument, NULL, 'b'}, - {"length", required_argument, NULL, 'l'}, - {"window", required_argument, NULL, 'w'}, - {"interval", required_argument, NULL, 'i'}, - {"bytes", required_argument, NULL, 'n'}, - {"NoDelay", no_argument, NULL, 'N'}, - {"Print-mss", no_argument, NULL, 'm'}, - {"Set-mss", required_argument, NULL, 'M'}, - {"help", no_argument, NULL, 'h'}, - {NULL, 0, NULL, 0} -}; - -/**************************************************************************/ - -int -main(int argc, char **argv) -{ - - char ch, role; - struct iperf_test *test; - int port = PORT; - -#ifdef TEST_PROC_AFFINITY - /* didnt seem to work.... */ - /* - * increasing the priority of the process to minimise packet generation - * delay - */ - int rc = setpriority(PRIO_PROCESS, 0, -15); - - if (rc < 0) - { - perror("setpriority:"); - printf("setting priority to valid level\n"); - rc = setpriority(PRIO_PROCESS, 0, 0); - } - /* setting the affinity of the process */ - cpu_set_t cpu_set; - int affinity = -1; - int ncores = 1; - - sched_getaffinity(0, sizeof(cpu_set_t), &cpu_set); - if (errno) - perror("couldn't get affinity:"); - - if ((ncores = sysconf(_SC_NPROCESSORS_CONF)) <= 0) - err("sysconf: couldn't get _SC_NPROCESSORS_CONF"); - - CPU_ZERO(&cpu_set); - CPU_SET(affinity, &cpu_set); - if (sched_setaffinity(0, sizeof(cpu_set_t), &cpu_set) != 0) - err("couldn't change CPU affinity"); -#endif - - test = iperf_new_test(); - iperf_defaults(test); /* sets defaults */ - - while ((ch = getopt_long(argc, argv, "c:p:st:uP:b:l:w:i:n:mNThM:f:", longopts, NULL)) != -1) - { - switch (ch) - { - case 'c': - test->role = 'c'; - role = test->role; - test->server_hostname = (char *) malloc(strlen(optarg)); - strncpy(test->server_hostname, optarg, strlen(optarg)); - break; - case 'p': - test->server_port = atoi(optarg); - port = test->server_port; - break; - case 's': - test->role = 's'; - role = test->role; - break; - case 't': - test->duration = atoi(optarg); - break; - case 'u': - test->protocol = Pudp; - test->default_settings->blksize = DEFAULT_UDP_BLKSIZE; - test->new_stream = iperf_new_udp_stream; - break; - case 'P': - test->num_streams = atoi(optarg); - break; - case 'b': - test->default_settings->rate = unit_atof(optarg); - break; - case 'l': - test->default_settings->blksize = unit_atoi(optarg); - printf("%d is the blksize\n", test->default_settings->blksize); - break; - case 'w': - test->default_settings->socket_bufsize = unit_atof(optarg); - break; - case 'i': - test->stats_interval = atoi(optarg); - test->reporter_interval = atoi(optarg); - break; - case 'n': - test->default_settings->bytes = unit_atoi(optarg); - printf("total bytes to be transferred = %llu\n", test->default_settings->bytes); - break; - case 'm': - test->print_mss = 1; - break; - case 'N': - test->no_delay = 1; - break; - case 'M': - test->default_settings->mss = atoi(optarg); - break; - case 'f': - test->default_settings->unit_format = *optarg; - break; - case 'T': - test->tcp_info = 1; - break; - case 'h': - default: - fprintf(stderr, usage_long1); - fprintf(stderr, usage_long2); - exit(1); - } - } - - - //printf("in main: calling iperf_init_test \n"); - printf("Connection to port %d on host %s \n", test->server_port, test->server_hostname); - iperf_init_test(test); - - if (test->role == 'c') /* if client, send params to server */ - { - exchange_parameters(test); - test->streams->settings->state = STREAM_BEGIN; - } - //printf("in main: calling iperf_run \n"); - iperf_run(test); - iperf_free_test(test); - - printf("\niperf Done.\n"); - exit(0); -} diff --git a/src/iperf_api.h b/src/iperf_api.h index 91a055c..a10b604 100644 --- a/src/iperf_api.h +++ b/src/iperf_api.h @@ -18,6 +18,8 @@ struct iperf_interval_results #if defined(linux) || defined(__FreeBSD__) struct tcp_info tcpInfo; /* getsockopt(TCP_INFO) results here for * Linux and FreeBSD stored here */ +#else + char *tcpInfo; /* just a placeholder */ #endif struct iperf_interval_results *next; void *custom_data; diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..96020d4 --- /dev/null +++ b/src/main.c @@ -0,0 +1,194 @@ + +/* + * Copyright (c) 2004, The Regents of the University of California, through + * Lawrence Berkeley National Laboratory (subject to receipt of any required + * approvals from the U.S. Dept. of Energy). All rights reserved. + */ + +/* + * TO DO list: + * restructure code pull out main.c + * cleanup/fix/test UDP mode + # IPV6 + * add verbose and debug options + * lots more testing + * see issue tracker for other wish list items + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "iperf_api.h" +#include "units.h" +#include "locale.h" + + +/**************************************************************************/ + +static struct option longopts[] = +{ + {"client", required_argument, NULL, 'c'}, + {"server", no_argument, NULL, 's'}, + {"time", required_argument, NULL, 't'}, + {"port", required_argument, NULL, 'p'}, + {"parallel", required_argument, NULL, 'P'}, + {"udp", no_argument, NULL, 'u'}, + {"tcpInfo", no_argument, NULL, 'T'}, + {"bandwidth", required_argument, NULL, 'b'}, + {"length", required_argument, NULL, 'l'}, + {"window", required_argument, NULL, 'w'}, + {"interval", required_argument, NULL, 'i'}, + {"bytes", required_argument, NULL, 'n'}, + {"NoDelay", no_argument, NULL, 'N'}, + {"Print-mss", no_argument, NULL, 'm'}, + {"Set-mss", required_argument, NULL, 'M'}, + {"help", no_argument, NULL, 'h'}, + {NULL, 0, NULL, 0} +}; + +/**************************************************************************/ + +int +main(int argc, char **argv) +{ + + char ch, role; + struct iperf_test *test; + int port = PORT; + +#ifdef TEST_PROC_AFFINITY + /* didnt seem to work.... */ + /* + * increasing the priority of the process to minimise packet generation + * delay + */ + int rc = setpriority(PRIO_PROCESS, 0, -15); + + if (rc < 0) + { + perror("setpriority:"); + printf("setting priority to valid level\n"); + rc = setpriority(PRIO_PROCESS, 0, 0); + } + /* setting the affinity of the process */ + cpu_set_t cpu_set; + int affinity = -1; + int ncores = 1; + + sched_getaffinity(0, sizeof(cpu_set_t), &cpu_set); + if (errno) + perror("couldn't get affinity:"); + + if ((ncores = sysconf(_SC_NPROCESSORS_CONF)) <= 0) + err("sysconf: couldn't get _SC_NPROCESSORS_CONF"); + + CPU_ZERO(&cpu_set); + CPU_SET(affinity, &cpu_set); + if (sched_setaffinity(0, sizeof(cpu_set_t), &cpu_set) != 0) + err("couldn't change CPU affinity"); +#endif + + test = iperf_new_test(); + iperf_defaults(test); /* sets defaults */ + + while ((ch = getopt_long(argc, argv, "c:p:st:uP:b:l:w:i:n:mNThM:f:", longopts, NULL)) != -1) + { + switch (ch) + { + case 'c': + test->role = 'c'; + role = test->role; + test->server_hostname = (char *) malloc(strlen(optarg)); + strncpy(test->server_hostname, optarg, strlen(optarg)); + break; + case 'p': + test->server_port = atoi(optarg); + port = test->server_port; + break; + case 's': + test->role = 's'; + role = test->role; + break; + case 't': + test->duration = atoi(optarg); + break; + case 'u': + test->protocol = Pudp; + test->default_settings->blksize = DEFAULT_UDP_BLKSIZE; + test->new_stream = iperf_new_udp_stream; + break; + case 'P': + test->num_streams = atoi(optarg); + break; + case 'b': + test->default_settings->rate = unit_atof(optarg); + break; + case 'l': + test->default_settings->blksize = unit_atoi(optarg); + printf("%d is the blksize\n", test->default_settings->blksize); + break; + case 'w': + test->default_settings->socket_bufsize = unit_atof(optarg); + break; + case 'i': + test->stats_interval = atoi(optarg); + test->reporter_interval = atoi(optarg); + break; + case 'n': + test->default_settings->bytes = unit_atoi(optarg); + printf("total bytes to be transferred = %llu\n", test->default_settings->bytes); + break; + case 'm': + test->print_mss = 1; + break; + case 'N': + test->no_delay = 1; + break; + case 'M': + test->default_settings->mss = atoi(optarg); + break; + case 'f': + test->default_settings->unit_format = *optarg; + break; + case 'T': + test->tcp_info = 1; + break; + case 'h': + default: + fprintf(stderr, usage_long1); + fprintf(stderr, usage_long2); + exit(1); + } + } + + + //printf("in main: calling iperf_init_test \n"); + printf("Connection to port %d on host %s \n", test->server_port, test->server_hostname); + iperf_init_test(test); + + if (test->role == 'c') /* if client, send params to server */ + { + exchange_parameters(test); + test->streams->settings->state = STREAM_BEGIN; + } + //printf("in main: calling iperf_run \n"); + iperf_run(test); + iperf_free_test(test); + + printf("\niperf Done.\n"); + exit(0); +} diff --git a/src/net.c b/src/net.c index 4941511..32560bd 100644 --- a/src/net.c +++ b/src/net.c @@ -19,7 +19,9 @@ netdial(int proto, char *client, int port) struct sockaddr_in sa; socklen_t sn; - /* XXX: should this be called server?? -blt */ + /* XXX: This is not working for non-fully qualified host names + use getaddrinfo() instead? + */ if ((hent = gethostbyname(client)) == 0) { perror("gethostbyname"); diff --git a/src/tcp_info.c b/src/tcp_info.c index 507d9a1..a4463f7 100644 --- a/src/tcp_info.c +++ b/src/tcp_info.c @@ -6,9 +6,10 @@ * * Note that this is only supported on Linux and FreeBSD, and that for FreeBSD * only the following are returned: tcpi_snd_ssthresh, tcpi_snd_cwnd, - * tcpi_rcv_space, tcpi_rtt + * tcpi_rcv_space, tcpi_rtt, so not all that useful on FreeBSD yet */ + #include #include #include