Annotation of embedaddon/iperf/src/iperf.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * iperf, Copyright (c) 2014, 2015, 2016, 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@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_H
                     28: #define __IPERF_H
                     29: 
                     30: #include "iperf_config.h"
                     31: 
                     32: #include <sys/time.h>
                     33: #include <sys/types.h>
                     34: #ifdef HAVE_STDINT_H
                     35: #include <stdint.h>
                     36: #endif
                     37: #include <sys/select.h>
                     38: #include <sys/socket.h>
                     39: #include <netinet/tcp.h>
                     40: 
                     41: #if defined(HAVE_CPUSET_SETAFFINITY)
                     42: #include <sys/param.h>
                     43: #include <sys/cpuset.h>
                     44: #endif /* HAVE_CPUSET_SETAFFINITY */
                     45: 
                     46: #include "timer.h"
                     47: #include "queue.h"
                     48: #include "cjson.h"
                     49: 
                     50: typedef uint64_t iperf_size_t;
                     51: 
                     52: struct iperf_interval_results
                     53: {
                     54:     iperf_size_t bytes_transferred; /* bytes transfered in this interval */
                     55:     struct timeval interval_start_time;
                     56:     struct timeval interval_end_time;
                     57:     float     interval_duration;
                     58: 
                     59:     /* for UDP */
                     60:     int       interval_packet_count;
                     61:     int       interval_outoforder_packets;
                     62:     int       interval_cnt_error;
                     63:     int       packet_count;
                     64:     double    jitter;
                     65:     int       outoforder_packets;
                     66:     int       cnt_error;
                     67: 
                     68:     int omitted;
                     69: #if (defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)) && \
                     70:        defined(TCP_INFO)
                     71:     struct tcp_info tcpInfo; /* getsockopt(TCP_INFO) for Linux, {Free,Net}BSD */
                     72: #else
                     73:     /* Just placeholders, never accessed. */
                     74:     char *tcpInfo;
                     75: #endif
                     76:     int interval_retrans;
                     77:     int interval_sacks;
                     78:     int snd_cwnd;
                     79:     TAILQ_ENTRY(iperf_interval_results) irlistentries;
                     80:     void     *custom_data;
                     81:     int rtt;
                     82: };
                     83: 
                     84: struct iperf_stream_result
                     85: {
                     86:     iperf_size_t bytes_received;
                     87:     iperf_size_t bytes_sent;
                     88:     iperf_size_t bytes_received_this_interval;
                     89:     iperf_size_t bytes_sent_this_interval;
                     90:     iperf_size_t bytes_sent_omit;
                     91:     int stream_prev_total_retrans;
                     92:     int stream_retrans;
                     93:     int stream_prev_total_sacks;
                     94:     int stream_sacks;
                     95:     int stream_max_rtt;
                     96:     int stream_min_rtt;
                     97:     int stream_sum_rtt;
                     98:     int stream_count_rtt;
                     99:     int stream_max_snd_cwnd;
                    100:     struct timeval start_time;
                    101:     struct timeval end_time;
                    102:     struct timeval start_time_fixed;
                    103:     TAILQ_HEAD(irlisthead, iperf_interval_results) interval_results;
                    104:     void     *data;
                    105: };
                    106: 
                    107: #define COOKIE_SIZE 37         /* size of an ascii uuid */
                    108: struct iperf_settings
                    109: {
                    110:     int       domain;               /* AF_INET or AF_INET6 */
                    111:     int       socket_bufsize;       /* window size for TCP */
                    112:     int       blksize;              /* size of read/writes (-l) */
                    113:     uint64_t  rate;                 /* target data rate */
                    114:     int       burst;                /* packets per burst */
                    115:     int       mss;                  /* for TCP MSS */
                    116:     int       ttl;                  /* IP TTL option */
                    117:     int       tos;                  /* type of service bit */
                    118:     int       flowlabel;            /* IPv6 flow label */
                    119:     iperf_size_t bytes;             /* number of bytes to send */
                    120:     iperf_size_t blocks;            /* number of blocks (packets) to send */
                    121:     char      unit_format;          /* -f */
                    122:     int       num_ostreams;         /* SCTP initmsg settings */
                    123: };
                    124: 
                    125: struct iperf_test;
                    126: 
                    127: struct iperf_stream
                    128: {
                    129:     struct iperf_test* test;
                    130: 
                    131:     /* configurable members */
                    132:     int       local_port;
                    133:     int       remote_port;
                    134:     int       socket;
                    135:     int       id;
                    136:        /* XXX: is settings just a pointer to the same struct in iperf_test? if not, 
                    137:                should it be? */
                    138:     struct iperf_settings *settings;   /* pointer to structure settings */
                    139: 
                    140:     /* non configurable members */
                    141:     struct iperf_stream_result *result;        /* structure pointer to result */
                    142:     Timer     *send_timer;
                    143:     int       green_light;
                    144:     int       buffer_fd;       /* data to send, file descriptor */
                    145:     char      *buffer;         /* data to send, mmapped */
                    146:     int       diskfile_fd;     /* file to send, file descriptor */
                    147: 
                    148:     /*
                    149:      * for udp measurements - This can be a structure outside stream, and
                    150:      * stream can have a pointer to this
                    151:      */
                    152:     int       packet_count;
                    153:     int       omitted_packet_count;
                    154:     double    jitter;
                    155:     double    prev_transit;
                    156:     int       outoforder_packets;
                    157:     int       omitted_outoforder_packets;
                    158:     int       cnt_error;
                    159:     int       omitted_cnt_error;
                    160:     uint64_t  target;
                    161: 
                    162:     struct sockaddr_storage local_addr;
                    163:     struct sockaddr_storage remote_addr;
                    164: 
                    165:     int       (*rcv) (struct iperf_stream * stream);
                    166:     int       (*snd) (struct iperf_stream * stream);
                    167: 
                    168:     /* chained send/receive routines for -F mode */
                    169:     int       (*rcv2) (struct iperf_stream * stream);
                    170:     int       (*snd2) (struct iperf_stream * stream);
                    171: 
                    172: //    struct iperf_stream *next;
                    173:     SLIST_ENTRY(iperf_stream) streams;
                    174: 
                    175:     void     *data;
                    176: };
                    177: 
                    178: struct protocol {
                    179:     int       id;
                    180:     char      *name;
                    181:     int       (*accept)(struct iperf_test *);
                    182:     int       (*listen)(struct iperf_test *);
                    183:     int       (*connect)(struct iperf_test *);
                    184:     int       (*send)(struct iperf_stream *);
                    185:     int       (*recv)(struct iperf_stream *);
                    186:     int       (*init)(struct iperf_test *);
                    187:     SLIST_ENTRY(protocol) protocols;
                    188: };
                    189: 
                    190: struct iperf_textline {
                    191:     char *line;
                    192:     TAILQ_ENTRY(iperf_textline) textlineentries;
                    193: };
                    194: 
                    195: struct xbind_entry {
                    196:     char *name;
                    197:     struct addrinfo *ai;
                    198:     TAILQ_ENTRY(xbind_entry) link;
                    199: };
                    200: 
                    201: struct iperf_test
                    202: {
                    203:     char      role;                             /* 'c' lient or 's' erver */
                    204:     int       sender;                           /* client & !reverse or server & reverse */
                    205:     int       sender_has_retransmits;
                    206:     struct protocol *protocol;
                    207:     signed char state;
                    208:     char     *server_hostname;                  /* -c option */
                    209:     char     *tmp_template;
                    210:     char     *bind_address;                     /* first -B option */
                    211:     TAILQ_HEAD(xbind_addrhead, xbind_entry) xbind_addrs; /* all -X opts */
                    212:     int       bind_port;                        /* --cport option */
                    213:     int       server_port;
                    214:     int       omit;                             /* duration of omit period (-O flag) */
                    215:     int       duration;                         /* total duration of test (-t flag) */
                    216:     char     *diskfile_name;                   /* -F option */
                    217:     int       affinity, server_affinity;       /* -A option */
                    218: #if defined(HAVE_CPUSET_SETAFFINITY)
                    219:     cpuset_t cpumask;
                    220: #endif /* HAVE_CPUSET_SETAFFINITY */
                    221:     char     *title;                           /* -T option */
                    222:     char     *congestion;                      /* -C option */
                    223:     char     *pidfile;                         /* -P option */
                    224: 
                    225:     char     *logfile;                         /* --logfile option */
                    226:     FILE     *outfile;
                    227: 
                    228:     int       ctrl_sck;
                    229:     int       listener;
                    230:     int       prot_listener;
                    231: 
                    232:     /* boolean variables for Options */
                    233:     int       daemon;                           /* -D option */
                    234:     int       one_off;                          /* -1 option */
                    235:     int       no_delay;                         /* -N option */
                    236:     int       reverse;                          /* -R option */
                    237:     int              verbose;                          /* -V option - verbose mode */
                    238:     int              json_output;                      /* -J option - JSON output */
                    239:     int              zerocopy;                         /* -Z option - use sendfile */
                    240:     int       debug;                           /* -d option - enable debug */
                    241:     int              get_server_output;                /* --get-server-output */
                    242:     int              udp_counters_64bit;               /* --use-64-bit-udp-counters */
                    243:     int       no_fq_socket_pacing;       /* --no-fq-socket-pacing */
                    244:     int              multisend;
                    245: 
                    246:     char     *json_output_string; /* rendered JSON output if json_output is set */
                    247:     /* Select related parameters */
                    248:     int       max_fd;
                    249:     fd_set    read_set;                         /* set of read sockets */
                    250:     fd_set    write_set;                        /* set of write sockets */
                    251: 
                    252:     /* Interval related members */ 
                    253:     int       omitting;
                    254:     double    stats_interval;
                    255:     double    reporter_interval;
                    256:     void      (*stats_callback) (struct iperf_test *);
                    257:     void      (*reporter_callback) (struct iperf_test *);
                    258:     Timer     *omit_timer;
                    259:     Timer     *timer;
                    260:     int        done;
                    261:     Timer     *stats_timer;
                    262:     Timer     *reporter_timer;
                    263: 
                    264:     double cpu_util[3];                            /* cpu utilization of the test - total, user, system */
                    265:     double remote_cpu_util[3];                     /* cpu utilization for the remote host/client - total, user, system */
                    266: 
                    267:     int       num_streams;                      /* total streams in the test (-P) */
                    268: 
                    269:     iperf_size_t bytes_sent;
                    270:     iperf_size_t blocks_sent;
                    271:     char      cookie[COOKIE_SIZE];
                    272: //    struct iperf_stream *streams;               /* pointer to list of struct stream */
                    273:     SLIST_HEAD(slisthead, iperf_stream) streams;
                    274:     struct iperf_settings *settings;
                    275: 
                    276:     SLIST_HEAD(plisthead, protocol) protocols;
                    277: 
                    278:     /* callback functions */
                    279:     void      (*on_new_stream)(struct iperf_stream *);
                    280:     void      (*on_test_start)(struct iperf_test *);
                    281:     void      (*on_connect)(struct iperf_test *);
                    282:     void      (*on_test_finish)(struct iperf_test *);
                    283: 
                    284:     /* cJSON handles for use when in -J mode */\
                    285:     cJSON *json_top;
                    286:     cJSON *json_start;
                    287:     cJSON *json_connected;
                    288:     cJSON *json_intervals;
                    289:     cJSON *json_end;
                    290: 
                    291:     /* Server output (use on client side only) */
                    292:     char *server_output_text;
                    293:     cJSON *json_server_output;
                    294: 
                    295:     /* Server output (use on server side only) */
                    296:     TAILQ_HEAD(iperf_textlisthead, iperf_textline) server_output_list;
                    297: 
                    298: };
                    299: 
                    300: /* default settings */
                    301: #define PORT 5201  /* default port to listen on (don't use the same port as iperf2) */
                    302: #define uS_TO_NS 1000
                    303: #define SEC_TO_US 1000000LL
                    304: #define UDP_RATE (1024 * 1024) /* 1 Mbps */
                    305: #define OMIT 0 /* seconds */
                    306: #define DURATION 10 /* seconds */
                    307: 
                    308: #define SEC_TO_NS 1000000000LL /* too big for enum/const on some platforms */
                    309: #define MAX_RESULT_STRING 4096
                    310: 
                    311: /* constants for command line arg sanity checks */
                    312: #define MB (1024 * 1024)
                    313: #define MAX_TCP_BUFFER (512 * MB)
                    314: #define MAX_BLOCKSIZE MB
                    315: /* Maximum size UDP send is (64K - 1) - IP and UDP header sizes */
                    316: #define MAX_UDP_BLOCKSIZE (65535 - 8 - 20)
                    317: #define MIN_INTERVAL 0.1
                    318: #define MAX_INTERVAL 60.0
                    319: #define MAX_TIME 86400
                    320: #define MAX_BURST 1000
                    321: #define MAX_MSS (9 * 1024)
                    322: #define MAX_STREAMS 128
                    323: 
                    324: #endif /* !__IPERF_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>