Annotation of embedaddon/iperf/src/iperf.h, revision 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>