--- embedaddon/iperf/src/iperf.h 2021/03/17 00:36:46 1.1.1.2 +++ embedaddon/iperf/src/iperf.h 2023/09/27 11:14:54 1.1.1.3 @@ -39,7 +39,12 @@ #ifndef _GNU_SOURCE # define _GNU_SOURCE #endif +#ifdef HAVE_LINUX_TCP_H +#include +#else #include +#endif +#include // for IFNAMSIZ #if defined(HAVE_CPUSET_SETAFFINITY) #include @@ -74,36 +79,36 @@ typedef uint64_t iperf_size_t; 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_end_time; float interval_duration; /* for UDP */ - int interval_packet_count; - int interval_outoforder_packets; - int interval_cnt_error; - int packet_count; + int64_t interval_packet_count; + int64_t interval_outoforder_packets; + int64_t interval_cnt_error; + int64_t packet_count; double jitter; - int outoforder_packets; - int cnt_error; + int64_t outoforder_packets; + int64_t cnt_error; int omitted; -#if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)) && \ +#if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) && \ 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 /* Just placeholders, never accessed. */ char *tcpInfo; #endif - int interval_retrans; - int interval_sacks; - int snd_cwnd; + long interval_retrans; + long snd_cwnd; + long snd_wnd; TAILQ_ENTRY(iperf_interval_results) irlistentries; void *custom_data; - int rtt; - int rttvar; - int pmtu; + long rtt; + long rttvar; + long pmtu; }; struct iperf_stream_result @@ -113,15 +118,14 @@ struct iperf_stream_result iperf_size_t bytes_received_this_interval; iperf_size_t bytes_sent_this_interval; iperf_size_t bytes_sent_omit; - int stream_prev_total_retrans; - int stream_retrans; - int stream_prev_total_sacks; - int stream_sacks; - int stream_max_rtt; - int stream_min_rtt; - int stream_sum_rtt; + long stream_prev_total_retrans; + long stream_retrans; + long stream_max_rtt; + long stream_min_rtt; + long stream_sum_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 end_time; struct iperf_time start_time_fixed; @@ -139,7 +143,7 @@ struct iperf_settings int blksize; /* size of read/writes (-l) */ 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*/ - 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 */ uint64_t fqrate; /* target data rate for FQ pacing*/ int pacing_timer; /* pacing timer in microseconds */ @@ -152,6 +156,7 @@ struct iperf_settings iperf_size_t blocks; /* number of blocks (packets) to send */ char unit_format; /* -f */ int num_ostreams; /* SCTP initmsg settings */ + int dont_fragment; /* Whether to set IP flag Do-Not_Fragment */ #if defined(HAVE_SSL) char *authtoken; /* Authentication token */ char *client_username; @@ -159,6 +164,9 @@ struct iperf_settings EVP_PKEY *client_rsa_pubkey; #endif // HAVE_SSL 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; @@ -173,7 +181,7 @@ struct iperf_stream int socket; int id; 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? */ struct iperf_settings *settings; /* pointer to structure settings */ @@ -183,6 +191,7 @@ struct iperf_stream int green_light; int buffer_fd; /* data to send, file descriptor */ char *buffer; /* data to send, mmapped */ + int pending_size; /* pending data to send */ int diskfile_fd; /* file to send, file descriptor */ int diskfile_left; /* remaining file data on disk */ @@ -190,15 +199,16 @@ struct iperf_stream * for udp measurements - This can be a structure outside stream, and * stream can have a pointer to this */ - int packet_count; - int peer_packet_count; - int omitted_packet_count; + int64_t packet_count; + int64_t peer_packet_count; + int64_t peer_omitted_packet_count; + int64_t omitted_packet_count; double jitter; double prev_transit; - int outoforder_packets; - int omitted_outoforder_packets; - int cnt_error; - int omitted_cnt_error; + int64_t outoforder_packets; + int64_t omitted_outoforder_packets; + int64_t cnt_error; + int64_t omitted_cnt_error; uint64_t target; struct sockaddr_storage local_addr; @@ -246,6 +256,15 @@ enum iperf_mode { 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 { char role; /* 'c' lient or 's' erver */ @@ -257,6 +276,7 @@ struct iperf_test char *server_hostname; /* -c option */ char *tmp_template; char *bind_address; /* first -B option */ + char *bind_dev; /* bind to network device */ TAILQ_HEAD(xbind_addrhead, xbind_entry) xbind_addrs; /* all -X opts */ int bind_port; /* --cport option */ int server_port; @@ -278,6 +298,7 @@ struct iperf_test FILE *outfile; int ctrl_sck; + int mapped_v4; int listener; int prot_listener; @@ -286,6 +307,7 @@ struct iperf_test #if defined(HAVE_SSL) char *server_authorized_users; EVP_PKEY *server_rsa_private_key; + int server_skew_threshold; #endif // HAVE_SSL /* boolean variables for Options */ @@ -298,6 +320,7 @@ struct iperf_test int json_output; /* -J option - JSON output */ int zerocopy; /* -Z option - use sendfile */ 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 udp_counters_64bit; /* --use-64-bit-udp-counters */ int forceflush; /* --forceflush - flushing output at every interval */ @@ -312,7 +335,7 @@ struct iperf_test fd_set read_set; /* set of read sockets */ fd_set write_set; /* set of write sockets */ - /* Interval related members */ + /* Interval related members */ int omitting; double stats_interval; double reporter_interval; @@ -337,9 +360,14 @@ 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_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 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]; // struct iperf_stream *streams; /* pointer to list of struct stream */ SLIST_HEAD(slisthead, iperf_stream) streams; @@ -372,6 +400,8 @@ struct iperf_test /* default settings */ #define PORT 5201 /* default port to listen on (don't use the same port as iperf2) */ #define uS_TO_NS 1000 +#define mS_TO_US 1000 +#define SEC_TO_mS 1000 #define SEC_TO_US 1000000LL #define UDP_RATE (1024 * 1024) /* 1 Mbps */ #define OMIT 0 /* seconds */ @@ -400,5 +430,13 @@ struct iperf_test #define TIMESTAMP_FORMAT "%c " 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 */