1*7ab6e6acSAndroid Build Coastguard Worker /* 2*7ab6e6acSAndroid Build Coastguard Worker * iperf, Copyright (c) 2014-2020, The Regents of the University of 3*7ab6e6acSAndroid Build Coastguard Worker * California, through Lawrence Berkeley National Laboratory (subject 4*7ab6e6acSAndroid Build Coastguard Worker * to receipt of any required approvals from the U.S. Dept. of 5*7ab6e6acSAndroid Build Coastguard Worker * Energy). All rights reserved. 6*7ab6e6acSAndroid Build Coastguard Worker * 7*7ab6e6acSAndroid Build Coastguard Worker * If you have questions about your rights to use or distribute this 8*7ab6e6acSAndroid Build Coastguard Worker * software, please contact Berkeley Lab's Technology Transfer 9*7ab6e6acSAndroid Build Coastguard Worker * Department at [email protected]. 10*7ab6e6acSAndroid Build Coastguard Worker * 11*7ab6e6acSAndroid Build Coastguard Worker * NOTICE. This software is owned by the U.S. Department of Energy. 12*7ab6e6acSAndroid Build Coastguard Worker * As such, the U.S. Government has been granted for itself and others 13*7ab6e6acSAndroid Build Coastguard Worker * acting on its behalf a paid-up, nonexclusive, irrevocable, 14*7ab6e6acSAndroid Build Coastguard Worker * worldwide license in the Software to reproduce, prepare derivative 15*7ab6e6acSAndroid Build Coastguard Worker * works, and perform publicly and display publicly. Beginning five 16*7ab6e6acSAndroid Build Coastguard Worker * (5) years after the date permission to assert copyright is obtained 17*7ab6e6acSAndroid Build Coastguard Worker * from the U.S. Department of Energy, and subject to any subsequent 18*7ab6e6acSAndroid Build Coastguard Worker * five (5) year renewals, the U.S. Government is granted for itself 19*7ab6e6acSAndroid Build Coastguard Worker * and others acting on its behalf a paid-up, nonexclusive, 20*7ab6e6acSAndroid Build Coastguard Worker * irrevocable, worldwide license in the Software to reproduce, 21*7ab6e6acSAndroid Build Coastguard Worker * prepare derivative works, distribute copies to the public, perform 22*7ab6e6acSAndroid Build Coastguard Worker * publicly and display publicly, and to permit others to do so. 23*7ab6e6acSAndroid Build Coastguard Worker * 24*7ab6e6acSAndroid Build Coastguard Worker * This code is distributed under a BSD style license, see the LICENSE 25*7ab6e6acSAndroid Build Coastguard Worker * file for complete information. 26*7ab6e6acSAndroid Build Coastguard Worker */ 27*7ab6e6acSAndroid Build Coastguard Worker #ifndef __IPERF_H 28*7ab6e6acSAndroid Build Coastguard Worker #define __IPERF_H 29*7ab6e6acSAndroid Build Coastguard Worker 30*7ab6e6acSAndroid Build Coastguard Worker #include "iperf_config.h" 31*7ab6e6acSAndroid Build Coastguard Worker 32*7ab6e6acSAndroid Build Coastguard Worker #include <sys/time.h> 33*7ab6e6acSAndroid Build Coastguard Worker #include <sys/types.h> 34*7ab6e6acSAndroid Build Coastguard Worker #ifdef HAVE_STDINT_H 35*7ab6e6acSAndroid Build Coastguard Worker #include <stdint.h> 36*7ab6e6acSAndroid Build Coastguard Worker #endif 37*7ab6e6acSAndroid Build Coastguard Worker #include <sys/select.h> 38*7ab6e6acSAndroid Build Coastguard Worker #include <sys/socket.h> 39*7ab6e6acSAndroid Build Coastguard Worker #ifndef _GNU_SOURCE 40*7ab6e6acSAndroid Build Coastguard Worker # define _GNU_SOURCE 41*7ab6e6acSAndroid Build Coastguard Worker #endif 42*7ab6e6acSAndroid Build Coastguard Worker #include <netinet/tcp.h> 43*7ab6e6acSAndroid Build Coastguard Worker 44*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_CPUSET_SETAFFINITY) 45*7ab6e6acSAndroid Build Coastguard Worker #include <sys/param.h> 46*7ab6e6acSAndroid Build Coastguard Worker #include <sys/cpuset.h> 47*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_CPUSET_SETAFFINITY */ 48*7ab6e6acSAndroid Build Coastguard Worker 49*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_INTTYPES_H) 50*7ab6e6acSAndroid Build Coastguard Worker # include <inttypes.h> 51*7ab6e6acSAndroid Build Coastguard Worker #else 52*7ab6e6acSAndroid Build Coastguard Worker # ifndef PRIu64 53*7ab6e6acSAndroid Build Coastguard Worker # if sizeof(long) == 8 54*7ab6e6acSAndroid Build Coastguard Worker # define PRIu64 "lu" 55*7ab6e6acSAndroid Build Coastguard Worker # else 56*7ab6e6acSAndroid Build Coastguard Worker # define PRIu64 "llu" 57*7ab6e6acSAndroid Build Coastguard Worker # endif 58*7ab6e6acSAndroid Build Coastguard Worker # endif 59*7ab6e6acSAndroid Build Coastguard Worker #endif 60*7ab6e6acSAndroid Build Coastguard Worker 61*7ab6e6acSAndroid Build Coastguard Worker #include "timer.h" 62*7ab6e6acSAndroid Build Coastguard Worker #include "queue.h" 63*7ab6e6acSAndroid Build Coastguard Worker #include "cjson.h" 64*7ab6e6acSAndroid Build Coastguard Worker #include "iperf_time.h" 65*7ab6e6acSAndroid Build Coastguard Worker 66*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SSL) 67*7ab6e6acSAndroid Build Coastguard Worker #include <openssl/bio.h> 68*7ab6e6acSAndroid Build Coastguard Worker #include <openssl/evp.h> 69*7ab6e6acSAndroid Build Coastguard Worker #endif // HAVE_SSL 70*7ab6e6acSAndroid Build Coastguard Worker 71*7ab6e6acSAndroid Build Coastguard Worker #if !defined(__IPERF_API_H) 72*7ab6e6acSAndroid Build Coastguard Worker typedef uint64_t iperf_size_t; 73*7ab6e6acSAndroid Build Coastguard Worker #endif // __IPERF_API_H 74*7ab6e6acSAndroid Build Coastguard Worker 75*7ab6e6acSAndroid Build Coastguard Worker struct iperf_interval_results 76*7ab6e6acSAndroid Build Coastguard Worker { 77*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t bytes_transferred; /* bytes transfered in this interval */ 78*7ab6e6acSAndroid Build Coastguard Worker struct iperf_time interval_start_time; 79*7ab6e6acSAndroid Build Coastguard Worker struct iperf_time interval_end_time; 80*7ab6e6acSAndroid Build Coastguard Worker float interval_duration; 81*7ab6e6acSAndroid Build Coastguard Worker 82*7ab6e6acSAndroid Build Coastguard Worker /* for UDP */ 83*7ab6e6acSAndroid Build Coastguard Worker int interval_packet_count; 84*7ab6e6acSAndroid Build Coastguard Worker int interval_outoforder_packets; 85*7ab6e6acSAndroid Build Coastguard Worker int interval_cnt_error; 86*7ab6e6acSAndroid Build Coastguard Worker int packet_count; 87*7ab6e6acSAndroid Build Coastguard Worker double jitter; 88*7ab6e6acSAndroid Build Coastguard Worker int outoforder_packets; 89*7ab6e6acSAndroid Build Coastguard Worker int cnt_error; 90*7ab6e6acSAndroid Build Coastguard Worker 91*7ab6e6acSAndroid Build Coastguard Worker int omitted; 92*7ab6e6acSAndroid Build Coastguard Worker #if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)) && \ 93*7ab6e6acSAndroid Build Coastguard Worker defined(TCP_INFO) 94*7ab6e6acSAndroid Build Coastguard Worker struct tcp_info tcpInfo; /* getsockopt(TCP_INFO) for Linux, {Free,Net}BSD */ 95*7ab6e6acSAndroid Build Coastguard Worker #else 96*7ab6e6acSAndroid Build Coastguard Worker /* Just placeholders, never accessed. */ 97*7ab6e6acSAndroid Build Coastguard Worker char *tcpInfo; 98*7ab6e6acSAndroid Build Coastguard Worker #endif 99*7ab6e6acSAndroid Build Coastguard Worker int interval_retrans; 100*7ab6e6acSAndroid Build Coastguard Worker int interval_sacks; 101*7ab6e6acSAndroid Build Coastguard Worker int snd_cwnd; 102*7ab6e6acSAndroid Build Coastguard Worker TAILQ_ENTRY(iperf_interval_results) irlistentries; 103*7ab6e6acSAndroid Build Coastguard Worker void *custom_data; 104*7ab6e6acSAndroid Build Coastguard Worker int rtt; 105*7ab6e6acSAndroid Build Coastguard Worker int rttvar; 106*7ab6e6acSAndroid Build Coastguard Worker int pmtu; 107*7ab6e6acSAndroid Build Coastguard Worker }; 108*7ab6e6acSAndroid Build Coastguard Worker 109*7ab6e6acSAndroid Build Coastguard Worker struct iperf_stream_result 110*7ab6e6acSAndroid Build Coastguard Worker { 111*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t bytes_received; 112*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t bytes_sent; 113*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t bytes_received_this_interval; 114*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t bytes_sent_this_interval; 115*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t bytes_sent_omit; 116*7ab6e6acSAndroid Build Coastguard Worker int stream_prev_total_retrans; 117*7ab6e6acSAndroid Build Coastguard Worker int stream_retrans; 118*7ab6e6acSAndroid Build Coastguard Worker int stream_prev_total_sacks; 119*7ab6e6acSAndroid Build Coastguard Worker int stream_sacks; 120*7ab6e6acSAndroid Build Coastguard Worker int stream_max_rtt; 121*7ab6e6acSAndroid Build Coastguard Worker int stream_min_rtt; 122*7ab6e6acSAndroid Build Coastguard Worker int stream_sum_rtt; 123*7ab6e6acSAndroid Build Coastguard Worker int stream_count_rtt; 124*7ab6e6acSAndroid Build Coastguard Worker int stream_max_snd_cwnd; 125*7ab6e6acSAndroid Build Coastguard Worker struct iperf_time start_time; 126*7ab6e6acSAndroid Build Coastguard Worker struct iperf_time end_time; 127*7ab6e6acSAndroid Build Coastguard Worker struct iperf_time start_time_fixed; 128*7ab6e6acSAndroid Build Coastguard Worker double sender_time; 129*7ab6e6acSAndroid Build Coastguard Worker double receiver_time; 130*7ab6e6acSAndroid Build Coastguard Worker TAILQ_HEAD(irlisthead, iperf_interval_results) interval_results; 131*7ab6e6acSAndroid Build Coastguard Worker void *data; 132*7ab6e6acSAndroid Build Coastguard Worker }; 133*7ab6e6acSAndroid Build Coastguard Worker 134*7ab6e6acSAndroid Build Coastguard Worker #define COOKIE_SIZE 37 /* size of an ascii uuid */ 135*7ab6e6acSAndroid Build Coastguard Worker struct iperf_settings 136*7ab6e6acSAndroid Build Coastguard Worker { 137*7ab6e6acSAndroid Build Coastguard Worker int domain; /* AF_INET or AF_INET6 */ 138*7ab6e6acSAndroid Build Coastguard Worker int socket_bufsize; /* window size for TCP */ 139*7ab6e6acSAndroid Build Coastguard Worker int blksize; /* size of read/writes (-l) */ 140*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t rate; /* target data rate for application pacing*/ 141*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t bitrate_limit; /* server's maximum allowed total data rate for all streams*/ 142*7ab6e6acSAndroid Build Coastguard Worker double bitrate_limit_interval; /* interval for avaraging total data rate */ 143*7ab6e6acSAndroid Build Coastguard Worker int bitrate_limit_stats_per_interval; /* calculated number of stats periods for averaging total data rate */ 144*7ab6e6acSAndroid Build Coastguard Worker uint64_t fqrate; /* target data rate for FQ pacing*/ 145*7ab6e6acSAndroid Build Coastguard Worker int pacing_timer; /* pacing timer in microseconds */ 146*7ab6e6acSAndroid Build Coastguard Worker int burst; /* packets per burst */ 147*7ab6e6acSAndroid Build Coastguard Worker int mss; /* for TCP MSS */ 148*7ab6e6acSAndroid Build Coastguard Worker int ttl; /* IP TTL option */ 149*7ab6e6acSAndroid Build Coastguard Worker int tos; /* type of service bit */ 150*7ab6e6acSAndroid Build Coastguard Worker int flowlabel; /* IPv6 flow label */ 151*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t bytes; /* number of bytes to send */ 152*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t blocks; /* number of blocks (packets) to send */ 153*7ab6e6acSAndroid Build Coastguard Worker char unit_format; /* -f */ 154*7ab6e6acSAndroid Build Coastguard Worker int num_ostreams; /* SCTP initmsg settings */ 155*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SSL) 156*7ab6e6acSAndroid Build Coastguard Worker char *authtoken; /* Authentication token */ 157*7ab6e6acSAndroid Build Coastguard Worker char *client_username; 158*7ab6e6acSAndroid Build Coastguard Worker char *client_password; 159*7ab6e6acSAndroid Build Coastguard Worker EVP_PKEY *client_rsa_pubkey; 160*7ab6e6acSAndroid Build Coastguard Worker #endif // HAVE_SSL 161*7ab6e6acSAndroid Build Coastguard Worker int connect_timeout; /* socket connection timeout, in ms */ 162*7ab6e6acSAndroid Build Coastguard Worker }; 163*7ab6e6acSAndroid Build Coastguard Worker 164*7ab6e6acSAndroid Build Coastguard Worker struct iperf_test; 165*7ab6e6acSAndroid Build Coastguard Worker 166*7ab6e6acSAndroid Build Coastguard Worker struct iperf_stream 167*7ab6e6acSAndroid Build Coastguard Worker { 168*7ab6e6acSAndroid Build Coastguard Worker struct iperf_test* test; 169*7ab6e6acSAndroid Build Coastguard Worker 170*7ab6e6acSAndroid Build Coastguard Worker /* configurable members */ 171*7ab6e6acSAndroid Build Coastguard Worker int local_port; 172*7ab6e6acSAndroid Build Coastguard Worker int remote_port; 173*7ab6e6acSAndroid Build Coastguard Worker int socket; 174*7ab6e6acSAndroid Build Coastguard Worker int id; 175*7ab6e6acSAndroid Build Coastguard Worker int sender; 176*7ab6e6acSAndroid Build Coastguard Worker /* XXX: is settings just a pointer to the same struct in iperf_test? if not, 177*7ab6e6acSAndroid Build Coastguard Worker should it be? */ 178*7ab6e6acSAndroid Build Coastguard Worker struct iperf_settings *settings; /* pointer to structure settings */ 179*7ab6e6acSAndroid Build Coastguard Worker 180*7ab6e6acSAndroid Build Coastguard Worker /* non configurable members */ 181*7ab6e6acSAndroid Build Coastguard Worker struct iperf_stream_result *result; /* structure pointer to result */ 182*7ab6e6acSAndroid Build Coastguard Worker Timer *send_timer; 183*7ab6e6acSAndroid Build Coastguard Worker int green_light; 184*7ab6e6acSAndroid Build Coastguard Worker int buffer_fd; /* data to send, file descriptor */ 185*7ab6e6acSAndroid Build Coastguard Worker char *buffer; /* data to send, mmapped */ 186*7ab6e6acSAndroid Build Coastguard Worker int diskfile_fd; /* file to send, file descriptor */ 187*7ab6e6acSAndroid Build Coastguard Worker int diskfile_left; /* remaining file data on disk */ 188*7ab6e6acSAndroid Build Coastguard Worker 189*7ab6e6acSAndroid Build Coastguard Worker /* 190*7ab6e6acSAndroid Build Coastguard Worker * for udp measurements - This can be a structure outside stream, and 191*7ab6e6acSAndroid Build Coastguard Worker * stream can have a pointer to this 192*7ab6e6acSAndroid Build Coastguard Worker */ 193*7ab6e6acSAndroid Build Coastguard Worker int packet_count; 194*7ab6e6acSAndroid Build Coastguard Worker int peer_packet_count; 195*7ab6e6acSAndroid Build Coastguard Worker int omitted_packet_count; 196*7ab6e6acSAndroid Build Coastguard Worker double jitter; 197*7ab6e6acSAndroid Build Coastguard Worker double prev_transit; 198*7ab6e6acSAndroid Build Coastguard Worker int outoforder_packets; 199*7ab6e6acSAndroid Build Coastguard Worker int omitted_outoforder_packets; 200*7ab6e6acSAndroid Build Coastguard Worker int cnt_error; 201*7ab6e6acSAndroid Build Coastguard Worker int omitted_cnt_error; 202*7ab6e6acSAndroid Build Coastguard Worker uint64_t target; 203*7ab6e6acSAndroid Build Coastguard Worker 204*7ab6e6acSAndroid Build Coastguard Worker struct sockaddr_storage local_addr; 205*7ab6e6acSAndroid Build Coastguard Worker struct sockaddr_storage remote_addr; 206*7ab6e6acSAndroid Build Coastguard Worker 207*7ab6e6acSAndroid Build Coastguard Worker int (*rcv) (struct iperf_stream * stream); 208*7ab6e6acSAndroid Build Coastguard Worker int (*snd) (struct iperf_stream * stream); 209*7ab6e6acSAndroid Build Coastguard Worker 210*7ab6e6acSAndroid Build Coastguard Worker /* chained send/receive routines for -F mode */ 211*7ab6e6acSAndroid Build Coastguard Worker int (*rcv2) (struct iperf_stream * stream); 212*7ab6e6acSAndroid Build Coastguard Worker int (*snd2) (struct iperf_stream * stream); 213*7ab6e6acSAndroid Build Coastguard Worker 214*7ab6e6acSAndroid Build Coastguard Worker // struct iperf_stream *next; 215*7ab6e6acSAndroid Build Coastguard Worker SLIST_ENTRY(iperf_stream) streams; 216*7ab6e6acSAndroid Build Coastguard Worker 217*7ab6e6acSAndroid Build Coastguard Worker void *data; 218*7ab6e6acSAndroid Build Coastguard Worker }; 219*7ab6e6acSAndroid Build Coastguard Worker 220*7ab6e6acSAndroid Build Coastguard Worker struct protocol { 221*7ab6e6acSAndroid Build Coastguard Worker int id; 222*7ab6e6acSAndroid Build Coastguard Worker char *name; 223*7ab6e6acSAndroid Build Coastguard Worker int (*accept)(struct iperf_test *); 224*7ab6e6acSAndroid Build Coastguard Worker int (*listen)(struct iperf_test *); 225*7ab6e6acSAndroid Build Coastguard Worker int (*connect)(struct iperf_test *); 226*7ab6e6acSAndroid Build Coastguard Worker int (*send)(struct iperf_stream *); 227*7ab6e6acSAndroid Build Coastguard Worker int (*recv)(struct iperf_stream *); 228*7ab6e6acSAndroid Build Coastguard Worker int (*init)(struct iperf_test *); 229*7ab6e6acSAndroid Build Coastguard Worker SLIST_ENTRY(protocol) protocols; 230*7ab6e6acSAndroid Build Coastguard Worker }; 231*7ab6e6acSAndroid Build Coastguard Worker 232*7ab6e6acSAndroid Build Coastguard Worker struct iperf_textline { 233*7ab6e6acSAndroid Build Coastguard Worker char *line; 234*7ab6e6acSAndroid Build Coastguard Worker TAILQ_ENTRY(iperf_textline) textlineentries; 235*7ab6e6acSAndroid Build Coastguard Worker }; 236*7ab6e6acSAndroid Build Coastguard Worker 237*7ab6e6acSAndroid Build Coastguard Worker struct xbind_entry { 238*7ab6e6acSAndroid Build Coastguard Worker char *name; 239*7ab6e6acSAndroid Build Coastguard Worker struct addrinfo *ai; 240*7ab6e6acSAndroid Build Coastguard Worker TAILQ_ENTRY(xbind_entry) link; 241*7ab6e6acSAndroid Build Coastguard Worker }; 242*7ab6e6acSAndroid Build Coastguard Worker 243*7ab6e6acSAndroid Build Coastguard Worker enum iperf_mode { 244*7ab6e6acSAndroid Build Coastguard Worker SENDER = 1, 245*7ab6e6acSAndroid Build Coastguard Worker RECEIVER = 0, 246*7ab6e6acSAndroid Build Coastguard Worker BIDIRECTIONAL = -1 247*7ab6e6acSAndroid Build Coastguard Worker }; 248*7ab6e6acSAndroid Build Coastguard Worker 249*7ab6e6acSAndroid Build Coastguard Worker struct iperf_test 250*7ab6e6acSAndroid Build Coastguard Worker { 251*7ab6e6acSAndroid Build Coastguard Worker char role; /* 'c' lient or 's' erver */ 252*7ab6e6acSAndroid Build Coastguard Worker enum iperf_mode mode; 253*7ab6e6acSAndroid Build Coastguard Worker int sender_has_retransmits; 254*7ab6e6acSAndroid Build Coastguard Worker int other_side_has_retransmits; /* used if mode == BIDIRECTIONAL */ 255*7ab6e6acSAndroid Build Coastguard Worker struct protocol *protocol; 256*7ab6e6acSAndroid Build Coastguard Worker signed char state; 257*7ab6e6acSAndroid Build Coastguard Worker char *server_hostname; /* -c option */ 258*7ab6e6acSAndroid Build Coastguard Worker char *tmp_template; 259*7ab6e6acSAndroid Build Coastguard Worker char *bind_address; /* first -B option */ 260*7ab6e6acSAndroid Build Coastguard Worker TAILQ_HEAD(xbind_addrhead, xbind_entry) xbind_addrs; /* all -X opts */ 261*7ab6e6acSAndroid Build Coastguard Worker int bind_port; /* --cport option */ 262*7ab6e6acSAndroid Build Coastguard Worker int server_port; 263*7ab6e6acSAndroid Build Coastguard Worker int omit; /* duration of omit period (-O flag) */ 264*7ab6e6acSAndroid Build Coastguard Worker int duration; /* total duration of test (-t flag) */ 265*7ab6e6acSAndroid Build Coastguard Worker char *diskfile_name; /* -F option */ 266*7ab6e6acSAndroid Build Coastguard Worker int affinity, server_affinity; /* -A option */ 267*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_CPUSET_SETAFFINITY) 268*7ab6e6acSAndroid Build Coastguard Worker cpuset_t cpumask; 269*7ab6e6acSAndroid Build Coastguard Worker #endif /* HAVE_CPUSET_SETAFFINITY */ 270*7ab6e6acSAndroid Build Coastguard Worker char *title; /* -T option */ 271*7ab6e6acSAndroid Build Coastguard Worker char *extra_data; /* --extra-data */ 272*7ab6e6acSAndroid Build Coastguard Worker char *congestion; /* -C option */ 273*7ab6e6acSAndroid Build Coastguard Worker char *congestion_used; /* what was actually used */ 274*7ab6e6acSAndroid Build Coastguard Worker char *remote_congestion_used; /* what the other side used */ 275*7ab6e6acSAndroid Build Coastguard Worker char *pidfile; /* -P option */ 276*7ab6e6acSAndroid Build Coastguard Worker 277*7ab6e6acSAndroid Build Coastguard Worker char *logfile; /* --logfile option */ 278*7ab6e6acSAndroid Build Coastguard Worker FILE *outfile; 279*7ab6e6acSAndroid Build Coastguard Worker 280*7ab6e6acSAndroid Build Coastguard Worker int ctrl_sck; 281*7ab6e6acSAndroid Build Coastguard Worker int listener; 282*7ab6e6acSAndroid Build Coastguard Worker int prot_listener; 283*7ab6e6acSAndroid Build Coastguard Worker 284*7ab6e6acSAndroid Build Coastguard Worker int ctrl_sck_mss; /* MSS for the control channel */ 285*7ab6e6acSAndroid Build Coastguard Worker 286*7ab6e6acSAndroid Build Coastguard Worker #if defined(HAVE_SSL) 287*7ab6e6acSAndroid Build Coastguard Worker char *server_authorized_users; 288*7ab6e6acSAndroid Build Coastguard Worker EVP_PKEY *server_rsa_private_key; 289*7ab6e6acSAndroid Build Coastguard Worker #endif // HAVE_SSL 290*7ab6e6acSAndroid Build Coastguard Worker 291*7ab6e6acSAndroid Build Coastguard Worker /* boolean variables for Options */ 292*7ab6e6acSAndroid Build Coastguard Worker int daemon; /* -D option */ 293*7ab6e6acSAndroid Build Coastguard Worker int one_off; /* -1 option */ 294*7ab6e6acSAndroid Build Coastguard Worker int no_delay; /* -N option */ 295*7ab6e6acSAndroid Build Coastguard Worker int reverse; /* -R option */ 296*7ab6e6acSAndroid Build Coastguard Worker int bidirectional; /* --bidirectional */ 297*7ab6e6acSAndroid Build Coastguard Worker int verbose; /* -V option - verbose mode */ 298*7ab6e6acSAndroid Build Coastguard Worker int json_output; /* -J option - JSON output */ 299*7ab6e6acSAndroid Build Coastguard Worker int zerocopy; /* -Z option - use sendfile */ 300*7ab6e6acSAndroid Build Coastguard Worker int debug; /* -d option - enable debug */ 301*7ab6e6acSAndroid Build Coastguard Worker int get_server_output; /* --get-server-output */ 302*7ab6e6acSAndroid Build Coastguard Worker int udp_counters_64bit; /* --use-64-bit-udp-counters */ 303*7ab6e6acSAndroid Build Coastguard Worker int forceflush; /* --forceflush - flushing output at every interval */ 304*7ab6e6acSAndroid Build Coastguard Worker int multisend; 305*7ab6e6acSAndroid Build Coastguard Worker int repeating_payload; /* --repeating-payload */ 306*7ab6e6acSAndroid Build Coastguard Worker int timestamps; /* --timestamps */ 307*7ab6e6acSAndroid Build Coastguard Worker char *timestamp_format; 308*7ab6e6acSAndroid Build Coastguard Worker 309*7ab6e6acSAndroid Build Coastguard Worker char *json_output_string; /* rendered JSON output if json_output is set */ 310*7ab6e6acSAndroid Build Coastguard Worker /* Select related parameters */ 311*7ab6e6acSAndroid Build Coastguard Worker int max_fd; 312*7ab6e6acSAndroid Build Coastguard Worker fd_set read_set; /* set of read sockets */ 313*7ab6e6acSAndroid Build Coastguard Worker fd_set write_set; /* set of write sockets */ 314*7ab6e6acSAndroid Build Coastguard Worker 315*7ab6e6acSAndroid Build Coastguard Worker /* Interval related members */ 316*7ab6e6acSAndroid Build Coastguard Worker int omitting; 317*7ab6e6acSAndroid Build Coastguard Worker double stats_interval; 318*7ab6e6acSAndroid Build Coastguard Worker double reporter_interval; 319*7ab6e6acSAndroid Build Coastguard Worker void (*stats_callback) (struct iperf_test *); 320*7ab6e6acSAndroid Build Coastguard Worker void (*reporter_callback) (struct iperf_test *); 321*7ab6e6acSAndroid Build Coastguard Worker Timer *omit_timer; 322*7ab6e6acSAndroid Build Coastguard Worker Timer *timer; 323*7ab6e6acSAndroid Build Coastguard Worker int done; 324*7ab6e6acSAndroid Build Coastguard Worker Timer *stats_timer; 325*7ab6e6acSAndroid Build Coastguard Worker Timer *reporter_timer; 326*7ab6e6acSAndroid Build Coastguard Worker 327*7ab6e6acSAndroid Build Coastguard Worker double cpu_util[3]; /* cpu utilization of the test - total, user, system */ 328*7ab6e6acSAndroid Build Coastguard Worker double remote_cpu_util[3]; /* cpu utilization for the remote host/client - total, user, system */ 329*7ab6e6acSAndroid Build Coastguard Worker 330*7ab6e6acSAndroid Build Coastguard Worker int num_streams; /* total streams in the test (-P) */ 331*7ab6e6acSAndroid Build Coastguard Worker 332*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t bytes_sent; 333*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t blocks_sent; 334*7ab6e6acSAndroid Build Coastguard Worker 335*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t bytes_received; 336*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t blocks_received; 337*7ab6e6acSAndroid Build Coastguard Worker 338*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t bitrate_limit_stats_count; /* Number of stats periods accumulated for server's total bitrate average */ 339*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t *bitrate_limit_intervals_traffic_bytes; /* Pointer to a cyclic array that includes the last interval's bytes transferred */ 340*7ab6e6acSAndroid Build Coastguard Worker iperf_size_t bitrate_limit_last_interval_index; /* Index of the last interval traffic insrted into the cyclic array */ 341*7ab6e6acSAndroid Build Coastguard Worker int bitrate_limit_exceeded; /* Set by callback routine when average data rate exceeded the server's bitrate limit */ 342*7ab6e6acSAndroid Build Coastguard Worker 343*7ab6e6acSAndroid Build Coastguard Worker char cookie[COOKIE_SIZE]; 344*7ab6e6acSAndroid Build Coastguard Worker // struct iperf_stream *streams; /* pointer to list of struct stream */ 345*7ab6e6acSAndroid Build Coastguard Worker SLIST_HEAD(slisthead, iperf_stream) streams; 346*7ab6e6acSAndroid Build Coastguard Worker struct iperf_settings *settings; 347*7ab6e6acSAndroid Build Coastguard Worker 348*7ab6e6acSAndroid Build Coastguard Worker SLIST_HEAD(plisthead, protocol) protocols; 349*7ab6e6acSAndroid Build Coastguard Worker 350*7ab6e6acSAndroid Build Coastguard Worker /* callback functions */ 351*7ab6e6acSAndroid Build Coastguard Worker void (*on_new_stream)(struct iperf_stream *); 352*7ab6e6acSAndroid Build Coastguard Worker void (*on_test_start)(struct iperf_test *); 353*7ab6e6acSAndroid Build Coastguard Worker void (*on_connect)(struct iperf_test *); 354*7ab6e6acSAndroid Build Coastguard Worker void (*on_test_finish)(struct iperf_test *); 355*7ab6e6acSAndroid Build Coastguard Worker 356*7ab6e6acSAndroid Build Coastguard Worker /* cJSON handles for use when in -J mode */\ 357*7ab6e6acSAndroid Build Coastguard Worker cJSON *json_top; 358*7ab6e6acSAndroid Build Coastguard Worker cJSON *json_start; 359*7ab6e6acSAndroid Build Coastguard Worker cJSON *json_connected; 360*7ab6e6acSAndroid Build Coastguard Worker cJSON *json_intervals; 361*7ab6e6acSAndroid Build Coastguard Worker cJSON *json_end; 362*7ab6e6acSAndroid Build Coastguard Worker 363*7ab6e6acSAndroid Build Coastguard Worker /* Server output (use on client side only) */ 364*7ab6e6acSAndroid Build Coastguard Worker char *server_output_text; 365*7ab6e6acSAndroid Build Coastguard Worker cJSON *json_server_output; 366*7ab6e6acSAndroid Build Coastguard Worker 367*7ab6e6acSAndroid Build Coastguard Worker /* Server output (use on server side only) */ 368*7ab6e6acSAndroid Build Coastguard Worker TAILQ_HEAD(iperf_textlisthead, iperf_textline) server_output_list; 369*7ab6e6acSAndroid Build Coastguard Worker 370*7ab6e6acSAndroid Build Coastguard Worker }; 371*7ab6e6acSAndroid Build Coastguard Worker 372*7ab6e6acSAndroid Build Coastguard Worker /* default settings */ 373*7ab6e6acSAndroid Build Coastguard Worker #define PORT 5201 /* default port to listen on (don't use the same port as iperf2) */ 374*7ab6e6acSAndroid Build Coastguard Worker #define uS_TO_NS 1000 375*7ab6e6acSAndroid Build Coastguard Worker #define SEC_TO_US 1000000LL 376*7ab6e6acSAndroid Build Coastguard Worker #define UDP_RATE (1024 * 1024) /* 1 Mbps */ 377*7ab6e6acSAndroid Build Coastguard Worker #define OMIT 0 /* seconds */ 378*7ab6e6acSAndroid Build Coastguard Worker #define DURATION 10 /* seconds */ 379*7ab6e6acSAndroid Build Coastguard Worker 380*7ab6e6acSAndroid Build Coastguard Worker #define SEC_TO_NS 1000000000LL /* too big for enum/const on some platforms */ 381*7ab6e6acSAndroid Build Coastguard Worker #define MAX_RESULT_STRING 4096 382*7ab6e6acSAndroid Build Coastguard Worker 383*7ab6e6acSAndroid Build Coastguard Worker #define UDP_BUFFER_EXTRA 1024 384*7ab6e6acSAndroid Build Coastguard Worker 385*7ab6e6acSAndroid Build Coastguard Worker /* constants for command line arg sanity checks */ 386*7ab6e6acSAndroid Build Coastguard Worker #define MB (1024 * 1024) 387*7ab6e6acSAndroid Build Coastguard Worker #define MAX_TCP_BUFFER (512 * MB) 388*7ab6e6acSAndroid Build Coastguard Worker #define MAX_BLOCKSIZE MB 389*7ab6e6acSAndroid Build Coastguard Worker /* Minimum size UDP send is the size of two 32-bit ints followed by a 64-bit int */ 390*7ab6e6acSAndroid Build Coastguard Worker #define MIN_UDP_BLOCKSIZE (4 + 4 + 8) 391*7ab6e6acSAndroid Build Coastguard Worker /* Maximum size UDP send is (64K - 1) - IP and UDP header sizes */ 392*7ab6e6acSAndroid Build Coastguard Worker #define MAX_UDP_BLOCKSIZE (65535 - 8 - 20) 393*7ab6e6acSAndroid Build Coastguard Worker #define MIN_INTERVAL 0.1 394*7ab6e6acSAndroid Build Coastguard Worker #define MAX_INTERVAL 60.0 395*7ab6e6acSAndroid Build Coastguard Worker #define MAX_TIME 86400 396*7ab6e6acSAndroid Build Coastguard Worker #define MAX_BURST 1000 397*7ab6e6acSAndroid Build Coastguard Worker #define MAX_MSS (9 * 1024) 398*7ab6e6acSAndroid Build Coastguard Worker #define MAX_STREAMS 128 399*7ab6e6acSAndroid Build Coastguard Worker 400*7ab6e6acSAndroid Build Coastguard Worker #define TIMESTAMP_FORMAT "%c " 401*7ab6e6acSAndroid Build Coastguard Worker 402*7ab6e6acSAndroid Build Coastguard Worker extern int gerror; /* error value from getaddrinfo(3), for use in internal error handling */ 403*7ab6e6acSAndroid Build Coastguard Worker 404*7ab6e6acSAndroid Build Coastguard Worker #endif /* !__IPERF_H */ 405