These are the Release Notes leading-up to Revision 2.4.5 of netperf:

Things changed in this release:

*) Fixes for Linux procstat-based CPU utilization on newer kernels
   from Andrew Gallatin.

*) Fix for a TCP_RR hang from Michael Shuldman

*) Compilation cleanups for MingW cnd MSDOS (djgpp) ourtesy of Gisle
   Vanem.

*) Changes to enable compilation and building of netperf for
   VMware. Kudos to the person who did the first port, I will be happy
   to name that person when told it is OK :)

*) Fixes from Adam Bidema for launching netserver children when the
   path to netserver.exe is very long.  

*) For the first time, netperf2 has a dependency, albeit optional, on
   another non-base-os bit of code - libsmbios under Linux.  It will
   attept to detect this at compile time and use it to report the
   system model name in an omni test.  If libsmbios is there we will
   try to use it, otherwise we will not.  If the associated include
   file is also there (eg the -dev package in apt-get-speak), we will
   use it to get the prototype for SMBIOSGetSystemName, otherwise we
   make a guess as to the prototype for SMBIOSGetSystemName(), which
   is the only call we make to libsmbios.

*) Fixes for BSD CPU utilization to deal with different BSD variants
   using different types.  Courtesy of Simon Burge <simonb@NetBSD.org>

*) The "omni" suite has been added on an experimental basis.  If it
   works-out then many of the tests in src/nettest_bsd.c,
   src/nettest_sdp.c, and src/nettest_sctp.c will be "migrated" to use
   the "omni infrastructure" (aka two routines to measure them
   all...).  Apart from reduced socket code, the omni suite has
   user-configurable output in either "human readable," CSV or
   keyword=value format.  By default, a VERY large quantity of data is
   output when asking for csv format (test-specific -o option) or
   keyword format (test-specific -k option).  The omni suite is not
   yet documented (there are some as-yet undiagnosed problems with
   doc/netperf.texi in emacs texinfo mode and updating nodes and links
   and such - any help there would be appreciated) but there is a
   small text file in doc/ describing the names (most) of the
   available output's.  For the most up-to-date list consult
   src/nettest_omni.c and the enum netperf_output_name. Or, you can
   pass-in a "filename" of '?' to either of the -O, -o or -k options
   and netperf will emit a list of the known available outputs.

*) Coming along for the ride are some new platform specific files to
   determine the probable egress interface for each end of a test, as
   well as driver information for that interface.  There is also
   reporting of "uname" like information for both local and remote
   system, and eventually perhaps something about the vendor's model
   name for the systems as well as the processor types.  The end goal
   is to make it easy to get most if not all what one would want in a
   database of netperf results.

*) The UDP_RR test now understands the global -f option to change
   output units.  It also understands the -B option to tag
   results. Courtesy of Alexander Duyck.

*) A fix has been added for hanging UDP_RR tests under
   Windows. Courtesy of Alexander Duyck.

*) Use vfork() on those platforms without fork(), courtesy of Matt
   Waddel

*) Track the bouncing interfaces that are linux processor affinity

*) Fixes for Solaris sendfilev usage.

*) A TCP_MSS test has been added which will report the MSS for a data
   connection setup as if the test were a TCP_STREAM test.  While the
   remote (netserver) is tricked into thinking it is to accept a
   TCP_STREAM test, no actual data will flow over the connection.
   This means that if the MSS is one which might change over the life
   of the connection, it will not be reflected in the test output.
   Should this prove to be a problem a single send() can be arranged
   along with the return of the shutdown();recv() handshake.

   The idea is that this might be useful for netperf scripts wanting
   to parameterize things based on the MSS - for example the
   packet_byte_script.

*) The width of the confidence interval can be specified in fractions
   of a percent for the confidence of a clean, close, comfortable
   calculation. :)

*) Honor the global -B option in a TCP_SENDFILE test.

*) Correct the sense of Send/Recv in the banner of a TCP_MAERTS test.

These are the Release Notes for Revision 2.4.4 of netperf:

Things changed in this release:

*) The LOC_CPU and REM_CPU tests will report their respective beliefs
   as to the number of CPUs present when the verbosity is set to more
   than one.  This can be used when trying to diagnose issues with CPU
   utilization.

*) A kind soul who wishes to remain anonymous provided a patch to
   enable use of sendfile() on OSX.

*) Fix a misplaced \n in a format string of send_tcp_maerts, courtesy
   of Alexander Duyck.

*) There is an experimental global -r option which will allow one to
   include CPU utilization measurements, but make the decision about
   hitting confidence based on the result only.  The test banner will
   reflects this when -r is used.

*) It is no longer necessary to specify a file with the global -F
   option when running a _SENDFILE test.  Netperf will create a
   temporary file and populate it with random data and use that.  If
   running aggregate tests it is strongly suggested one use a -F
   option. Otherwise, the overhead spent creating and populating the
   temporary file will be included in the CPU utilization calculation.

*) The configure script recognizes Solaris 11 and selects the correct
   CPU utilization mechanism - or rather it selects the same mechanism
   as is used in Solaris 10.  Fix courtesy of Andrew Gallatin.

*) Convert a number of struct sockaddr_in's to struct
   sockaddr_storage's and add requisite casts to deal with some abort
   problems on Windows and perhaps other platforms as well. Kudos to
   Alexander Duyck.

*) One can now pass a value of 'x' to the global -f option to specify
   the units as transactions per second.  This is the default for any
   request/response test, which is determined by there being a "double
   `r'" in the name - eg "RR," "rr," "Rr," or "rR."  At present only
   the TCP_RR test actually looks for this to be set.

*) One can request bits/bytes per second as the primary output of a
   TCP_RR test by setting the global -f option to [kmgKMG] as with any
   of the "STREAM" tests.  This converts the primary throughput metric
   to a bitrate (byterate) following the verbosity rules for a STREAM
   test.  Service demand remains usec/Transaction regardless of the
   setting of the global -f option.

   A verbosity level of 2 or more will cause the TCP_RR test to report
   calculated average RTT latency, transaction rate, and inbound and
   outbound transfer rates regardless of the primary units selected
   with the global -f paramter.  If the primary output is transactions
   per second, the reported inbound and outbound transfer rates will
   be 10^6 bits per second, otherwise, they honor the setting of the
   global -f option.

   All of this is EXPERIMENTAL and subject to change without prior
   notice in future versions of netperf.

*) Replace "break" with "break 2" in acinclude.m4 for a socklen macro

*) The default for the requested socket buffer size is changed from 0
   to -1 to enable passing a value of 0 under Windows, which tells that
   stack one wishes to enable copy-avoidance.

*) Call fflush() on each interim result displayed in demo mode to make
   things happier for folks redirecting same to a file.  From Dan
   Yost.

*) In theory each distinct netserver child will have a debug log with
   its pid appended to the name, somewhat like what appears to happen
   under Windows.

*) A new global, command-line option to netperf and netserver has been
   added. The -V option will cause netperf/netserver to display its
   version and exit.

*) Setting -I without setting -i will now implicitly set the iteration
   minimum and maximums as if a -i 10,3 were set.  Also, some further
   sanity checking on the bounds for each is made.

*) Fixed a typo in the manual (found by Emir Halepovic) so the
   description for the -s and -S options properly specifies they
   affect the data connection.

These are the Release Notes for Revision 2.4.3 of netperf:

Things changed in this release:

*) The UDP_STREAM test includes --enable-demo support, courtesy of
   patches from Scott Weitzenkamp.

*) The nettest_dns.* files have been removed from the release and the
   repository.  Those wishing to perform DNS server tests should
   migrate to netperf4 which has better support for DNS test.

*) Fixes for compiling under Windows with Mingw/gcc courtesy of Gisle
   Vanem.

*) A new global option - -N - has been added. When specified, this
   option will tell netperf to not bother to try to establish a
   control connection with a remote netserver.  Instead, netperf will
   only attempt to make a data connection to the remote system.  By
   default, this will be to the "discard" service for a "STREAM" or
   "SENDFILE" test, the "echo" service for a "RR" test and the
   "chargen" service for a "MAERTS" test.  Any "remote" settings are
   changed to reflect their being unused in the test, and a "no
   control" tag is added to the test banner when -N is specified.

   This still needs to be propagated to other test files - at least
   for those for which it may make sense.

*) The tests in nettest_bsd.c have been altered to not actually take
   timestamps and deltas in --enable-histogram unless the verbosity
   level has been set to actually display a histogram.  This reduces
   the overhead measurably, even on systems with "fast" time calls,
   which _may_ mean that a future release of netperf may have
   histogram support enabled by default.

   This still needs to be propagated to other test files.  Patches
   from the community would be most welcome :)

*) Eliminate a bogus fprintf from the signal catching routine which
   was being executed when both intervals and demo mode were active at
   the same time.

*) The nettest_ipv6.* files are no longer included in the source
   tar/zip file. IPv6 functionality has been subsumed into the
   nettest_bsd.* files for some time now. 

*) Use a higher resolution "time" source for HISTOGRAM support under
   Windows, courtesy of Spencer Frink. Prior to this it had no better
   than 10ms granularity which could lead to some rather strange
   looking results :)

*) A bug fix reporting recv_size rather than send_size in TCP_MAERTS
   when CPU utilization was requested.

*) A bug fix for buffer filling from a file to properly advance the
   buffer pointer when the file is smaller than the send buffer.

*) Enable certain UDP tests which previously used unconnected sockets 
   to use connected sockets.  Courtesy of Shilpi Agarwal.

*) The OSX CPU utilization code actually gets put into the tarball in
   a make dist now :)

*) The check to make sure that getaddrinfo returned ai_protocol and/or
   ai_socktype's matching that which we requested is done for all socket
   and/or protocol types and a warning is emitted if it returns any which
   do not match.

*) The linux CPU affinity code has been made capable of binding to
   CPU's >=32 on a 32-bit compilation and >=64 on a 64-bit
   compilation.

*) More complete closing/redirecting of stdin/stdout/stderr/where in
   netserver to make it easier to launch netserver at the far-end of a
   remote shell.  Courtesy of Hans Blom.

*) Sendfile changes for Solaris courtesy of Andrew Gallatin.

*) "spec" file support to generate RPMs courtesy of Martin Brown

These are the Release Notes for Revision 2.4.2 of netperf:

Things changed in this release:

*) Fixes for floating point format differences, courtesy of George
   Davis.

*) Additions for CPU util support on MacOS X, courtesy of Anonymous.

*) Processor affinity is now supported on AIX 5.3 (perhaps earlier)
   via the bindprocessor system call.

*) Fixes for test lockups with TCP_CRR and TCP_CC under Windows
   courtesy of Dikon Reed.

*) Fixes to netcpu_looper.c to get it to actually compile :)

*) Have netcpu_looper use the bind_to_specific_processor() call
   provided by netlib since that knows about more platforms than the
   code in netcpu_looper did. The looper CPU binding will use a
   mapping to handle cases where the CPU id's on the system may not be
   a contiguous space starting from zero.  At present, the code that
   setups the mapping only knows about retrieving actual CPU ids under
   HP-UX.

*) The netcpu_sysctl method becomes calibration-free, courtesy of 
   Andrew Gallatin

These are the Release Notes for Revision 2.4.1 of netperf:

Things changed in this release:

*) There is now a -B global command-line argument that will append its
   parameter as a string to the end of result lines when test banners
   have been suppressed.  this is to make it easier to distinguish one
   result from another when aggregate restults are being run in
   parallel, without having to resort to having the individual results
   shell redirected to a file. This has been done for some of the
   tests in nettest_bsd.c, but not all of them, nor for the tests in
   the other nettest_mumble.c files.

*) There is now an --enable-spin configure option that will enable
   intervals if not already enabled and will have the sender sit and
   spin in a tight loop until time for the next interval rather than
   wait for an interval timer to expire.  This means it should be
   possible to have a much finer granularity on the interval, at the
   expense of an EXTREME increase in CPU utilization.  (To the extent
   I'm considering disabling measurement of local CPU utilization when
   that mode is enabled, and bursts have been requested - your
   feedback on that topic would be most appreciated) 

   If only --enable-intervals is used with configure, the old set the
   interval timer and wait method is still used.

   If --enable-spin is configured, the test banner will include "spin
   intervals" rather than the "intervals" from a plain
   --enable-intervals.  The sit and spin will either use
   gettimeofday(), or gethrtime() if gethrtime() is available.

   This has been implemented in the tests of nettest_bsd.c but none of
   the others.  Volunteers would be most welcome.  I would entertain
   the notion of making the implementation a series of inline
   functions in netlib. This holds true for the demo mode - why will
   become clear when you look at nettest_bsd.c.  While things are
   considerably cleaner than they were before, with reuse within
   nettest_bsd.c, there is no resuse with the rest of the
   nettest_mumble.c files.

*) the -w option for the interval time now takes three optional
   suffixes. if the suffix is 'm' (eg 10m) it will assume the user has
   specified time in units of milliseconds.  if the suffix is 'u' it
   will assume microseconds, and if 's' seconds. no suffix remains
   milliseconds for backwards compatability with previous netperf
   versions.

*) It should be possible to successfully compile with
   --enable-intervals.

These are the Release Notes for Revision 2.4.1 of netperf:

Things changed in this release:

*) netcpu_pstatnew.c has been altered to workaround a bug in the
   interrupt cycle accounting in HP-UX 11.23 that is not expected to
   be resolved until a later release.  basically, some interrupt time
   is not counted, which means the sum of idle, user, kernel and
   interrupt is less than the cycles per second multiplied by the
   elapsed time.  the workaround preserves the "no calibration
   required" nature of the pstatnew CPU utilization mechanism.  you
   can see more in netcpu_pstatnew.c and/or in debug output.

*) in netlib.c recv_response has been renamed
   recv_response_timed(addl_time) which is now used in
   calibrate_remote_cpu in place of the "sleep(40);recv_response()"
   sequence.  This then allows the REM_CPU test to complete in less
   than 40 seconds when the remote's CPU utilization mechanism does
   not require calibration.  The value of "addl_time" is added to the
   tc_sec field of the select() timeout.  A "new" recv_response has
   been added that simply calls recv_response_timed(0) - this is to
   minimize the number of changes needed elsewhere in the code.

*) hopefully, this release fixes problems people have been having with
   the configure script failing when picking a type for socklen_t.
   now, instead of generating an error, it emits a warning and simply
   tries socklen_t

*) the configure script no longer looks for the size of an in_port_t

*) netlib.c now has code to perform processor binding for Tru64, but
   the configure script may or may not detect it correctly. This means
   that one may have to edit the config.h file by hand to get the
   functionality.

*) it is known that netperf will compile under Windows XP and 2003
   using the DDK it is possible that netperf 2.4.1 will compile on a
   Windows system under VC++/Visual Studio.  It might even work!-) See
   the README.window file for additional details.

Things _NOT_ changed in this release:

*) The automagic determination of the number and type of parameters to
   sched_setaffinity under Linux remains brittle at best.

These are the Release Notes for Revision 2.4.0 of netperf:

Things changed in this release:

*) Netperf has been converted to use a configure script.  Yes boys and
   girls, after 12 years of distributing netperf with just a makefile
   I have finally bitten the bullet and cast my fate to autoconf,
   automake, etc.  To get the most basic netperf built all you should
   need to do is:

   cd to the netperf directory
   ./configure
   make
   and perhaps
   make install

   (Note, I've not done much with make install - I'm hemming and
   hawing over what the default installation location should be)

   Please keep in mind that this is the first time I've tried to use
   autoconf et al. I am sure there are things that should be done
   differently and would welcome any and all constructive criticisms.

   I suspect there are several places where I've not fully
   demonstrated being of the autoconf body - particulary as pertains
   to include files being in "#if mumble #endif" blocks.  Fixes would
   be most welcome.

*) Speaking of becomming one with various GNU tools, work on a new
   netperf manual has begun, with the source being a texinfo document
   that is converted to "all" the other formats.  This resides in doc/
   .

*) The platform-specific parts of CPU utilization measurement have
   been broken-out into separate .c files and selected at configure
   time a la the pcap_mumble files of tcpdump.  This makes
   src/netlib.c _much_ easier to read and the addition of new CPU
   utilization mechanisms much easier.

*) New HP-UX 11.23 and Solaris 10 CPU utilization measurement
   mechanisms (called pstatnew and kstat10 respectively) need no
   calibration step.  Both have variations on microstate accounting.
   HP-UX 11.23 still identifies the method in the headers as 'P' for
   pstat.  The kstat10 method is identified as 'M' for Microstate.

   Scripts which make calibration runs with LOC_CPU and REM_CPU may
   continue to do so, they will just run forty to eighty seconds
   faster on platforms with the calibration-free CPU util mechanisms.

*) Automatic detection of CPU utilization mechanism for HP-UX, Linux,
   AIX, *BSD and Solaris.  If you do not like what the configure
   script selects, you can use --enable-cpuutil=<foo> .

*) The "times" (aka 'T') CPU utilization mechanism has been removed.
   It was never very accurate at all, only showing CPU time charged to
   the process, and with interrupts and other network processing it is
   rarely chaged to a or the correct process.  It and other methods
   may remain in the format_cpu_method() routine of src/netlib.c for
   historical purposes only.

*) CAVEAT - the "kstat" mechanism is KNOWN TO BE BOGUS for Solaris.
   It does not include time spent processing interrupts, and
   networking benchmarks will generate at least a few of those...
   This affects _ALL_ versions of Solaris with kstat.

   So, do NOT trust any CPU util figures where netperf says the method
   was 'K' for kstat - unless perhaps it reports 100% CPU util.

   Solaris 10 takes a step in the right direction adding microstate
   accounting similar to what netperf uses on HP-UX 11.23.  HOWEVER,
   Solaris 10's accounting for user/kernel/idle is done in _parallel_
   with interrupt, which means they overlap. Doubleplusungood. Netperf
   attempts to compensate for that with some handwaving
   (src/netcpu_kstat10.c)

*) Initial support for SCTP has been added with the SCTP_STREAM and
   SCTP_RR tests.  These tests use the libsctp mechanisms for
   increased portability.  It has been explained that libsctp should
   not impart all that much overhead and it does make things rather
   simpler.

*) Netperf now uses getaddrinfo() to resolve hostnames and IP
   addresses. A replacement getaddrinfo() is provided for those
   platforms where the configure script cannot tell that getaddrinfo
   is present.   

   There are cases where a host's getaddrinfo call may return results
   that ignore the hints for protocol.  Netperf catches these and
   reports a warning so you can pester your OS source for fixes.

   Solaris getaddrinfo() seems to return results with SCTP procotol
   cleared.

   Mac OS X getaddrinfo botches when the service/port is specified as
   "0" so one must specify a port number on the netperf command line.

   AIX 5.something getaddrinfo has a different but similar problem
   with "0" as a port/service name as well.

   Linux 2.6 and HP-UX 11i getaddrinfo seem to be fine - at least as
   far as netperf goes :)

*) A "Demo Mode" has been added to the main BSD Sockets/TCP/UDP tests:
   TCP_STREAM, TCP_MAERTS, TCP_SENDFILE, TCP_RR, TCP_CC, TCP_CRR and
   UDP_RR. It has not been added to UDP_STREAM.  This mode is enabled
   with --enable-demo when configuring netperf, which activates a
   global "-D" option.  By default, -D will cause interim results
   (throughput or transactions/s only, not CPU util) from the
   netperf's perspective to be emitted no sooner than once per second.
   An optional parameter can specify another interval in units
   (floating point) of seconds:

      -D 1.5

   will make the reporting interval at least 1.5 seconds.

   This mode makes no use of explicit interval timers since that can
   be so, well fun on different platforms.  Instead, an initial guess
   of how many units of work must be done to consume the desired
   reporting interval is made, and that guess is refined throughout
   the entire test.  If something happens to dramatically slow-down
   the test, the reproting interval may become must larger for a few
   intervals.  When things speed-up it is detected very quickly.  As
   with the --enable-historgram support, if gethrtime() is available
   on the platform, it will be used in lieu of gettimeofday().  In any
   case, the number of calls to gettimeofday()/gethrtime() is much,
   Much, MUCH smaller than for --enable-histogram so while there may
   be a measurable effect on the results, it should be rather small.

*) The global -H option has been enhanced to take an optional address
   family specification for the control connection:

   -H <remote>,<family>

   Unlike other comma-separated options, where specifying only one
   thing will set both, here specifying only one thing will be
   ass-u-me-d to be the <remote> and will leave <family> defaulted
   (AF_UNSPEC).   Family can be specified as "4" or "inet" for
   AF_INET, "6" or "inet6" for AF_INET6.

*) A new global -L option has been added to specify the local name/IP
   and/or address family for the control connection:

   -L <local>,<family>

   Unlike other comma-separated options, where specifying only one
   thing will set both, here specifying only one thing will be
   ass-u-me-d to be the <local> and will leave <family> defaulted
   (AF_UNSPEC).  Family can be specified as "4" or "inet" for
   AF_INET, "6" or "inet6" for AF_INET6.

*) Test-specific -H and -L options are present for the TCP, UDP and
   SCTP tests, which are now (intended to be) IP protocol version
   agnostic.

*) Global -4 and -6 options will set the both the local and remote
   address family to either AF_INET or AF_INET6 respectively.

*) Test-specific -4 and -6 options have been added for TCP, UDP and
   SCTP tests.

*) Since the basic TCP UDP and SCTP tests are no longer IPv4-only, the
   nettest_ipv6.[ch] files are only included in the source
   distribution for historical interest.

*) The main test banners for the TCP, UDP and SCTP tests have been
   enhanced to give both local and remote addressing information for
   the data connection.

*) Compilation under Windows is likely FUBAR at this point.  I _hope_
   to start trying to do builds under the DDK soon, but am not sure
   when I'll be able to start.  Any and all assistance you can give
   there would be most welcome.

*) Various and sundry fixes.  TCP_RR should no longer go into an
   infinite loop when you abort netperf.  I'm sure there are others.

*) Unix domain socket tests are compiled-in with --enable-unix=yes at
   configure time.

*) DLPI tests are compiled-in with --enable-dlpi=yes at configure
   time.

*) XTI tests are compiled-in with --enable-xti=yes at configure time. 

Things not changed in this release:

*) Seems like everything has changed :)

These are the Release Notes for Revision 2.3pl2 of netperf:

Things changed in this release

*) One can bind netperf or netserver to specific CPUs with the -T
   option. This is a generalization of some HP-UX and netserver specific
   work from 2.3pl1.

*) Extend the kludge to workaround the Linux setsockopt/getsockopt
   bizzarreness to the socket buffer sizes for the remote side in
   addition to the local side.

*) Fix the lack of initialization of times_up in recv_tcp_maerts()
   that caused confidence intervals to fail miserably.

*) Other misc fixes - than you to all of you who sent them.

These are the Release Notes for revision 2.3pl1 of netperf:

Things changed in this release

*) The bind() call in create_data_socket() in the file nettest_bsd.c
   is no longer conditional on the user's specifying an IP address or
   port number to which the data socket should be bound.  This fixes
   the "connection refused" errors in the UDP tests.

*) Some experimental code to allow one to specify a CPU to which the
   remote netserver should be bound.  This is intended to allow one to
   get greater certainty (as in confidence intervals) on SMP
   systems. At present the functionality is HP-UX specific.
   Submittals of changes for a more general approach are welcomed.

These are the Release Notes for revision 2.3 of netperf:

Things changed in this release

*) The user can now specify local and/or remote port numbers for the
   data connection using the -P test-specific option.  This is to
   support those folks who want to run netperf through those evil,
   end-to-end-breaking things known as firewalls... :)  This changes
   the format of some of the control messages, hence the bump in the
   update number in the VUF. While it may be possible to mix 2.3 and
   pre-2.3 netperf and netserver, it is not supported.

*) The user can now specify local and/or remote IP addresses for the
   data connection using the -I test-specific option.  This is to
   support those folks who want to run netperf through those evil,
   end-to-end-breaking things known as firewalls... :) This changes
   the format of some of the control messages, hence the bump in the
   update number in the VUF. While it may be possible to mix 2.3 and
   pre-2.3 netperf and netserver, it is not supported.

*) Set DL_mumble  message priorities in the DLPI tests

*) Fix error return check for getaddrinfo()

*) Those systems with gethrtime() can define -DHAVE_GETHRTIME to use
   gethrtime() instead of gettimeofday() and reduce the measurement
   overhead when enabling the -DHISTOGRAM functionality.

*) The default for -DHISTOGRAM compilation now adds a UNIT_USEC and
   TEN_USEC row and renames TENTH_MSEC to HUNDRED_USEC.  If you want
   the old behaviour add -DOLD_HISTOGRAM to CFLAGS.

*) Add missing '!' in the recv_udp*_stream so we recognize the end of 
   a timed test correctly.

*) Replace "||" with "&&" to fix an infinite loop in
   recv_tcp_conn_rr() most likely introduced in 2.2pl5. 

*) Code has been added to kludge around the bug in Linux getsockopt()
   where it almost always returns twice the value for which one
   asks unlike virtually every other stack on the face of the
   planet. This was doing some unpleasant things to tests in which
   confidence intervals were requested. 

Things not changed in this release

*) Lots :)

These are the Release Notes for revision 2.2pl5 of netperf:

Things changed in this release

*) Improved (perhaps even usable :) support for Windows, including
compilation and run on Win64.

*) Fixes for MacOS X and FreeBSD

Things not changed in this release

*) Specifying the port number(s) for the data connection

These are the Release Notes for Revision 2.2pl4 of netperf:

Things changed in this release

*) USE_SYSCTL available on suitable FreeBSD releases to measure CPU
   utilization without having to resort to -DUSE_LOOPER.

*) Include Solaris 9 with the Linux sendfile path under -DHAVE_SENDFILE

This still outstanding in this release

*) Knowing why signals are not interrupting socket calls under
   OpenVMS.  A quick try to use threads for timing a la Win32 worked,
   but also cut performance in half.  Any and all assistance in this
   area would be most welcome.

These are the Release Notes for revisoin 2.2pl3 of netperf:

Things changed in this release

*) I started practicing what I preach and will set SO_REUSEADDR before
   netserver tries to bind to its well-known port.

*) Initial port to OpenVMS.  This includes support for the OVMS
   Auxilliary server (inetd replacement).  See README.ovms for more
   details on what is involved in compiling and running netperf under
   OpenVMS.

*) Testname comparisons are now case insensitive.  This is a side
   effect of OpenVMS downshifting commandlines to lowercase.  I made
   the change and decided it was OK to keep it that way, even though
   for OpenVMS one _has_ to set the right defines to disable that
   downshifting or the command-line options will not work. For example
   "-H" will become "-h" which isn't quite the same thing...

*) Misc fixes for nettest_ipv6.c.

*) Support for sendfile() under Linux

Thins I would like to have changed but did not know how or didn't have
time:

*) Allow netserver to run as a standalone daemon under OpenVMS
*) Allow netserver to run as a standalone daemon under Windows
*) Rediscover an inetd-like facility for Windows
*) Figure-out how to get low-overhead, accurate, per-CPU utilization
   figures under OpenVMS
*) Get the UDP_RR and UDP_STREAM tests to work under OpenVMS, and get
   the TCP_RR test to work based on time rather than transaction
   count.  There is some bug (possibly in OpenVMS?) where the SIGALRM
   fires, but a socket call will not return an EINTR.

Things that changed prior to this release:

*) Addition of the TCP_MAERTS test - this is a TCP_STREAM test where
   the data flows from the netserver to the netperf rather than from
   the netperf to the netserver.  This can be useful in those
   situations where netperf (netserver) is installed on a remote
   system, but the tester has no shell access and wishes to get
   performance data for the path from netserver to netperf.

These are the Release Notes for the 2.2 revision of netperf:

Things changed in this release

*) Various and sundry bugs fixed (in theory) for platforms such as
   FreeBSD and Linux. If I left-out your bug fix, it was purely
   accidental - my mind has a very small cache, and sometimes I will
   "lose" email in the shuffle.

*) Initial support for sendfile() on HP-UX. This test will use the
   sendfile() call instead of send() to send data to the
   remote. Netperf "lies" to netserver and calls it a TCP_STREAM test
   since what netserver needs to do is exactly the same. A future
   patch may change that and simply have netserver call the same
   routine for both test types. Kudos to Charles Harris for the
   initial prototype.

*) The Fore ATM API and HiPPI tests have been dropped from the
   distribution. 

Things I would have liked to have changed, but did not have time for:

*) Conversion of the source and makefile to use the GNU configure/autoconf 
   utility to make it easier for folks to build by not having to edit
   makefiles... You will notice that I have started to switch from
   "DO_MUMBLE" to "HAVE_MUMBLE"

as always - happy benchmarking,

rick jones <raj@cup.hp.com>

---------------------------------------------------------------------

These are the Release Notes for the 2.1pl3 revision of netperf:

*) An OBOB (Off By One Bug) in netlib.c that was causing a core dump
   on Irix should be fixed.

*) Irix systems should now be able to determine the number of CPU's
   present automagically (code from outside, not tested yet because I
   have no MP Irix systems at my disposal)

*) An alpha version of a TCP_CC test has been added - this is a
   TCP_CRR test with out the "RR."

*) The -Ae has been removed from the default makefile. If someone has
   a nice way to automagically generate the correct makefile for
   different platforms I would like to learn how.

happy benchmarking,

rick jones <raj@cup.hp.com>

----------------------------------------------------------------------

These are the Release Notes for the 2.1 revision of netperf:

Things Changed in this release:

*) The XTI (Version 2 of the spec) tests are now documented in the
   manual. 

*) The TCP_CRR (Connect Request/Response) test is now documented in
   the manual, including a description of how it mimics the behaviour
   of http (the protocol underlying the WWW).

*) Support for for Windows NT 3.51 OS in the BSD Sockets tests (ok, so
   they are really Winsock in that case :). Other test suites may be
   ported as required/desired/appropriate. 

*) Tests for TCP and UDP, using the IPv6 extensions to BSD sockets are
   included in this release. They are included by adding -DUSE_IPv6 to
   the makefile and recompiling.

*) Support for a "long long" datatype should only be required for
   -DUSE_PSTAT compilation which is an HP-UX only thing. The
   *unbundled* HP compilers from at least "HP92453-01 A.09.61 HP C
   Compiler" and later should have the required support. The bundled
   compiler may not. GCC should work - check the archives listed in
   the comp.sys.hp.hpux FAQ for copies. The FAQ is archived on
   rtfm.mit.edu under the path pub/usenet/comp.sys.hp.hpux.

*) A "proper" fix for double data type alignment has been included.

*) A new script is included with this release which can be used to
   measure aggregate TCP_RR performance (multiple, concurrent
   instances of the TCP_RR test). A related use of this script would
   be measuring MP scaling. A single-byte TCP_RR test is good for this
   purpose for two reasons:

      1) it excercises the control/protocol paths heavily without
         using much in the way of data copies which may be easier to
         scale.
      2) most systems can easily saturate cards with bandwidth, but
         not so easily with request/response

   Of course, feedback on this is most welcome.

*) When measuring CPU utilization, the units for service demand have
   been changed from milliseconds (designated ms) of CPU per unit (KB
   or Transaction) to microseconds (desginated us).

*) For accurate reporting of service demand, netperf needs to know the
   number of CPU's present on a system. On some systems (HP-UX), this
   is automatic. For others (All), it is necessary to add a global "-n
   <numcpu>" option to both netperf and netserver.

   !! IF THIS IS LEFT-OUT CPU UTILIZATION AND SERVICE DEMAND FOR !!
	     !! MULTI-PROCESSOR SYSTEMS WILL BE WRONG. !!

   If you know of ways to programatically determine the number of
   active CPUs on a system, please let the author Rick Jones
   <raj@cup.hp.com> know.

*) other things I've probably forgotten :)

Things Not Changed in this release:

*) The ancillary test suites are essentially unchanged - DLPI,
   HiPPI/LLA, Unix Domain, and Fore ATM API. Unless there is much
   interest expressed in these tests, 2.1 may be the last release in
   which they are included. The order of retirement would likely be
   Unix Domain, HiPPI/LLA, Fore ATM API, and then DLPI.

Miscelaneous Comments:

*) The -DUSE_LOOPER CPU utilization _seems_ to be nice and low-impact
   on HP-UX, Digital Unix, and IRIX. It does not yet seem to be
   low-impact on Solaris (I need an example of priocntl usage), AIX
   (setpri only works if you are root), and NT (not sure of the
   reason). Help with those problems would be most appreciated.
