xref: /aosp_15_r20/external/iperf3/src/iperf.h (revision 7ab6e6ace082586527a400463bc693a412a40341)
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