Home | History | Annotate | Download | only in src
      1 /*
      2  * iperf, Copyright (c) 2014-2018, The Regents of the University of
      3  * California, through Lawrence Berkeley National Laboratory (subject
      4  * to receipt of any required approvals from the U.S. Dept. of
      5  * Energy).  All rights reserved.
      6  *
      7  * If you have questions about your rights to use or distribute this
      8  * software, please contact Berkeley Lab's Technology Transfer
      9  * Department at TTD (at) lbl.gov.
     10  *
     11  * NOTICE.  This software is owned by the U.S. Department of Energy.
     12  * As such, the U.S. Government has been granted for itself and others
     13  * acting on its behalf a paid-up, nonexclusive, irrevocable,
     14  * worldwide license in the Software to reproduce, prepare derivative
     15  * works, and perform publicly and display publicly.  Beginning five
     16  * (5) years after the date permission to assert copyright is obtained
     17  * from the U.S. Department of Energy, and subject to any subsequent
     18  * five (5) year renewals, the U.S. Government is granted for itself
     19  * and others acting on its behalf a paid-up, nonexclusive,
     20  * irrevocable, worldwide license in the Software to reproduce,
     21  * prepare derivative works, distribute copies to the public, perform
     22  * publicly and display publicly, and to permit others to do so.
     23  *
     24  * This code is distributed under a BSD style license, see the LICENSE
     25  * file for complete information.
     26  */
     27 #ifndef        __IPERF_API_H
     28 #define        __IPERF_API_H
     29 
     30 #include <sys/time.h>
     31 #include <setjmp.h>
     32 #include <stdio.h>
     33 #ifdef HAVE_STDINT_H
     34 #include <stdint.h>
     35 #endif
     36 #ifdef __cplusplus
     37 extern "C" { /* open extern "C" */
     38 #endif
     39 
     40 
     41 struct iperf_test;
     42 struct iperf_stream_result;
     43 struct iperf_interval_results;
     44 struct iperf_stream;
     45 struct iperf_time;
     46 
     47 /* default settings */
     48 #define Ptcp SOCK_STREAM
     49 #define Pudp SOCK_DGRAM
     50 #define Psctp 12
     51 #define DEFAULT_UDP_BLKSIZE 1460 /* default is dynamically set, else this */
     52 #define DEFAULT_TCP_BLKSIZE (128 * 1024)  /* default read/write block size */
     53 #define DEFAULT_SCTP_BLKSIZE (64 * 1024)
     54 
     55 /* short option equivalents, used to support options that only have long form */
     56 #define OPT_SCTP 1
     57 #define OPT_LOGFILE 2
     58 #define OPT_GET_SERVER_OUTPUT 3
     59 #define OPT_UDP_COUNTERS_64BIT 4
     60 #define OPT_CLIENT_PORT 5
     61 #define OPT_NUMSTREAMS 6
     62 #define OPT_FORCEFLUSH 7
     63 #define OPT_NO_FQ_SOCKET_PACING 9 /* UNUSED */
     64 #define OPT_FQ_RATE 10
     65 #define OPT_DSCP 11
     66 #define OPT_CLIENT_USERNAME 12
     67 #define OPT_CLIENT_RSA_PUBLIC_KEY 13
     68 #define OPT_SERVER_RSA_PRIVATE_KEY 14
     69 #define OPT_SERVER_AUTHORIZED_USERS 15
     70 #define OPT_PACING_TIMER 16
     71 #define OPT_CONNECT_TIMEOUT 17
     72 #define OPT_REPEATING_PAYLOAD 18
     73 #define OPT_EXTRA_DATA 19
     74 #define OPT_BIDIRECTIONAL 20
     75 
     76 /* states */
     77 #define TEST_START 1
     78 #define TEST_RUNNING 2
     79 #define RESULT_REQUEST 3 /* not used */
     80 #define TEST_END 4
     81 #define STREAM_BEGIN 5 /* not used */
     82 #define STREAM_RUNNING 6 /* not used */
     83 #define STREAM_END 7 /* not used */
     84 #define ALL_STREAMS_END 8 /* not used */
     85 #define PARAM_EXCHANGE 9
     86 #define CREATE_STREAMS 10
     87 #define SERVER_TERMINATE 11
     88 #define CLIENT_TERMINATE 12
     89 #define EXCHANGE_RESULTS 13
     90 #define DISPLAY_RESULTS 14
     91 #define IPERF_START 15
     92 #define IPERF_DONE 16
     93 #define ACCESS_DENIED (-1)
     94 #define SERVER_ERROR (-2)
     95 
     96 /* Getter routines for some fields inside iperf_test. */
     97 int	iperf_get_verbose( struct iperf_test* ipt );
     98 int	iperf_get_control_socket( struct iperf_test* ipt );
     99 int	iperf_get_test_omit( struct iperf_test* ipt );
    100 int	iperf_get_test_duration( struct iperf_test* ipt );
    101 char	iperf_get_test_role( struct iperf_test* ipt );
    102 int	iperf_get_test_reverse( struct iperf_test* ipt );
    103 int	iperf_get_test_blksize( struct iperf_test* ipt );
    104 FILE*	iperf_get_test_outfile( struct iperf_test* ipt );
    105 uint64_t iperf_get_test_rate( struct iperf_test* ipt );
    106 int iperf_get_test_pacing_timer( struct iperf_test* ipt );
    107 uint64_t iperf_get_test_bytes( struct iperf_test* ipt );
    108 uint64_t iperf_get_test_blocks( struct iperf_test* ipt );
    109 int     iperf_get_test_burst( struct iperf_test* ipt );
    110 int	iperf_get_test_socket_bufsize( struct iperf_test* ipt );
    111 double	iperf_get_test_reporter_interval( struct iperf_test* ipt );
    112 double	iperf_get_test_stats_interval( struct iperf_test* ipt );
    113 int	iperf_get_test_num_streams( struct iperf_test* ipt );
    114 int	iperf_get_test_server_port( struct iperf_test* ipt );
    115 char*	iperf_get_test_server_hostname( struct iperf_test* ipt );
    116 char*	iperf_get_test_template( struct iperf_test* ipt );
    117 int	iperf_get_test_protocol_id( struct iperf_test* ipt );
    118 int	iperf_get_test_json_output( struct iperf_test* ipt );
    119 char*	iperf_get_test_json_output_string ( struct iperf_test* ipt );
    120 int	iperf_get_test_zerocopy( struct iperf_test* ipt );
    121 int	iperf_get_test_get_server_output( struct iperf_test* ipt );
    122 char*	iperf_get_test_bind_address ( struct iperf_test* ipt );
    123 int	iperf_get_test_udp_counters_64bit( struct iperf_test* ipt );
    124 int	iperf_get_test_one_off( struct iperf_test* ipt );
    125 int iperf_get_test_tos( struct iperf_test* ipt );
    126 char*	iperf_get_extra_data( struct iperf_test* ipt );
    127 char*	iperf_get_iperf_version(void);
    128 
    129 /* Setter routines for some fields inside iperf_test. */
    130 void	iperf_set_verbose( struct iperf_test* ipt, int verbose );
    131 void	iperf_set_control_socket( struct iperf_test* ipt, int ctrl_sck );
    132 void	iperf_set_test_omit( struct iperf_test* ipt, int omit );
    133 void	iperf_set_test_duration( struct iperf_test* ipt, int duration );
    134 void	iperf_set_test_reporter_interval( struct iperf_test* ipt, double reporter_interval );
    135 void	iperf_set_test_stats_interval( struct iperf_test* ipt, double stats_interval );
    136 void	iperf_set_test_state( struct iperf_test* ipt, signed char state );
    137 void	iperf_set_test_blksize( struct iperf_test* ipt, int blksize );
    138 void	iperf_set_test_rate( struct iperf_test* ipt, uint64_t rate );
    139 void    iperf_set_test_pacing_timer( struct iperf_test* ipt, int pacing_timer );
    140 void    iperf_set_test_bytes( struct iperf_test* ipt, uint64_t bytes );
    141 void    iperf_set_test_blocks( struct iperf_test* ipt, uint64_t blocks );
    142 void	iperf_set_test_burst( struct iperf_test* ipt, int burst );
    143 void	iperf_set_test_server_port( struct iperf_test* ipt, int server_port );
    144 void	iperf_set_test_socket_bufsize( struct iperf_test* ipt, int socket_bufsize );
    145 void	iperf_set_test_num_streams( struct iperf_test* ipt, int num_streams );
    146 void	iperf_set_test_role( struct iperf_test* ipt, char role );
    147 void	iperf_set_test_server_hostname( struct iperf_test* ipt, char* server_hostname );
    148 void    iperf_set_test_template( struct iperf_test *ipt, char *tmp_template );
    149 void	iperf_set_test_reverse( struct iperf_test* ipt, int reverse );
    150 void	iperf_set_test_json_output( struct iperf_test* ipt, int json_output );
    151 int	iperf_has_zerocopy( void );
    152 void	iperf_set_test_zerocopy( struct iperf_test* ipt, int zerocopy );
    153 void	iperf_set_test_get_server_output( struct iperf_test* ipt, int get_server_output );
    154 void	iperf_set_test_bind_address( struct iperf_test* ipt, char *bind_address );
    155 void	iperf_set_test_udp_counters_64bit( struct iperf_test* ipt, int udp_counters_64bit );
    156 void	iperf_set_test_one_off( struct iperf_test* ipt, int one_off );
    157 void    iperf_set_test_tos( struct iperf_test* ipt, int tos );
    158 void	iperf_set_extra_data( struct iperf_test* ipt, char *dat);
    159 void    iperf_set_test_bidirectional( struct iperf_test* ipt, int bidirectional);
    160 
    161 #if defined(HAVE_SSL)
    162 void    iperf_set_test_client_username(struct iperf_test *ipt, char *client_username);
    163 void    iperf_set_test_client_password(struct iperf_test *ipt, char *client_password);
    164 void    iperf_set_test_client_rsa_pubkey(struct iperf_test *ipt, char *client_rsa_pubkey_base64);
    165 #endif // HAVE_SSL
    166 
    167 /**
    168  * exchange_parameters - handles the param_Exchange part for client
    169  *
    170  */
    171 int      iperf_exchange_parameters(struct iperf_test * test);
    172 
    173 /**
    174  * add_to_interval_list -- adds new interval to the interval_list
    175  *
    176  */
    177 void      add_to_interval_list(struct iperf_stream_result * rp, struct iperf_interval_results *temp);
    178 
    179 /**
    180  * connect_msg -- displays connection message
    181  * denoting senfer/receiver details
    182  *
    183  */
    184 void      connect_msg(struct iperf_stream * sp);
    185 
    186 /**
    187  * iperf_stats_callback -- handles the statistic gathering
    188  *
    189  */
    190 void     iperf_stats_callback(struct iperf_test * test);
    191 
    192 /**
    193  * iperf_reporter_callback -- handles the report printing
    194  *
    195  */
    196 void     iperf_reporter_callback(struct iperf_test * test);
    197 
    198 /**
    199  * iperf_new_test -- return a new iperf_test with default values
    200  *
    201  * returns NULL on failure
    202  *
    203  */
    204 struct iperf_test *iperf_new_test(void);
    205 
    206 int      iperf_defaults(struct iperf_test * testp);
    207 
    208 /**
    209  * iperf_free_test -- free resources used by test, calls iperf_free_stream to
    210  * free streams
    211  *
    212  */
    213 void      iperf_free_test(struct iperf_test * testp);
    214 
    215 /**
    216  * iperf_new_stream -- return a net iperf_stream with default values
    217  *
    218  * returns NULL on failure
    219  *
    220  */
    221 struct iperf_stream *iperf_new_stream(struct iperf_test *, int, int);
    222 
    223 /**
    224  * iperf_add_stream -- add a stream to a test
    225  *
    226  */
    227 void      iperf_add_stream(struct iperf_test * test, struct iperf_stream * stream);
    228 
    229 /**
    230  * iperf_init_stream -- init resources associated with test
    231  *
    232  */
    233 int       iperf_init_stream(struct iperf_stream *, struct iperf_test *);
    234 
    235 /**
    236  * iperf_free_stream -- free resources associated with test
    237  *
    238  */
    239 void      iperf_free_stream(struct iperf_stream * sp);
    240 
    241 int has_tcpinfo(void);
    242 int has_tcpinfo_retransmits(void);
    243 void save_tcpinfo(struct iperf_stream *sp, struct iperf_interval_results *irp);
    244 long get_total_retransmits(struct iperf_interval_results *irp);
    245 long get_snd_cwnd(struct iperf_interval_results *irp);
    246 long get_rtt(struct iperf_interval_results *irp);
    247 long get_rttvar(struct iperf_interval_results *irp);
    248 long get_pmtu(struct iperf_interval_results *irp);
    249 void print_tcpinfo(struct iperf_test *test);
    250 void build_tcpinfo_message(struct iperf_interval_results *r, char *message);
    251 
    252 int iperf_set_send_state(struct iperf_test *test, signed char state);
    253 void iperf_check_throttle(struct iperf_stream *sp, struct iperf_time *nowP);
    254 int iperf_send(struct iperf_test *, fd_set *) /* __attribute__((hot)) */;
    255 int iperf_recv(struct iperf_test *, fd_set *);
    256 void iperf_catch_sigend(void (*handler)(int));
    257 void iperf_got_sigend(struct iperf_test *test) __attribute__ ((noreturn));
    258 void usage(void);
    259 void usage_long(FILE * f);
    260 void warning(char *);
    261 int iperf_exchange_results(struct iperf_test *);
    262 int iperf_init_test(struct iperf_test *);
    263 int iperf_create_send_timers(struct iperf_test *);
    264 int iperf_parse_arguments(struct iperf_test *, int, char **);
    265 void iperf_reset_test(struct iperf_test *);
    266 void iperf_reset_stats(struct iperf_test * test);
    267 
    268 struct protocol *get_protocol(struct iperf_test *, int);
    269 int set_protocol(struct iperf_test *, int);
    270 
    271 void iperf_on_new_stream(struct iperf_stream *);
    272 void iperf_on_test_start(struct iperf_test *);
    273 void iperf_on_connect(struct iperf_test *);
    274 void iperf_on_test_finish(struct iperf_test *);
    275 
    276 extern jmp_buf env;
    277 
    278 /* Client routines. */
    279 int iperf_run_client(struct iperf_test *);
    280 int iperf_connect(struct iperf_test *);
    281 int iperf_create_streams(struct iperf_test *, int sender);
    282 int iperf_handle_message_client(struct iperf_test *);
    283 int iperf_client_end(struct iperf_test *);
    284 
    285 /* Server routines. */
    286 int iperf_run_server(struct iperf_test *);
    287 int iperf_server_listen(struct iperf_test *);
    288 int iperf_accept(struct iperf_test *);
    289 int iperf_handle_message_server(struct iperf_test *);
    290 int iperf_create_pidfile(struct iperf_test *);
    291 int iperf_delete_pidfile(struct iperf_test *);
    292 
    293 /* JSON output routines. */
    294 int iperf_json_start(struct iperf_test *);
    295 int iperf_json_finish(struct iperf_test *);
    296 
    297 /* CPU affinity routines */
    298 int iperf_setaffinity(struct iperf_test *, int affinity);
    299 int iperf_clearaffinity(struct iperf_test *);
    300 
    301 /* Custom printf routine. */
    302 int iperf_printf(struct iperf_test *test, const char *format, ...) __attribute__ ((format(printf,2,3)));
    303 int iflush(struct iperf_test *test);
    304 
    305 /* Error routines. */
    306 void iperf_err(struct iperf_test *test, const char *format, ...) __attribute__ ((format(printf,2,3)));
    307 void iperf_errexit(struct iperf_test *test, const char *format, ...) __attribute__ ((format(printf,2,3),noreturn));
    308 char *iperf_strerror(int);
    309 extern int i_errno;
    310 enum {
    311     IENONE = 0,             // No error
    312     /* Parameter errors */
    313     IESERVCLIENT = 1,       // Iperf cannot be both server and client
    314     IENOROLE = 2,           // Iperf must either be a client (-c) or server (-s)
    315     IESERVERONLY = 3,       // This option is server only
    316     IECLIENTONLY = 4,       // This option is client only
    317     IEDURATION = 5,         // test duration too long. Maximum value = %dMAX_TIME
    318     IENUMSTREAMS = 6,       // Number of parallel streams too large. Maximum value = %dMAX_STREAMS
    319     IEBLOCKSIZE = 7,        // Block size too large. Maximum value = %dMAX_BLOCKSIZE
    320     IEBUFSIZE = 8,          // Socket buffer size too large. Maximum value = %dMAX_TCP_BUFFER
    321     IEINTERVAL = 9,         // Invalid report interval (min = %gMIN_INTERVAL, max = %gMAX_INTERVAL seconds)
    322     IEMSS = 10,             // MSS too large. Maximum value = %dMAX_MSS
    323     IENOSENDFILE = 11,      // This OS does not support sendfile
    324     IEOMIT = 12,            // Bogus value for --omit
    325     IEUNIMP = 13,           // Not implemented yet
    326     IEFILE = 14,            // -F file couldn't be opened
    327     IEBURST = 15,           // Invalid burst count. Maximum value = %dMAX_BURST
    328     IEENDCONDITIONS = 16,   // Only one test end condition (-t, -n, -k) may be specified
    329     IELOGFILE = 17,	    // Can't open log file
    330     IENOSCTP = 18,	    // No SCTP support available
    331     IEBIND = 19,	    // UNUSED:  Local port specified with no local bind option
    332     IEUDPBLOCKSIZE = 20,    // Block size invalid
    333     IEBADTOS = 21,	    // Bad TOS value
    334     IESETCLIENTAUTH = 22,   // Bad configuration of client authentication
    335     IESETSERVERAUTH = 23,   // Bad configuration of server authentication
    336     IEBADFORMAT = 24,	    // Bad format argument to -f
    337     IEREVERSEBIDIR = 25,    // Iperf cannot be both reverse and bidirectional
    338     /* Test errors */
    339     IENEWTEST = 100,        // Unable to create a new test (check perror)
    340     IEINITTEST = 101,       // Test initialization failed (check perror)
    341     IELISTEN = 102,         // Unable to listen for connections (check perror)
    342     IECONNECT = 103,        // Unable to connect to server (check herror/perror) [from netdial]
    343     IEACCEPT = 104,         // Unable to accept connection from client (check herror/perror)
    344     IESENDCOOKIE = 105,     // Unable to send cookie to server (check perror)
    345     IERECVCOOKIE = 106,     // Unable to receive cookie from client (check perror)
    346     IECTRLWRITE = 107,      // Unable to write to the control socket (check perror)
    347     IECTRLREAD = 108,       // Unable to read from the control socket (check perror)
    348     IECTRLCLOSE = 109,      // Control socket has closed unexpectedly
    349     IEMESSAGE = 110,        // Received an unknown message
    350     IESENDMESSAGE = 111,    // Unable to send control message to client/server (check perror)
    351     IERECVMESSAGE = 112,    // Unable to receive control message from client/server (check perror)
    352     IESENDPARAMS = 113,     // Unable to send parameters to server (check perror)
    353     IERECVPARAMS = 114,     // Unable to receive parameters from client (check perror)
    354     IEPACKAGERESULTS = 115, // Unable to package results (check perror)
    355     IESENDRESULTS = 116,    // Unable to send results to client/server (check perror)
    356     IERECVRESULTS = 117,    // Unable to receive results from client/server (check perror)
    357     IESELECT = 118,         // Select failed (check perror)
    358     IECLIENTTERM = 119,     // The client has terminated
    359     IESERVERTERM = 120,     // The server has terminated
    360     IEACCESSDENIED = 121,   // The server is busy running a test. Try again later.
    361     IESETNODELAY = 122,     // Unable to set TCP/SCTP NODELAY (check perror)
    362     IESETMSS = 123,         // Unable to set TCP/SCTP MSS (check perror)
    363     IESETBUF = 124,         // Unable to set socket buffer size (check perror)
    364     IESETTOS = 125,         // Unable to set IP TOS (check perror)
    365     IESETCOS = 126,         // Unable to set IPv6 traffic class (check perror)
    366     IESETFLOW = 127,        // Unable to set IPv6 flow label
    367     IEREUSEADDR = 128,      // Unable to set reuse address on socket (check perror)
    368     IENONBLOCKING = 129,    // Unable to set socket to non-blocking (check perror)
    369     IESETWINDOWSIZE = 130,  // Unable to set socket window size (check perror)
    370     IEPROTOCOL = 131,       // Protocol does not exist
    371     IEAFFINITY = 132,       // Unable to set CPU affinity (check perror)
    372     IEDAEMON = 133,	    // Unable to become a daemon process
    373     IESETCONGESTION = 134,  // Unable to set TCP_CONGESTION
    374     IEPIDFILE = 135,	    // Unable to write PID file
    375     IEV6ONLY = 136,  	    // Unable to set/unset IPV6_V6ONLY (check perror)
    376     IESETSCTPDISABLEFRAG = 137, // Unable to set SCTP Fragmentation (check perror)
    377     IESETSCTPNSTREAM= 138,  //  Unable to set SCTP number of streams (check perror)
    378     IESETSCTPBINDX= 139,    // Unable to process sctp_bindx() parameters
    379     IESETPACING= 140,       // Unable to set socket pacing rate
    380     IESETBUF2= 141,	    // Socket buffer size incorrect (written value != read value)
    381     IEAUTHTEST = 142,       // Test authorization failed
    382     /* Stream errors */
    383     IECREATESTREAM = 200,   // Unable to create a new stream (check herror/perror)
    384     IEINITSTREAM = 201,     // Unable to initialize stream (check herror/perror)
    385     IESTREAMLISTEN = 202,   // Unable to start stream listener (check perror)
    386     IESTREAMCONNECT = 203,  // Unable to connect stream (check herror/perror)
    387     IESTREAMACCEPT = 204,   // Unable to accepte stream connection (check perror)
    388     IESTREAMWRITE = 205,    // Unable to write to stream socket (check perror)
    389     IESTREAMREAD = 206,     // Unable to read from stream (check perror)
    390     IESTREAMCLOSE = 207,    // Stream has closed unexpectedly
    391     IESTREAMID = 208,       // Stream has invalid ID
    392     /* Timer errors */
    393     IENEWTIMER = 300,       // Unable to create new timer (check perror)
    394     IEUPDATETIMER = 301,    // Unable to update timer (check perror)
    395 };
    396 
    397 
    398 #ifdef __cplusplus
    399 } /* close extern "C" */
    400 #endif
    401 
    402 
    403 #endif /* !__IPERF_API_H */
    404