version 1.1.1.2, 2021/03/17 00:36:46
|
version 1.1.1.3, 2023/09/27 11:14:54
|
Line 39
|
Line 39
|
#ifndef _GNU_SOURCE |
#ifndef _GNU_SOURCE |
# define _GNU_SOURCE |
# define _GNU_SOURCE |
#endif |
#endif |
|
#ifdef HAVE_LINUX_TCP_H |
|
#include <linux/tcp.h> |
|
#else |
#include <netinet/tcp.h> |
#include <netinet/tcp.h> |
|
#endif |
|
#include <net/if.h> // for IFNAMSIZ |
|
|
#if defined(HAVE_CPUSET_SETAFFINITY) |
#if defined(HAVE_CPUSET_SETAFFINITY) |
#include <sys/param.h> |
#include <sys/param.h> |
Line 74 typedef uint64_t iperf_size_t;
|
Line 79 typedef uint64_t iperf_size_t;
|
|
|
struct iperf_interval_results |
struct iperf_interval_results |
{ |
{ |
iperf_size_t bytes_transferred; /* bytes transfered in this interval */ | iperf_size_t bytes_transferred; /* bytes transferred in this interval */ |
struct iperf_time interval_start_time; |
struct iperf_time interval_start_time; |
struct iperf_time interval_end_time; |
struct iperf_time interval_end_time; |
float interval_duration; |
float interval_duration; |
|
|
/* for UDP */ |
/* for UDP */ |
int interval_packet_count; | int64_t interval_packet_count; |
int interval_outoforder_packets; | int64_t interval_outoforder_packets; |
int interval_cnt_error; | int64_t interval_cnt_error; |
int packet_count; | int64_t packet_count; |
double jitter; |
double jitter; |
int outoforder_packets; | int64_t outoforder_packets; |
int cnt_error; | int64_t cnt_error; |
|
|
int omitted; |
int omitted; |
#if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)) && \ | #if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) && \ |
defined(TCP_INFO) |
defined(TCP_INFO) |
struct tcp_info tcpInfo; /* getsockopt(TCP_INFO) for Linux, {Free,Net}BSD */ | struct tcp_info tcpInfo; /* getsockopt(TCP_INFO) for Linux, {Free,Net,Open}BSD */ |
#else |
#else |
/* Just placeholders, never accessed. */ |
/* Just placeholders, never accessed. */ |
char *tcpInfo; |
char *tcpInfo; |
#endif |
#endif |
int interval_retrans; | long interval_retrans; |
int interval_sacks; | long snd_cwnd; |
int snd_cwnd; | long snd_wnd; |
TAILQ_ENTRY(iperf_interval_results) irlistentries; |
TAILQ_ENTRY(iperf_interval_results) irlistentries; |
void *custom_data; |
void *custom_data; |
int rtt; | long rtt; |
int rttvar; | long rttvar; |
int pmtu; | long pmtu; |
}; |
}; |
|
|
struct iperf_stream_result |
struct iperf_stream_result |
Line 113 struct iperf_stream_result
|
Line 118 struct iperf_stream_result
|
iperf_size_t bytes_received_this_interval; |
iperf_size_t bytes_received_this_interval; |
iperf_size_t bytes_sent_this_interval; |
iperf_size_t bytes_sent_this_interval; |
iperf_size_t bytes_sent_omit; |
iperf_size_t bytes_sent_omit; |
int stream_prev_total_retrans; | long stream_prev_total_retrans; |
int stream_retrans; | long stream_retrans; |
int stream_prev_total_sacks; | long stream_max_rtt; |
int stream_sacks; | long stream_min_rtt; |
int stream_max_rtt; | long stream_sum_rtt; |
int stream_min_rtt; | |
int stream_sum_rtt; | |
int stream_count_rtt; |
int stream_count_rtt; |
int stream_max_snd_cwnd; | long stream_max_snd_cwnd; |
| long stream_max_snd_wnd; |
struct iperf_time start_time; |
struct iperf_time start_time; |
struct iperf_time end_time; |
struct iperf_time end_time; |
struct iperf_time start_time_fixed; |
struct iperf_time start_time_fixed; |
Line 139 struct iperf_settings
|
Line 143 struct iperf_settings
|
int blksize; /* size of read/writes (-l) */ |
int blksize; /* size of read/writes (-l) */ |
iperf_size_t rate; /* target data rate for application pacing*/ |
iperf_size_t rate; /* target data rate for application pacing*/ |
iperf_size_t bitrate_limit; /* server's maximum allowed total data rate for all streams*/ |
iperf_size_t bitrate_limit; /* server's maximum allowed total data rate for all streams*/ |
double bitrate_limit_interval; /* interval for avaraging total data rate */ | double bitrate_limit_interval; /* interval for averaging total data rate */ |
int bitrate_limit_stats_per_interval; /* calculated number of stats periods for averaging total data rate */ |
int bitrate_limit_stats_per_interval; /* calculated number of stats periods for averaging total data rate */ |
uint64_t fqrate; /* target data rate for FQ pacing*/ |
uint64_t fqrate; /* target data rate for FQ pacing*/ |
int pacing_timer; /* pacing timer in microseconds */ |
int pacing_timer; /* pacing timer in microseconds */ |
Line 152 struct iperf_settings
|
Line 156 struct iperf_settings
|
iperf_size_t blocks; /* number of blocks (packets) to send */ |
iperf_size_t blocks; /* number of blocks (packets) to send */ |
char unit_format; /* -f */ |
char unit_format; /* -f */ |
int num_ostreams; /* SCTP initmsg settings */ |
int num_ostreams; /* SCTP initmsg settings */ |
|
int dont_fragment; /* Whether to set IP flag Do-Not_Fragment */ |
#if defined(HAVE_SSL) |
#if defined(HAVE_SSL) |
char *authtoken; /* Authentication token */ |
char *authtoken; /* Authentication token */ |
char *client_username; |
char *client_username; |
Line 159 struct iperf_settings
|
Line 164 struct iperf_settings
|
EVP_PKEY *client_rsa_pubkey; |
EVP_PKEY *client_rsa_pubkey; |
#endif // HAVE_SSL |
#endif // HAVE_SSL |
int connect_timeout; /* socket connection timeout, in ms */ |
int connect_timeout; /* socket connection timeout, in ms */ |
|
int idle_timeout; /* server idle time timeout */ |
|
unsigned int snd_timeout; /* Timeout for sending tcp messages in active mode, in us */ |
|
struct iperf_time rcv_timeout; /* Timeout for receiving messages in active mode, in us */ |
}; |
}; |
|
|
struct iperf_test; |
struct iperf_test; |
Line 173 struct iperf_stream
|
Line 181 struct iperf_stream
|
int socket; |
int socket; |
int id; |
int id; |
int sender; |
int sender; |
/* XXX: is settings just a pointer to the same struct in iperf_test? if not, | /* XXX: is settings just a pointer to the same struct in iperf_test? if not, |
should it be? */ |
should it be? */ |
struct iperf_settings *settings; /* pointer to structure settings */ |
struct iperf_settings *settings; /* pointer to structure settings */ |
|
|
Line 183 struct iperf_stream
|
Line 191 struct iperf_stream
|
int green_light; |
int green_light; |
int buffer_fd; /* data to send, file descriptor */ |
int buffer_fd; /* data to send, file descriptor */ |
char *buffer; /* data to send, mmapped */ |
char *buffer; /* data to send, mmapped */ |
|
int pending_size; /* pending data to send */ |
int diskfile_fd; /* file to send, file descriptor */ |
int diskfile_fd; /* file to send, file descriptor */ |
int diskfile_left; /* remaining file data on disk */ |
int diskfile_left; /* remaining file data on disk */ |
|
|
Line 190 struct iperf_stream
|
Line 199 struct iperf_stream
|
* for udp measurements - This can be a structure outside stream, and |
* for udp measurements - This can be a structure outside stream, and |
* stream can have a pointer to this |
* stream can have a pointer to this |
*/ |
*/ |
int packet_count; | int64_t packet_count; |
int peer_packet_count; | int64_t peer_packet_count; |
int omitted_packet_count; | int64_t peer_omitted_packet_count; |
| int64_t omitted_packet_count; |
double jitter; |
double jitter; |
double prev_transit; |
double prev_transit; |
int outoforder_packets; | int64_t outoforder_packets; |
int omitted_outoforder_packets; | int64_t omitted_outoforder_packets; |
int cnt_error; | int64_t cnt_error; |
int omitted_cnt_error; | int64_t omitted_cnt_error; |
uint64_t target; |
uint64_t target; |
|
|
struct sockaddr_storage local_addr; |
struct sockaddr_storage local_addr; |
Line 246 enum iperf_mode {
|
Line 256 enum iperf_mode {
|
BIDIRECTIONAL = -1 |
BIDIRECTIONAL = -1 |
}; |
}; |
|
|
|
enum debug_level { |
|
DEBUG_LEVEL_ERROR = 1, |
|
DEBUG_LEVEL_WARN = 2, |
|
DEBUG_LEVEL_INFO = 3, |
|
DEBUG_LEVEL_DEBUG = 4, |
|
DEBUG_LEVEL_MAX = 4 |
|
}; |
|
|
|
|
struct iperf_test |
struct iperf_test |
{ |
{ |
char role; /* 'c' lient or 's' erver */ |
char role; /* 'c' lient or 's' erver */ |
Line 257 struct iperf_test
|
Line 276 struct iperf_test
|
char *server_hostname; /* -c option */ |
char *server_hostname; /* -c option */ |
char *tmp_template; |
char *tmp_template; |
char *bind_address; /* first -B option */ |
char *bind_address; /* first -B option */ |
|
char *bind_dev; /* bind to network device */ |
TAILQ_HEAD(xbind_addrhead, xbind_entry) xbind_addrs; /* all -X opts */ |
TAILQ_HEAD(xbind_addrhead, xbind_entry) xbind_addrs; /* all -X opts */ |
int bind_port; /* --cport option */ |
int bind_port; /* --cport option */ |
int server_port; |
int server_port; |
Line 278 struct iperf_test
|
Line 298 struct iperf_test
|
FILE *outfile; |
FILE *outfile; |
|
|
int ctrl_sck; |
int ctrl_sck; |
|
int mapped_v4; |
int listener; |
int listener; |
int prot_listener; |
int prot_listener; |
|
|
Line 286 struct iperf_test
|
Line 307 struct iperf_test
|
#if defined(HAVE_SSL) |
#if defined(HAVE_SSL) |
char *server_authorized_users; |
char *server_authorized_users; |
EVP_PKEY *server_rsa_private_key; |
EVP_PKEY *server_rsa_private_key; |
|
int server_skew_threshold; |
#endif // HAVE_SSL |
#endif // HAVE_SSL |
|
|
/* boolean variables for Options */ |
/* boolean variables for Options */ |
Line 298 struct iperf_test
|
Line 320 struct iperf_test
|
int json_output; /* -J option - JSON output */ |
int json_output; /* -J option - JSON output */ |
int zerocopy; /* -Z option - use sendfile */ |
int zerocopy; /* -Z option - use sendfile */ |
int debug; /* -d option - enable debug */ |
int debug; /* -d option - enable debug */ |
|
enum debug_level debug_level; /* -d option option - level of debug messages to show */ |
int get_server_output; /* --get-server-output */ |
int get_server_output; /* --get-server-output */ |
int udp_counters_64bit; /* --use-64-bit-udp-counters */ |
int udp_counters_64bit; /* --use-64-bit-udp-counters */ |
int forceflush; /* --forceflush - flushing output at every interval */ |
int forceflush; /* --forceflush - flushing output at every interval */ |
Line 312 struct iperf_test
|
Line 335 struct iperf_test
|
fd_set read_set; /* set of read sockets */ |
fd_set read_set; /* set of read sockets */ |
fd_set write_set; /* set of write sockets */ |
fd_set write_set; /* set of write sockets */ |
|
|
/* Interval related members */ | /* Interval related members */ |
int omitting; |
int omitting; |
double stats_interval; |
double stats_interval; |
double reporter_interval; |
double reporter_interval; |
Line 337 struct iperf_test
|
Line 360 struct iperf_test
|
|
|
iperf_size_t bitrate_limit_stats_count; /* Number of stats periods accumulated for server's total bitrate average */ |
iperf_size_t bitrate_limit_stats_count; /* Number of stats periods accumulated for server's total bitrate average */ |
iperf_size_t *bitrate_limit_intervals_traffic_bytes; /* Pointer to a cyclic array that includes the last interval's bytes transferred */ |
iperf_size_t *bitrate_limit_intervals_traffic_bytes; /* Pointer to a cyclic array that includes the last interval's bytes transferred */ |
iperf_size_t bitrate_limit_last_interval_index; /* Index of the last interval traffic insrted into the cyclic array */ | iperf_size_t bitrate_limit_last_interval_index; /* Index of the last interval traffic inserted into the cyclic array */ |
int bitrate_limit_exceeded; /* Set by callback routine when average data rate exceeded the server's bitrate limit */ |
int bitrate_limit_exceeded; /* Set by callback routine when average data rate exceeded the server's bitrate limit */ |
|
|
|
int server_last_run_rc; /* Save last server run rc for next test */ |
|
uint server_forced_idle_restarts_count; /* count number of forced server restarts to make sure it is not stack */ |
|
uint server_forced_no_msg_restarts_count; /* count number of forced server restarts to make sure it is not stack */ |
|
uint server_test_number; /* count number of tests performed by a server */ |
|
|
char cookie[COOKIE_SIZE]; |
char cookie[COOKIE_SIZE]; |
// struct iperf_stream *streams; /* pointer to list of struct stream */ |
// struct iperf_stream *streams; /* pointer to list of struct stream */ |
SLIST_HEAD(slisthead, iperf_stream) streams; |
SLIST_HEAD(slisthead, iperf_stream) streams; |
Line 372 struct iperf_test
|
Line 400 struct iperf_test
|
/* default settings */ |
/* default settings */ |
#define PORT 5201 /* default port to listen on (don't use the same port as iperf2) */ |
#define PORT 5201 /* default port to listen on (don't use the same port as iperf2) */ |
#define uS_TO_NS 1000 |
#define uS_TO_NS 1000 |
|
#define mS_TO_US 1000 |
|
#define SEC_TO_mS 1000 |
#define SEC_TO_US 1000000LL |
#define SEC_TO_US 1000000LL |
#define UDP_RATE (1024 * 1024) /* 1 Mbps */ |
#define UDP_RATE (1024 * 1024) /* 1 Mbps */ |
#define OMIT 0 /* seconds */ |
#define OMIT 0 /* seconds */ |
Line 400 struct iperf_test
|
Line 430 struct iperf_test
|
#define TIMESTAMP_FORMAT "%c " |
#define TIMESTAMP_FORMAT "%c " |
|
|
extern int gerror; /* error value from getaddrinfo(3), for use in internal error handling */ |
extern int gerror; /* error value from getaddrinfo(3), for use in internal error handling */ |
|
|
|
/* UDP "connect" message and reply (textual value for Wireshark, etc. readability - legacy was numeric) */ |
|
#define UDP_CONNECT_MSG 0x36373839 // "6789" - legacy value was 123456789 |
|
#define UDP_CONNECT_REPLY 0x39383736 // "9876" - legacy value was 987654321 |
|
#define LEGACY_UDP_CONNECT_REPLY 987654321 // Old servers may still reply with the legacy value |
|
|
|
/* In Reverse mode, maximum number of packets to wait for "accept" response - to handle out of order packets */ |
|
#define MAX_REVERSE_OUT_OF_ORDER_PACKETS 2 |
|
|
#endif /* !__IPERF_H */ |
#endif /* !__IPERF_H */ |