These are the Release Notes leading-up to 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.
