.TH LIBIPERF 3 "April 2018" ESnet "User Manuals"
.SH NAME
libiperf \- API for iperf3 network throughput tester

.SH SYNOPSIS
#include <iperf_api.h>
.br
\-liperf

.SH DESCRIPTION
.PP
Libiperf gives you access to all the functionality of the iperf3
network testing tool.
You can build it directly into your own program, instead of having
to run it as a shell command.

.SH CALLS
Initialization / termination:
.nf
    struct iperf_test *iperf_new_test();
    int iperf_defaults(struct iperf_test *t);
    void iperf_free_test(struct iperf_test *t);
.fi
Setting test parameters:
.nf
    void iperf_set_test_role( struct iperf_test *pt, char role );
    void iperf_set_test_bind_address( struct iperf_test *t, char *bind_address );
    void iperf_set_test_server_hostname( struct iperf_test *t, char *server_host );
    void iperf_set_test_server_port( struct iperf_test *t, int server_port );
    void iperf_set_test_duration( struct iperf_test *t, int duration );
    void iperf_set_test_blksize( struct iperf_test *t, int blksize );
    void iperf_set_test_num_streams( struct iperf_test *t, int num_streams );
    void iperf_set_test_json_output( struct iperf_test *t, int json_output );
    int iperf_has_zerocopy( void );
    void iperf_set_test_zerocopy( struct iperf_test* t, int zerocopy );
    void iperf_set_test_tos( struct iperf_test* t, int tos );
.fi
Authentication functions:
.nf
    void iperf_set_test_client_username(struct iperf_test *ipt, char *client_username)
    void iperf_set_test_client_password(struct iperf_test *ipt, char *client_password)
    void iperf_set_test_client_rsa_pubkey(struct iperf_test *ipt, char *client_rsa_pubkey_base64)
.fi
Running a test:
.nf
    int iperf_run_client(struct iperf_test *);
    int iperf_run_server(struct iperf_test *);
    void iperf_reset_test(struct iperf_test *);
.fi
Output:
.nf
    FILE *iperf_get_test_outfile(struct iperf_test *);
    char* iperf_get_test_json_output_string(struct iperf_test *);
.fi
Error reporting:
.nf
    void iperf_err(struct iperf_test *t, const char *format, ...);
    char *iperf_strerror(int);
    extern int i_errno;
.fi
This is not a complete list of the available calls.
See the include file for more.

.SH EXAMPLES
Here's some sample code that runs an iperf client:
.nf
    struct iperf_test *test;
    test = iperf_new_test();
    if ( test == NULL ) {
        fprintf( stderr, "%s: failed to create test\n", argv0 );
        exit( EXIT_FAILURE );
    }
    iperf_defaults( test );
    iperf_set_test_role( test, 'c' );
    iperf_set_test_server_hostname( test, host );
    iperf_set_test_server_port( test, port );
    if ( iperf_run_client( test ) < 0 ) {
        fprintf( stderr, "%s: error - %s\n", argv0, iperf_strerror( i_errno ) );
        exit( EXIT_FAILURE );
    }
    iperf_free_test( test );
.fi
And here's a server:
.nf
    struct iperf_test *test;
    test = iperf_new_test();
    if ( test == NULL ) {
        fprintf( stderr, "%s: failed to create test\n", argv0 );
        exit( EXIT_FAILURE );
    }
    iperf_defaults( test );
    iperf_set_test_role( test, 's' );
    iperf_set_test_server_port( test, port );
    for (;;) {
        if ( iperf_run_server( test ) < 0 )
            fprintf( stderr, "%s: error - %s\n\n", argv0, iperf_strerror( i_errn
o ) );
        iperf_reset_test( test );
    }
    iperf_free_test( test );
.fi
These are not complete programs, just excerpts.
The full runnable source code can be found in the examples subdirectory
of the iperf3 source tree.

.SH AUTHORS
A list of the contributors to iperf3 can be found within the
documentation located at
\fChttp://software.es.net/iperf/dev.html#authors\fR.

.SH "SEE ALSO"
iperf3(1),
http://software.es.net/iperf/
