This file is here for people to list their contributions to the
netperf benchmark. When you enhance or fix something, put your name
and a description of the what/where/whey/why/how here. If you like,
feel free to include an email address. 

I would like to apologize in advance to anyone I've forgotten to
include.

Rick Jones <raj@cup.hp.com>
Responsible for initial packaging and release of netperf and
"editorial" continuity for subsequent releases. 

Karen Choy
Code to allow netserver to run as a standalone daemon. 

Dave Shield <daves@csc.liv.ac.uk>
Wrote the first revision of the netperf and netserver manpages.

Sarr Blumson <sarr@citi.umich.edu>
Fixes for AIX 3.1 and 3.2. Also fixes for Solaris 2.1 without
realizing it ;-) 

Jeff Smits <jgs@usl.com>
Fixes for TCP_RR and UDP_RR on sytems with an htonl that is not a no-op.

Warren Burnett <somewhere in Kansas>
Example code for DLPI tests.

Several Folks
Code to tell SunOS 4 to *not* restart system calls on receipt of a
signal. 

Fore Systems Inc.
Manpages for the FORE API and question answering

David Channin
Access to systems running the Fore ATM API

Jonathan Stone <jonathan@DSG.Stanford.EDU>
Include file fixes for Ultrix

Bruce Barnett <barnett@grymoire.crd.ge.com>
Bunches of warnings fixes and lint picks for Solaris 2.3

Herman Dierks et al <dierks@austin.ibm.com>
Code to calculate confidence intervals for tests

Hal Murray <murray@pa.dec.com>
Helpful suggestions for the scripts to make them more compatible with
the netperf database (http://www.cup.hp.com/netperf/NetperfPage.html).
His prompting finally got me off my whatever to put the confidence
interval stuff from the guys at IBM into netperf

Peter Skopp pds@cs.columbia.edu
Fixes to make netperf more secure.	

Tom Wilson <tcwilson@newbridge.com>
A fix to send_udp_rr to correct bogus throughput values.

Thorsten Lockert <tholo@tetherless.com>
A bunch of clean-up for the *BSD OSes

Serge Pachkovsky <ps@ocisgi7.unizh.ch>
Code for low-priority soaker process for AIX and SGI

The fine folks at Adaptec
The initial port of netperf (1.9PL4) to Windows NT 3.51.

Robin Callender <robin_callender@VNET.IBM.COM>
The PPC binaries for the 1.9PL4 port of netperf to NT and for assorted
code clean-ups and help with CPU utilization measurements.

"Todd J. Derr" <tjd@fore.com>
For offering to take-on support of the Fore ATM API files with 2.1 and
for his help in making the tar files and such more user-friendly

Michael Shuldman <michaels@inet.no>
Improvements to the makefile and additional checks for OpenBSD

Kris Corwin
discovery of a debug statement outside of if (debug) that may have
been the cause of all the nasty connection refused errors in random
UDP_RR tests... 

Charles Harris
Initial prototype of the TCP_SENDFILE test support

Philip Pishioneri of Cornel
Conversion of the netperf.ps manul to PDF format.

The Hewlett-Packard OpenVMS folks
Assistance with the port to OpenVMS

Munechika SUMIKAWA @ KAME Project / FreeBSD.org
IPv6 fixes

Jan Iven of CERN
initial mods for sendfile() under Linux

Fabrice Bacchella
for pointing-out that Solaris 9 has a copy of Linux sendfile()

Andrew Gallatin 
for assistance with the FreeBSD sysctl() stuff, and later making it
calibration-free
fixes to configure to recognize Solaris 11
fixes to netcpu_procstat.c for later linux kernels

Mark Cooper
pointing-out the need for -lresolv when compiling -DDO_DNS on RedHat
7.1

Carl Mascott 
finding some cut-and-paste erors in create_data_socket error logging

Fabrice Bacchella
Fixes for -DHISTOGRAM and -DUNIX on Mac OS X, updates to usage strings

Spencer Frink
Fixes and Cleanup for WIN32.  Many over many years.

Nicholas Thomas
Fixes for DLPI on SVR4 Streams under Linux

Dave Craig
Fixes for getaddrinfo error returns

David Mosberger of HP
Workaround for the Linux getsockopt() bug that returns more than that
for which one asked.

Stephen Burger of HP
Code to implement the netserver CPU binding.

Vladislav "Vlad" Yasevich of HP
Initial SCTP tests.  Enhancements to the configure.ac sources to show
the way to make many of the LIBS="foo" before ./configure unnecessary.

Padmanabhan "Paddu" S N of HP
Patches for /proc/stat CPU util and recv_tcp_rr.

Cary Coutant and other hp-mac-users of HP
Access to Mac OS X systems for porting netperf 2.4.0

Chris Bertin of HP
Access to AIX for initial porting of netperf 2.4.0

James Carlson
Assistance finding the right magic to compile SCTP on Solaris 10.

Gavin 
Pointers on Solaris 10 Microstate accounting.

Brent Draney
Getting netcpu_perfstat.c in running order on AIX and other misc
fixups in places such as BSD.

Samuel Ying
Change struct sockaddr to struct sockaddr storage in netserver.c

Rodolpho Boer
Fix for default message size in UDP_STREAM when defualt SO_SNDBUF size
is > max UDP datagram size.

Michael Dorff
Getting netperf/netserver to compile under Windows with MS Visual
Studio 2003

George Davis
Changes to deal with different floating-point formats.

Anonymous
Changes to retrieve CPU util on MacOS X.

Dickon Reed
Patches to attend to some windows in TCP_CRR and TCP_CC under Windows

Bret McKee <bret@hp.com>
Fixes to get netcpu_looper compiling and working after the "netcpu"
split

Hans Blom
Improvements to closing/redirecting stdin/stdout/stderr in netserver

Martin Brown
RPM support in the form of netperf.spec.in and related configure.ac
etc changes

Shilpi Agarwal
Changes to allow UDP_STREAM to use connected sockets on both sides.

Steve Reinhardt <stever@eecs.umich.edu>
Fixes for buffer filling.

Gisle Vanem
Fixes for Windows compilation under MingW/gcc.

Scott Weitzenkamp
Patches to enable demo mode in the UDP_STREAM test

Emir Halepovic
Feedback on the manual

Kouhei Sutou
Generate netperf_version.h and netperf.spec via configure rather than
makefile, include limits to get PathMAX on FreeBSD.

Dan Yost
Fix to fflush() each interim result in demo mode to make things
happier for folks redirecting same to a file.

Alexander Duyck
Fixes to replace struct sockaddr_in with struct sockaddr_storage
Fixes to UDP_RR to preclude hangs on Windows
Fizes to UDP_RR to honour -f and -B options

Anonymous
Support for sendfile() on OSX

Matt Waddel
Fix to use vfork() instead of fork() on platforms without fork()

Simon Burge <simonb@NetBSD.org>
Fixes for *BSD CPU util.

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

Gisle Vanem
MingW cnd MSDOS (djgpp) leanups.

Marcel Shuldman
Changes to make netperf more profiling friendly
