xref: /aosp_15_r20/external/iperf3/docs/dev.rst (revision 7ab6e6ace082586527a400463bc693a412a40341)
1*7ab6e6acSAndroid Build Coastguard Workeriperf3 Development
2*7ab6e6acSAndroid Build Coastguard Worker==================
3*7ab6e6acSAndroid Build Coastguard Worker
4*7ab6e6acSAndroid Build Coastguard WorkerThe iperf3 project is hosted on GitHub at:
5*7ab6e6acSAndroid Build Coastguard Worker
6*7ab6e6acSAndroid Build Coastguard Workerhttp://github.com/esnet/iperf
7*7ab6e6acSAndroid Build Coastguard Worker
8*7ab6e6acSAndroid Build Coastguard WorkerThis site includes the source code repository, issue tracker, and
9*7ab6e6acSAndroid Build Coastguard Workerwiki.
10*7ab6e6acSAndroid Build Coastguard Worker
11*7ab6e6acSAndroid Build Coastguard WorkerMailing Lists
12*7ab6e6acSAndroid Build Coastguard Worker-------------
13*7ab6e6acSAndroid Build Coastguard Worker
14*7ab6e6acSAndroid Build Coastguard WorkerThe developer list for iperf3 is:  [email protected].
15*7ab6e6acSAndroid Build Coastguard WorkerInformation on joining the mailing list can be found at:
16*7ab6e6acSAndroid Build Coastguard Worker
17*7ab6e6acSAndroid Build Coastguard Workerhttp://groups.google.com/group/iperf-dev
18*7ab6e6acSAndroid Build Coastguard Worker
19*7ab6e6acSAndroid Build Coastguard WorkerThere is, at the moment, no mailing list for user questions, although
20*7ab6e6acSAndroid Build Coastguard Workera low volume of inquiries on the developer list is probably
21*7ab6e6acSAndroid Build Coastguard Workeracceptable.  If necessary, a user-oriented mailing list might be
22*7ab6e6acSAndroid Build Coastguard Workercreated in the future.
23*7ab6e6acSAndroid Build Coastguard Worker
24*7ab6e6acSAndroid Build Coastguard WorkerBug Reports
25*7ab6e6acSAndroid Build Coastguard Worker-----------
26*7ab6e6acSAndroid Build Coastguard Worker
27*7ab6e6acSAndroid Build Coastguard WorkerBefore submitting a bug report, try checking out the latest version of
28*7ab6e6acSAndroid Build Coastguard Workerthe code, and confirm that it's not already fixed. Also see the :doc:`faq`.
29*7ab6e6acSAndroid Build Coastguard WorkerThen submit to the iperf3 issue tracker on GitHub:
30*7ab6e6acSAndroid Build Coastguard Worker
31*7ab6e6acSAndroid Build Coastguard Workerhttps://github.com/esnet/iperf/issues
32*7ab6e6acSAndroid Build Coastguard Worker
33*7ab6e6acSAndroid Build Coastguard Worker**Note:** Issues submitted to the old iperf3 issue tracker on Google
34*7ab6e6acSAndroid Build Coastguard WorkerCode (or comments to existing issues on the Google Code issue tracker)
35*7ab6e6acSAndroid Build Coastguard Workerwill be ignored.
36*7ab6e6acSAndroid Build Coastguard Worker
37*7ab6e6acSAndroid Build Coastguard WorkerChanges from iperf 2.x
38*7ab6e6acSAndroid Build Coastguard Worker----------------------
39*7ab6e6acSAndroid Build Coastguard Worker
40*7ab6e6acSAndroid Build Coastguard WorkerNew options (not necessarily complete, please refer to the manual page
41*7ab6e6acSAndroid Build Coastguard Workerfor a complete list of iperf3 options)::
42*7ab6e6acSAndroid Build Coastguard Worker
43*7ab6e6acSAndroid Build Coastguard Worker    -V, --verbose             more detailed output than before
44*7ab6e6acSAndroid Build Coastguard Worker    -J, --json                output in JSON format
45*7ab6e6acSAndroid Build Coastguard Worker    -Z, --zerocopy            use a 'zero copy' sendfile() method of sending data
46*7ab6e6acSAndroid Build Coastguard Worker    -O, --omit N              omit the first n seconds (to ignore slowstart)
47*7ab6e6acSAndroid Build Coastguard Worker    -T, --title str           prefix every output line with this string
48*7ab6e6acSAndroid Build Coastguard Worker    -F, --file name           xmit/recv the specified file
49*7ab6e6acSAndroid Build Coastguard Worker    -A, --affinity n/n,m      set CPU affinity (Linux and FreeBSD only)
50*7ab6e6acSAndroid Build Coastguard Worker    -k, --blockcount #[KMG]   number of blocks (packets) to transmit (instead
51*7ab6e6acSAndroid Build Coastguard Worker                              of -t or -n)
52*7ab6e6acSAndroid Build Coastguard Worker    -L, --flowlabel           set IPv6 flow label (Linux only)
53*7ab6e6acSAndroid Build Coastguard Worker
54*7ab6e6acSAndroid Build Coastguard WorkerChanged flags::
55*7ab6e6acSAndroid Build Coastguard Worker
56*7ab6e6acSAndroid Build Coastguard Worker    -C, --linux-congestion    set congestion control algorithm (Linux only)
57*7ab6e6acSAndroid Build Coastguard Worker                              (-Z in iperf2)
58*7ab6e6acSAndroid Build Coastguard Worker
59*7ab6e6acSAndroid Build Coastguard Worker
60*7ab6e6acSAndroid Build Coastguard WorkerDeprecated flags (currently no plans to support)::
61*7ab6e6acSAndroid Build Coastguard Worker
62*7ab6e6acSAndroid Build Coastguard Worker    -d, --dualtest           Do a bidirectional test simultaneously
63*7ab6e6acSAndroid Build Coastguard Worker    -r, --tradeoff           Do a bidirectional test individually
64*7ab6e6acSAndroid Build Coastguard Worker    -T, --ttl                time-to-live, for multicast (default 1)
65*7ab6e6acSAndroid Build Coastguard Worker    -x, --reportexclude [CDMSV]   exclude C(connection) D(data) M(multicast)
66*7ab6e6acSAndroid Build Coastguard Worker                                  S(settings) V(server) reports
67*7ab6e6acSAndroid Build Coastguard Worker    -y, --reportstyle C      report as a Comma-Separated Values
68*7ab6e6acSAndroid Build Coastguard Worker
69*7ab6e6acSAndroid Build Coastguard WorkerAlso deprecated is the ability to set the options via environment
70*7ab6e6acSAndroid Build Coastguard Workervariables.
71*7ab6e6acSAndroid Build Coastguard Worker
72*7ab6e6acSAndroid Build Coastguard WorkerKnown Issues
73*7ab6e6acSAndroid Build Coastguard Worker------------
74*7ab6e6acSAndroid Build Coastguard Worker
75*7ab6e6acSAndroid Build Coastguard WorkerThe following problems are notable known issues, which are probably of
76*7ab6e6acSAndroid Build Coastguard Workerinterest to a large fraction of users or have high impact for some
77*7ab6e6acSAndroid Build Coastguard Workerusers, and for which issues have already been filed in the issue
78*7ab6e6acSAndroid Build Coastguard Workertracker.  These issues are either open (indicating no solution
79*7ab6e6acSAndroid Build Coastguard Workercurrently exists) or closed with the notation that no further attempts
80*7ab6e6acSAndroid Build Coastguard Workerto solve the problem are currently being made:
81*7ab6e6acSAndroid Build Coastguard Worker
82*7ab6e6acSAndroid Build Coastguard Worker* The ``-Z`` flag sometimes causes the iperf3 client to hang on OSX.
83*7ab6e6acSAndroid Build Coastguard Worker  (Issue #129)
84*7ab6e6acSAndroid Build Coastguard Worker
85*7ab6e6acSAndroid Build Coastguard Worker* When specifying the TCP buffer size using the ``-w`` flag on Linux,
86*7ab6e6acSAndroid Build Coastguard Worker  the Linux kernel automatically doubles the value passed in to
87*7ab6e6acSAndroid Build Coastguard Worker  compensate for overheads.  (This can be observed by using
88*7ab6e6acSAndroid Build Coastguard Worker  iperf3's ``--debug`` flag.)  However, CWND does not actually ramp up
89*7ab6e6acSAndroid Build Coastguard Worker  to the doubled value, but only to about 75% of the doubled
90*7ab6e6acSAndroid Build Coastguard Worker  value.  Some part of this behavior is documented in the tcp(7)
91*7ab6e6acSAndroid Build Coastguard Worker  manual page.
92*7ab6e6acSAndroid Build Coastguard Worker
93*7ab6e6acSAndroid Build Coastguard Worker* Although the ``-w`` flag is documented as setting the (TCP) window
94*7ab6e6acSAndroid Build Coastguard Worker  size, it is also used to set the socket buffer size.  This has been
95*7ab6e6acSAndroid Build Coastguard Worker  shown to be helpful with high-bitrate UDP tests.
96*7ab6e6acSAndroid Build Coastguard Worker
97*7ab6e6acSAndroid Build Coastguard Worker* On some platforms (observed on at least one version of Ubuntu
98*7ab6e6acSAndroid Build Coastguard Worker  Linux), it might be necessary to invoke ``ldconfig`` manually after
99*7ab6e6acSAndroid Build Coastguard Worker  doing a ``make install`` before the ``iperf3`` executable can find
100*7ab6e6acSAndroid Build Coastguard Worker  its shared library.  (Issue #153)
101*7ab6e6acSAndroid Build Coastguard Worker
102*7ab6e6acSAndroid Build Coastguard Worker* The results printed on the server side at the end of a test do not
103*7ab6e6acSAndroid Build Coastguard Worker  correctly reflect the client-side measurements.  This is due to the
104*7ab6e6acSAndroid Build Coastguard Worker  ordering of computing and transferring results between the client
105*7ab6e6acSAndroid Build Coastguard Worker  and server.  (Issue #293)
106*7ab6e6acSAndroid Build Coastguard Worker
107*7ab6e6acSAndroid Build Coastguard Worker* The server could have a very short measurement reporting interval at
108*7ab6e6acSAndroid Build Coastguard Worker  the end of a test (particularly a UDP test), containing few or no
109*7ab6e6acSAndroid Build Coastguard Worker  packets.  This issue is due to an artifact of timing between the
110*7ab6e6acSAndroid Build Coastguard Worker  client and server.  (Issue #278)
111*7ab6e6acSAndroid Build Coastguard Worker
112*7ab6e6acSAndroid Build Coastguard WorkerThere are, of course, many other open and closed issues in the issue
113*7ab6e6acSAndroid Build Coastguard Workertracker.
114*7ab6e6acSAndroid Build Coastguard Worker
115*7ab6e6acSAndroid Build Coastguard WorkerVersioning
116*7ab6e6acSAndroid Build Coastguard Worker----------
117*7ab6e6acSAndroid Build Coastguard Worker
118*7ab6e6acSAndroid Build Coastguard Workeriperf3 version numbers use (roughly) a `Semantic Versioning
119*7ab6e6acSAndroid Build Coastguard Worker<http://semver.org/>`_ scheme, in which version numbers consist of
120*7ab6e6acSAndroid Build Coastguard Workerthree parts:  *MAJOR.MINOR.PATCH*
121*7ab6e6acSAndroid Build Coastguard Worker
122*7ab6e6acSAndroid Build Coastguard WorkerThe developers increment the:
123*7ab6e6acSAndroid Build Coastguard Worker
124*7ab6e6acSAndroid Build Coastguard Worker* *MAJOR* version when making incompatible API changes,
125*7ab6e6acSAndroid Build Coastguard Worker
126*7ab6e6acSAndroid Build Coastguard Worker* *MINOR* version when adding functionality in a backwards-compatible manner, and
127*7ab6e6acSAndroid Build Coastguard Worker
128*7ab6e6acSAndroid Build Coastguard Worker* *PATCH* version when making backwards-compatible bug fixes.
129*7ab6e6acSAndroid Build Coastguard Worker
130*7ab6e6acSAndroid Build Coastguard WorkerRelease Engineering Checklist
131*7ab6e6acSAndroid Build Coastguard Worker-----------------------------
132*7ab6e6acSAndroid Build Coastguard Worker
133*7ab6e6acSAndroid Build Coastguard Worker1. Update the ``README`` and ``RELEASE_NOTES`` files to be accurate. Make sure
134*7ab6e6acSAndroid Build Coastguard Worker   that the "Known Issues" section of the ``README`` file and in this document
135*7ab6e6acSAndroid Build Coastguard Worker   are up to date.
136*7ab6e6acSAndroid Build Coastguard Worker
137*7ab6e6acSAndroid Build Coastguard Worker2. Compose a release announcement.  Most of the release announcement
138*7ab6e6acSAndroid Build Coastguard Worker   can be written before tagging.  Usually the previous version's
139*7ab6e6acSAndroid Build Coastguard Worker   announcement can be used as a starting point.
140*7ab6e6acSAndroid Build Coastguard Worker
141*7ab6e6acSAndroid Build Coastguard Worker3. Preferably starting from a clean source tree (be sure that ``git
142*7ab6e6acSAndroid Build Coastguard Worker   status`` emits no output), make the changes necessary to produce
143*7ab6e6acSAndroid Build Coastguard Worker   the new version, such as bumping version numbers::
144*7ab6e6acSAndroid Build Coastguard Worker
145*7ab6e6acSAndroid Build Coastguard Worker    vi RELEASE_NOTES   # update version number and release date
146*7ab6e6acSAndroid Build Coastguard Worker    vi configure.ac    # update version parameter in AC_INIT
147*7ab6e6acSAndroid Build Coastguard Worker    vi src/iperf3.1    # update manpage revision date if needed
148*7ab6e6acSAndroid Build Coastguard Worker    vi src/libiperf.3  # update manpage revision date if needed
149*7ab6e6acSAndroid Build Coastguard Worker    git commit -a      # commit changes to the local repository only
150*7ab6e6acSAndroid Build Coastguard Worker    ./bootstrap.sh     # regenerate configure script, etc.
151*7ab6e6acSAndroid Build Coastguard Worker    git commit -a      # commit changes to the local repository only
152*7ab6e6acSAndroid Build Coastguard Worker
153*7ab6e6acSAndroid Build Coastguard Worker    # Assuming that $VERSION is the version number to be released...
154*7ab6e6acSAndroid Build Coastguard Worker    ./make_release tag $VERSION # this creates a tag in the local repo
155*7ab6e6acSAndroid Build Coastguard Worker    ./make_release tar $VERSION # create tarball and compute SHA256 hash
156*7ab6e6acSAndroid Build Coastguard Worker
157*7ab6e6acSAndroid Build Coastguard Worker   These steps should be done on a platform with a relatively recent
158*7ab6e6acSAndroid Build Coastguard Worker   version of autotools / libtools.  Examples are MacOS / MacPorts or
159*7ab6e6acSAndroid Build Coastguard Worker   FreeBSD.  The versions of these tools in CentOS 6 are somewhat
160*7ab6e6acSAndroid Build Coastguard Worker   older and probably should be avoided.
161*7ab6e6acSAndroid Build Coastguard Worker
162*7ab6e6acSAndroid Build Coastguard Worker   The result will be a release artifact that should be used for
163*7ab6e6acSAndroid Build Coastguard Worker   pre-testing.
164*7ab6e6acSAndroid Build Coastguard Worker
165*7ab6e6acSAndroid Build Coastguard Worker4. Stage the tarball (and a file containing the SHA256 hash) to the
166*7ab6e6acSAndroid Build Coastguard Worker   download site.  Currently this is located on ``downloads.es.net``.
167*7ab6e6acSAndroid Build Coastguard Worker
168*7ab6e6acSAndroid Build Coastguard Worker5. From another host, test the link in the release announcement by
169*7ab6e6acSAndroid Build Coastguard Worker   downloading a fresh copy of the file and verifying the SHA256
170*7ab6e6acSAndroid Build Coastguard Worker   checksum.  Checking all other links in the release announcement is
171*7ab6e6acSAndroid Build Coastguard Worker   strongly recommended as well.
172*7ab6e6acSAndroid Build Coastguard Worker
173*7ab6e6acSAndroid Build Coastguard Worker6. Also verify (with file(1)) that the tarball is actually a gzipped
174*7ab6e6acSAndroid Build Coastguard Worker   tarball.
175*7ab6e6acSAndroid Build Coastguard Worker
176*7ab6e6acSAndroid Build Coastguard Worker7. For extra points, actually try downloading, compiling, and
177*7ab6e6acSAndroid Build Coastguard Worker   smoke-testing the results of the tarball on all supported
178*7ab6e6acSAndroid Build Coastguard Worker   platforms.
179*7ab6e6acSAndroid Build Coastguard Worker
180*7ab6e6acSAndroid Build Coastguard Worker8. Plug the SHA256 checksum into the release announcement.
181*7ab6e6acSAndroid Build Coastguard Worker
182*7ab6e6acSAndroid Build Coastguard Worker9. PGP-sign the release announcement text using ``gpg --clearsign``.
183*7ab6e6acSAndroid Build Coastguard Worker   The signed announcement will be sent out in a subsequent emails,
184*7ab6e6acSAndroid Build Coastguard Worker   but could also be archived.  Decoupling the signing from emailing
185*7ab6e6acSAndroid Build Coastguard Worker   allows a signed release announcement to be resent via email or sent
186*7ab6e6acSAndroid Build Coastguard Worker   by other, non-email means.
187*7ab6e6acSAndroid Build Coastguard Worker
188*7ab6e6acSAndroid Build Coastguard Worker10. At this point, the release can and should be considered
189*7ab6e6acSAndroid Build Coastguard Worker    finalized.  To commit the release-engineering-related changes to
190*7ab6e6acSAndroid Build Coastguard Worker    GitHub and make them public, push them out thusly::
191*7ab6e6acSAndroid Build Coastguard Worker
192*7ab6e6acSAndroid Build Coastguard Worker     git push            # Push version changes
193*7ab6e6acSAndroid Build Coastguard Worker     git push --tags     # Push the new tag to the GitHub repo
194*7ab6e6acSAndroid Build Coastguard Worker
195*7ab6e6acSAndroid Build Coastguard Worker11. Send the PGP-signed release announcement to the following
196*7ab6e6acSAndroid Build Coastguard Worker    addresses.  Remember to turn off signing in the MUA, if
197*7ab6e6acSAndroid Build Coastguard Worker    applicable.  Remember to check the source address when posting to
198*7ab6e6acSAndroid Build Coastguard Worker    lists, as "closed" list will reject posting from all from
199*7ab6e6acSAndroid Build Coastguard Worker    registered email addresses.
200*7ab6e6acSAndroid Build Coastguard Worker
201*7ab6e6acSAndroid Build Coastguard Worker    * [email protected]
202*7ab6e6acSAndroid Build Coastguard Worker
203*7ab6e6acSAndroid Build Coastguard Worker    * [email protected]
204*7ab6e6acSAndroid Build Coastguard Worker
205*7ab6e6acSAndroid Build Coastguard Worker    * [email protected]
206*7ab6e6acSAndroid Build Coastguard Worker
207*7ab6e6acSAndroid Build Coastguard Worker    * [email protected]
208*7ab6e6acSAndroid Build Coastguard Worker
209*7ab6e6acSAndroid Build Coastguard Worker    Note: Thunderbird sometimes mangles the PGP-signed release
210*7ab6e6acSAndroid Build Coastguard Worker    announcement so that it does not verify correctly.  This could be
211*7ab6e6acSAndroid Build Coastguard Worker    due to Thunderbird trying to wrap the length of extremely long
212*7ab6e6acSAndroid Build Coastguard Worker    lines (such as the SHA256 hash).  Apple Mail and mutt seem to
213*7ab6e6acSAndroid Build Coastguard Worker    handle this situation correctly.  Testing the release announcement
214*7ab6e6acSAndroid Build Coastguard Worker    sending process by sending a copy to oneself first and attempting
215*7ab6e6acSAndroid Build Coastguard Worker    to verify the signature is highly encouraged.
216*7ab6e6acSAndroid Build Coastguard Worker
217*7ab6e6acSAndroid Build Coastguard Worker12. Update the iperf3 Project News section of the documentation site
218*7ab6e6acSAndroid Build Coastguard Worker    to announce the new release (see ``docs/news.rst`` and
219*7ab6e6acSAndroid Build Coastguard Worker    ``docs/conf.py`` in the source tree) and deploy a new build of the
220*7ab6e6acSAndroid Build Coastguard Worker    documentation to GitHub Pages.
221*7ab6e6acSAndroid Build Coastguard Worker
222*7ab6e6acSAndroid Build Coastguard Worker13. If an update to the on-line manual page is needed, it can be
223*7ab6e6acSAndroid Build Coastguard Worker    generated with this sequence of commands (tested on CentOS 7) and
224*7ab6e6acSAndroid Build Coastguard Worker    import the result into ``invoking.rst``::
225*7ab6e6acSAndroid Build Coastguard Worker
226*7ab6e6acSAndroid Build Coastguard Worker     TERM=
227*7ab6e6acSAndroid Build Coastguard Worker     export TERM
228*7ab6e6acSAndroid Build Coastguard Worker     nroff -Tascii -c -man src/iperf3.1 | ul | sed 's/^/   /' > iperf3.txt
229*7ab6e6acSAndroid Build Coastguard Worker
230*7ab6e6acSAndroid Build Coastguard WorkerCode Authors
231*7ab6e6acSAndroid Build Coastguard Worker------------
232*7ab6e6acSAndroid Build Coastguard Worker
233*7ab6e6acSAndroid Build Coastguard WorkerThe main authors of iperf3 are (in alphabetical order):  Jon Dugan,
234*7ab6e6acSAndroid Build Coastguard WorkerSeth Elliott, Bruce A. Mah, Jeff Poskanzer, Kaustubh Prabhu.
235*7ab6e6acSAndroid Build Coastguard WorkerAdditional code contributions have come from (also in alphabetical
236*7ab6e6acSAndroid Build Coastguard Workerorder):  Mark Ashley, Aaron Brown, Aeneas Jaißle, Susant Sahani,
237*7ab6e6acSAndroid Build Coastguard WorkerBruce Simpson, Brian Tierney.
238*7ab6e6acSAndroid Build Coastguard Worker
239*7ab6e6acSAndroid Build Coastguard Workeriperf3 contains some original code from iperf2.  The authors of iperf2
240*7ab6e6acSAndroid Build Coastguard Workerare (in alphabetical order): Jon Dugan, John Estabrook, Jim Ferbuson,
241*7ab6e6acSAndroid Build Coastguard WorkerAndrew Gallatin, Mark Gates, Kevin Gibbs, Stephen Hemminger, Nathan
242*7ab6e6acSAndroid Build Coastguard WorkerJones, Feng Qin, Gerrit Renker, Ajay Tirumala, Alex Warshavsky.
243