changeset 2138:b0b9630950c9

Add net/autotest
author msalter
date Wed, 22 Feb 2006 14:57:18 +0000
parents 314da12fc072
children 51b8914f22a7
files packages/net/autotest/current/ChangeLog packages/net/autotest/current/cdl/net_autotest.cdl packages/net/autotest/current/doc/host.txt packages/net/autotest/current/doc/strategy.txt packages/net/autotest/current/host/_suping.c packages/net/autotest/current/host/awaitorder.c packages/net/autotest/current/host/floodping.sh packages/net/autotest/current/host/makefile packages/net/autotest/current/host/obey.sh packages/net/autotest/current/host/sendack.sh packages/net/autotest/current/host/slowping.sh packages/net/autotest/current/host/snmpwalk.sh packages/net/autotest/current/host/tftpget.sh packages/net/autotest/current/host/tftpput.sh packages/net/autotest/current/host/tmpfile.c packages/net/autotest/current/permtests/netauto_bootp.ptest packages/net/autotest/current/permtests/netauto_corrupt.ptest packages/net/autotest/current/permtests/netauto_failrx.ptest packages/net/autotest/current/permtests/netauto_failtx.ptest packages/net/autotest/current/permtests/netauto_rt.ptest packages/net/autotest/current/permtests/netauto_snmp.ptest packages/net/autotest/current/permtests/netauto_std.ptest packages/net/autotest/current/tests/autohost.inl packages/net/autotest/current/tests/floodping.c packages/net/autotest/current/tests/floodpingmux.c packages/net/autotest/current/tests/memcheck.inl packages/net/autotest/current/tests/route_3.c packages/net/autotest/current/tests/route_3_4.c packages/net/autotest/current/tests/route_4.c packages/net/autotest/current/tests/route_none.c packages/net/autotest/current/tests/routeping.inl packages/net/autotest/current/tests/slowping.c packages/net/autotest/current/tests/slowpingmux.c packages/net/autotest/current/tests/snmpmulti.c packages/net/autotest/current/tests/snmppings.c packages/net/autotest/current/tests/snmpwalk.c packages/net/autotest/current/tests/tftp_serv.inl packages/net/autotest/current/tests/tftp_serv_g0.c packages/net/autotest/current/tests/tftp_serv_g1M.c packages/net/autotest/current/tests/tftp_serv_g512.c packages/net/autotest/current/tests/tftp_serv_get.c packages/net/autotest/current/tests/tftp_serv_p0.c packages/net/autotest/current/tests/tftp_serv_p1M.c packages/net/autotest/current/tests/tftp_serv_p512.c packages/net/autotest/current/tests/tftp_serv_put.c
diffstat 45 files changed, 6166 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/ChangeLog
@@ -0,0 +1,301 @@
+2002-02-01  Gary Thomas  <gthomas@redhat.com>
+
+	* tests/slowpingmux.c (ping_test): 
+	* tests/routeping.inl: (ping_test): 
+	* tests/floodpingmux.c: (net_test): 
+	* tests/autohost.inl (autohost_tell): 
+	* host/awaitorder.c (main): Need valid value for sin_len.
+
+2001-10-10  Hugo Tyson  <hmt@redhat.com>
+
+	* tests/floodping.c:
+	* tests/floodpingmux.c:
+	* tests/snmpmulti.c:
+	* tests/snmppings.c:
+	* tests/snmpwalk.c:
+	More conditional compilation needed for use of eth0_up, eth1_up
+	and the like, since the config opt is now a boolean and so these
+	might not exist.
+
+2001-06-26  Hugo Tyson  <hmt@redhat.com>
+
+	* tests/routeping.inl (route_add_s): Add a close to the socket.
+	Don't be upset if you can't ping www.cygnus.com by number!
+
+2000-12-08  Hugo Tyson  <hmt@redhat.com>
+
+	* host/tftpget.sh (TARGET): Try a little harder to put a correct
+	test dataset into the target; we are testing GET not PUT here.  We
+	are seeing get fails of 1Mb data on the zeroth try; it could be a
+	real get bug, or problems putting the original image.  This change
+	should help diagnose which.
+
+	* tests/slowpingmux.c (ping_host): Make this much less verbose in
+	[good] output; the farm rejects too much chatter.
+
+2000-11-17  Hugo Tyson  <hmt@redhat.com>
+
+	* tests/memcheck.inl (memcheck_final): Ignore clusters if
+	simulating network failures; I guess memory is used up with
+	partial packets awaiting reassembly, and they'll time out.
+
+	* tests/routeping.inl (net_test): Call TNR_ON/OFF() correctly.
+
+	* tests/slowpingmux.c (net_test): Call TNR_ON/OFF() correctly.
+
+	* tests/floodpingmux.c (net_test): Only call TNR_INIT() once.
+	Call TNR_OFF(); again after dumpstats() turned it on again.
+	Call TNR_ON/OFF() correctly.
+
+	* tests/autohost.inl (autohost_getresults): Add a missing
+	semicolon.  Doh!  Only a problem with realtime test harness
+	enabled.
+
+2000-11-15  Hugo Tyson  <hmt@redhat.com>
+
+	* doc/host.txt: Updated.
+
+2000-11-15  Hugo Tyson  <hmt@redhat.com>
+
+	* cdl/net_autotest.cdl: Build the new tests.
+
+	* tests/routeping.inl: New file: the meat of a testcase to check
+	that external networks are only accessible if we have added a
+	suitable route.  This requires a further network called 10.0.3.x
+	attached to the machine that serves DHCP to eth0, and one called
+	10.0.4.x on the server for eth1.  These can both be aliases for
+	loopback on the linux host if needs be.
+
+	* tests/route_none.c:
+	* tests/route_3.c: 
+	* tests/route_4.c: 
+	* tests/route_3_4.c: 
+	New files: Various invocations of the above.  These just make a
+	few #defines then #include "routeping.inl"
+	
+2000-11-10  Hugo Tyson  <hmt@redhat.com>
+
+	* tests/autohost.inl (autohost_init): Call the memory checking
+	init and finalization functions in the appropriate places.
+
+	* tests/memcheck.inl (RATIO): New file; check for mbuf &c leaks
+	(if the API is defined in network.h, so it it'll work with the 144
+	tarball).  We allow either as much again or 15% of memory to be
+	used at the end of the test, for each of the 3 memory regions the
+	stack uses.
+
+	* tests/floodpingmux.c (net_test): Don't print out mbuf &c usage,
+	leave it up to the memory checking subsystem.
+
+2000-11-10  Hugo Tyson  <hmt@redhat.com>
+
+	* host/obey.sh: Handle the new case of doing snmpwalk and
+	snmpstatus to the target. (SNMP_WALK)
+
+	* cdl/net_autotest.cdl: Build the new tests.
+
+	* host/snmpwalk.sh: New file: snmpwalk the target's public MIB and
+	check target status for the timeout.  Much like the other cases.
+
+	* tests/snmpwalk.c: New file: do one snmpwalk session on each
+	interface.
+
+	* tests/snmpmulti.c: New file: ditto, 3 sessions per i/f.
+
+	* tests/snmppings.c: New file: ditto, 2 x snmp, plus some pinging
+	and flood pinging simulataneously.
+
+2000-11-09  Hugo Tyson  <hmt@redhat.com>
+
+	* host/obey.sh: Handle the new case of flood pinging the
+	target. (FLOOD_PING)
+
+	* host/floodping.sh: New file: flood ping the target, with a
+	variable active/sleep ratio so that we can use this to perturb
+	other tests also.  An suid executable "./_suping" is needed to be
+	able to flood ping automatically.
+
+	* cdl/net_autotest.cdl: Build the two new tests.
+
+	* tests/floodping.c: New file: ask the host to flood ping me, for
+	5 minutes in the usual manner.
+
+	* tests/floodpingmux.c: New file: as floodping.c and the target
+	floods the host in turn also.
+
+	* host/makefile: Build _suping: it must be set uid &c manually.
+
+	* host/_suping.c: New file: a tiny su root program to run ping
+	with real uid root (ping is suid root anyway) to allow us to flood
+	the target.
+
+2000-11-08  Hugo Tyson  <hmt@redhat.com>
+
+	* tests/autohost.inl (XFAIL): Detect the configuration that means
+	simulated unreliable network is enabled.  Send the XFAIL parameter
+	to the network testing server if so.  Also do not check for the
+	count of pass messages required in the autohost_end() routine; we
+	expect them to go missing and/or there to be failures per se.
+
+	* host/obey.sh (XFAIL): Detect and pass through the XFAIL
+	parameter to indicate simulated unreliable network is enabled.
+
+	* host/tftpget.sh (XFAIL): 
+	* host/tftpput.sh (XFAIL): 
+	* host/slowping.sh (XFAIL): If XFAIL, do not report failures as
+	such; also echo the process ID ($$) in messages to help untangle
+	the interleaved status messages.
+
+	* host/sendack.sh (XFAIL): Try less zealously and moan less loudly
+	if failure is expected.
+
+	* doc/host.txt: Document XFAIL stuff.
+
+2000-10-26  Hugo Tyson  <hmt@redhat.com>
+
+	* tests/slowping.c (net_test): New file: 
+	* tests/slowpingmux.c (net_test): New file: simple test, the host
+	pings the target (a lot, 10x simultaneously), while the target
+	also pings the host in slowpingmux.
+
+	* host/slowping.sh (TARGET): New file: handle target side of ping
+	testing.
+
+	* cdl/net_autotest.cdl: Build the new tests.
+
+2000-10-26  Hugo Tyson  <hmt@redhat.com>
+
+	* tests/tftp_serv.inl (do_tftp_tests): Fix typo in info printf;
+	nothing of substance.
+
+2000-10-25  Hugo Tyson  <hmt@redhat.com>
+
+	* permtests/netauto_bootp.ptest: net with bootp only init.
+	* permtests/netauto_corrupt.ptest: net + 10% rx corruption.
+	* permtests/netauto_failrx.ptest: net + 10% rx discards.
+	* permtests/netauto_failtx.ptest: net + 10% tx discards.
+	* permtests/netauto_rt.ptest: net + snmp + realtime test.
+	* permtests/netauto_snmp.ptest: net + snmp.
+	* permtests/netauto_std.ptest: standard net config
+	New files; permtest configurations for farm testing.
+
+2000-10-24  Hugo Tyson  <hmt@redhat.com>
+
+	* doc/host.txt: More info added; kept up to date.
+
+2000-10-24  Hugo Tyson  <hmt@redhat.com>
+
+	* tests/tftp_serv.inl: New file, the guts of both tftp_serv_get.c
+	and tftp_serv_put.c removed to here, so that a number of tests can
+	be created to hit the server with different sizes of datafile.
+	This is the easiest way to test lots of different filesizes and
+	edge conditions; just replicate the testcase.
+
+	* tests/tftp_serv_put.c (FILESIZE): 
+	* tests/tftp_serv_get.c (FILESIZE): Use "tftp_serv.inl" with a
+	coupla #defines for the op and the filesize to implement the test.
+
+	* tests/tftp_serv_g0.c:   New: get zero and 1-byte datafiles.
+	* tests/tftp_serv_g1M.c:  New: get 1Mb and 1Mb-1 datafiles.
+	* tests/tftp_serv_g512.c: New: get 512 and 513-byte datafiles.
+	* tests/tftp_serv_p0.c:   New: put zero and 1-byte datafiles.
+	* tests/tftp_serv_p1M.c:  New: put 1Mb and 1Mb-1 datafiles.
+	* tests/tftp_serv_p512.c: New: put 512 and 513-byte datafiles.
+
+	* cdl/net_autotest.cdl: Build all the new testcases to diddle
+	different file sizes.
+
+	* host/tftpput.sh (TARGET): Do not read back the file every time;
+	check the gotton file once at the end correctly; count up the
+	transfers for info.
+
+	* host/tftpget.sh (TARGET): Check the gotton file correctly; count
+	up the transfers for info.
+
+2000-10-23  Hugo Tyson  <hmt@redhat.com>
+
+	* host/tftpdata.src: DELETED: we now make our own data files on
+	the fly.
+
+	* host/makefile (tmpfile): Build this.  Also add a make clean.
+
+	* host/tmpfile.c (main): New file: builds to a simple executable
+	that makes a scratch file full of random data of the length
+	requested.  A simple but order-sensitive checksum is appended,
+	though the testcase doesn't use this yet.
+
+	* tests/tftp_serv_put.c (do_tftp_tests): 
+	* tests/tftp_serv_get.c (do_tftp_tests): Pass a filesize to the
+	test script; it will make a temp file accordingly.
+
+	* host/tftpput.sh: 
+	* host/tftpget.sh: Parameterize these more so that they accept a
+	filesize; the data file is created with random data.
+
+2000-10-20  Hugo Tyson  <hmt@redhat.com>
+
+	* doc/host.txt: New file.  Details the host side code, scripts,
+	environment, tempfiles, conventions, output...
+
+	* doc/strategy.txt: New file.  The original design notes.
+	
+	* host/obey.sh: Correct typo and add . to the path; stupid
+	pedantic environment.
+
+2000-10-20  Hugo Tyson  <hmt@redhat.com>
+
+	* tests/tftp_serv_get.c (net_test): 
+	* tests/tftp_serv_put.c (net_test): Use the new API, and remember
+	how many host sessions we expected to invoke.
+
+	* tests/autohost.inl (autohost_end): New API to check counts of
+	PASS and FAIL statii from the hosts.
+
+2000-10-19  Hugo Tyson  <hmt@redhat.com>
+
+	* Changelog: New file.
+	* cdl/net_autotest.cdl: New file.
+	* host/awaitorder.c: New file.
+	* host/makefile: New file.
+	* host/obey.sh: New file.
+	* host/sendack.sh: New file.
+	* host/tftpdata.src: New file.
+	* host/tftpget.sh: New file.
+	* host/tftpput.sh: New file.
+	* tests/autohost.inl: New file.
+	* tests/tftp_serv_get.c: New file.
+	* tests/tftp_serv_put.c: New file.
+	Indeed a new package, even.  Documentation will be forthcoming.
+
+//===========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//===========================================================================
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/cdl/net_autotest.cdl
@@ -0,0 +1,122 @@
+# ====================================================================
+#
+#      net_autotest.cdl
+#
+#      Networking autotest subsystem configuration data
+#
+# ====================================================================
+#####ECOSGPLCOPYRIGHTBEGIN####
+## -------------------------------------------
+## This file is part of eCos, the Embedded Configurable Operating System.
+## Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+##
+## eCos is free software; you can redistribute it and/or modify it under
+## the terms of the GNU General Public License as published by the Free
+## Software Foundation; either version 2 or (at your option) any later version.
+##
+## eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+## WARRANTY; without even the implied warranty of MERCHANTABILITY or
+## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+## for more details.
+##
+## You should have received a copy of the GNU General Public License along
+## with eCos; if not, write to the Free Software Foundation, Inc.,
+## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+##
+## As a special exception, if other files instantiate templates or use macros
+## or inline functions from this file, or you compile this file and link it
+## with other works to produce a work based on this file, this file does not
+## by itself cause the resulting work to be covered by the GNU General Public
+## License. However the source code for this file must still be made available
+## in accordance with section (3) of the GNU General Public License.
+##
+## This exception does not invalidate any other reasons why a work based on
+## this file might be covered by the GNU General Public License.
+##
+## -------------------------------------------
+#####ECOSGPLCOPYRIGHTEND####
+# ====================================================================
+######DESCRIPTIONBEGIN####
+#
+# Author(s):      hmt
+# Original data:  hmt
+# Contributors:
+# Date:           2000-10-19
+#
+#####DESCRIPTIONEND####
+#
+# ====================================================================
+
+cdl_package CYGPKG_NET_AUTOTEST {
+    display       "Networking autotest"
+    doc           doc/index.html
+    include_dir   net/autotest
+    requires      CYGPKG_IO
+    requires      CYGPKG_ISOINFRA
+    requires      CYGPKG_LIBC_TIME
+    requires      CYGPKG_ERROR
+    requires      CYGPKG_MEMALLOC
+    requires      CYGPKG_NET
+    description   "Networking autotest facilities"
+
+#    compile *NONE*
+
+    cdl_option CYGPKG_NET_AUTOTEST_TESTS {
+	display "Networking tests"
+	flavor  data
+	no_define
+	calculated { "\
+		tests/floodping.c \
+		tests/floodpingmux.c \
+		tests/route_3.c \
+		tests/route_3_4.c \
+		tests/route_4.c \
+		tests/route_none.c \
+		tests/slowping.c \
+		tests/slowpingmux.c \
+		tests/snmpwalk.c \
+		tests/snmpmulti.c \
+		tests/snmppings.c \
+		tests/tftp_serv_get.c \
+		tests/tftp_serv_put.c \
+		tests/tftp_serv_g0.c \
+		tests/tftp_serv_p0.c \
+		tests/tftp_serv_g512.c \
+		tests/tftp_serv_p512.c \
+		tests/tftp_serv_g1M.c \
+		tests/tftp_serv_p1M.c"
+        }
+	description   "
+	This option specifies the set of tests
+	for the networking package."
+    }
+	
+    cdl_component CYGPKG_NET_AUTOTEST_OPTIONS {
+        display "Networking support build options"
+        flavor  none
+	no_define
+
+        cdl_option CYGPKG_NET_AUTOTEST_CFLAGS_ADD {
+            display "Additional compiler flags"
+            flavor  data
+            no_define
+            default_value { "-D_KERNEL -D__ECOS" }
+            description   "
+                This option modifies the set of compiler flags for
+                building the autotest package.
+	        These flags are used in addition
+                to the set of global flags."
+        }
+
+        cdl_option CYGPKG_NET_AUTOTEST_CFLAGS_REMOVE {
+            display "Suppressed compiler flags"
+            flavor  data
+            no_define
+            default_value { "" }
+            description   "
+                This option modifies the set of compiler flags for
+                building the autotest package. These flags are removed from
+                the set of global flags if present."
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/doc/host.txt
@@ -0,0 +1,414 @@
+
+Host Software for Automated Network Testing for eCos
+====================================================
+
+Hugo Tyson, Red Hat, Cambridge UK, 2000-10-20
+
+
+What Host Software?
+-------------------
+
+This note refers to the package CYGPKG_NET_AUTOTEST which lives in
+packages/net/autotest in the eCos repository.
+
+It contains, amongst other things, some software to run a "network testing
+server" which eCos network test cases (from the same package) use to test
+the network stack.
+
+The reason such a server is needed is simple: testing the eCos network
+stack involves an external, standard, computer _doing_things_to_ the target
+board as well as having the target board's test program do things itself.
+
+For example, one test case (in the main network package, net/tcpip) to test
+TFTP will get a file from a server using TFTP and put the data to another
+file on the server using TFTP.  This tests the ability of the eCos TCPIP
+stack to act as a TFTP client.  But it does not test the eCos TCPIP stack's
+TFTP server at all.  To do that an external agent must act as client -
+using the standard tftp(1) app on linux, for example - to put and get data
+to and from an eCos testcase running on the target, offering a TFTP server.
+
+
+Quick Start Guide
+-----------------
+
+Set up your LINUX machine to serve DHCP to the target you want to test;
+ensure that any 10.0.0.x addresses used are given a class C (/24) netmask.
+Provide a genuine gateway to the internet via some route; the routing tests
+expect to ping www.cygnus.com!  Also let it have the normal networking apps
+(tftp, ftp, ping) and servers (tftpd, ftpd) available, plus the SNMP
+package from UCD: snmpwalk and snmpstatus and standard MIBs.
+
+Make sure it is on on the same network(s) as the target you want to test.
+
+Set up aliases for loopback interface on the servers: on server for eth0 on
+the target, add an alias for 10.0.3.1/24.  For eth1, 10.0.4.1/24.
+
+With a checked-out eCos source tree, change directory into either
+packages/net/autotest/current/host or a copy of it, and type make.
+
+Follow the printed instruction to change the simple executable "./_suping"
+to su root execution.  You will need to become root temporarily to do this.
+
+Make sure . is on your path and type "awaitorder | obey.sh" to run the
+server; it prints info about messages it receives and sends.
+
+The test server is now running.  You can now run test built from the
+CYGPKG_NET_AUTOTEST package (packages/net/autotest) on your target and they
+will talk to this host test server.
+
+
+Categories of Tests
+-------------------
+
+ o Host passive
+
+	The host is server, the eCos test case is the proactive client.
+
+	Such tests use the host to talk to, where the eCos testcase is the
+	client, and the host is the server.  The network testing server is
+	not involved in these tests, but other servers which must be set up
+	there are used.
+ 
+ o Host proactive
+
+	The host is client to the eCos server.
+
+	The target board running eCos is the server, the host must run
+	scripts to do thing to it and report success or otherwise over the
+	net.  The eCos test case typically starts a server, issues order
+	about how to test it, then sleeps for a time until the test is
+	deemed complete.
+
+
+Building the Network Testing Server
+-----------------------------------
+
+Cd into either packages/net/autotest/current/host or a copy of it, and type
+make.  The standard makefile just compiles ./awaitorder.c into ./awaitorder
+the executable that waits for a request from a testcase and prints it to
+its stdout.  It also builds some other utilities that are used by the test
+scripts, for example ./tmpfile from ./tmpfile.c - this just creates a file
+of random data for passing back and forth.  It also builds _suping: make
+sure this is suid-root to be able to flood-ping the target.
+
+
+Running the Network Testing Server
+----------------------------------
+
+Make sure "." is on your path, early enough, then
+
+	awaitorder | obey.sh
+
+This is all you need to do to run the testing server.
+
+
+"./awaitorder" just waits for a connection on TCP port 9980 and prints what
+it receives.  For example, to test it:
+
+		% telnet masala 9980
+ you type --->	Eggs, bacon, beans, mushrooms, toast and coffee
+		Acknowledged
+		Connection closed by foreign host.
+		% 
+
+and awaitorder will print as follows:
+
+		 % awaitorder 
+		awaitorder: connection from 172.16.19.13:3739
+		ORDERS: Eggs, bacon, beans, mushrooms, toast and coffee
+
+and continue waiting for the next order.
+
+
+"./obey.sh" does rather more.  It assumes that its stdin is connected to a
+source of orders, and it expects that lines of input will look like this:
+
+	ORDERS: TFTP_SERV_GET 10.16.19.171 300
+
+or more generally
+
+	"ORDERS:" [XFAIL] <order> <target IP> <extra params...>
+
+The set of valid orders (TFTP_SERV_GET, TFTP_SERV_PUT ...) will expand with
+time as we add more tests.
+
+Having checked that an order looks generally valid, and set up some
+environment, it then switches on the order to execute a test script to do
+what the testcase that sent the order wants.  The extra params are given to
+the test script.  The test script is invoked in background, so that several
+sessions can be running at once to hit the target board hard, or of course
+one network testing server can be servicing several target boards running
+different testcases all at once.  After the test script is launched,
+obey.sh just loops back to reading an input line, to get the next order.
+
+"XFAIL" in parameter 1 means the target is configured to simulate network
+unreliability, or otherwise be uncooperative.  It is passed both to the
+individual testing scripts and to the system for returning status messages
+to the test target.
+
+This structure is designed to allow separate development and testing of the
+individual parts of the network testing server and also of new testcases;
+the eCos testcase and its test script can be developed on your desk without
+running the network test server - you only need to knit them all together
+at the end by adding a simple clause to obey.sh to invoke the test script
+automatically.
+
+
+Test Script Environment
+-----------------------
+
+There is some IO redirection nastiness in obey.sh to separate errors from
+good status from status to return to the eCos testcase and so on.
+
+awaitorder takes care to issue complaints to stderr, whilst obviously its
+stdout is piped in to obey.sh
+
+obey.sh takes care to issue problem reports to stderr, and mere commentary
+to stdout; neither is paricularly verbose right now, so there's no need to
+so anything special.
+
+Individual test scripts are invoked as follows.  Stdout is directed to a
+logfile named uniquely and for the test in question, according the the
+variable $LG.  Stderr is piped to an acknowledgement agent, by default
+"./sendack.sh", which is invoked with the target address as its argument.
+This returns status messages from the host testing script to the eCos
+testcase via TCP port 9990.
+
+Let's look at the two example switch cases for the TFTP tests.  There are
+two to mostly put versus mostly get files with the eCos TFTP server.
+
+    # Now the main swicth that runs the test script: this is where
+    # new testcases are added:
+    case $TEST in
+
+    TFTP_SERV_GET)
+    tftpget.sh $TARGET $WF/tftpget.$unique ${PARAMS[@]} \
+	    2>&1 >$LG/tftpget.$unique | $SENDACK $TARGET & ;;
+
+    TFTP_SERV_PUT)
+    tftpput.sh $TARGET $WF/tftpput.$unique ${PARAMS[@]} \
+	    2>&1 >$LG/tftpput.$unique | $SENDACK $TARGET & ;;
+
+OK, this is horrid.  But breaking up one example:
+
+this first part is the invokation of the script:
+
+    tftpput.sh $TARGET $WF/tftpput.$unique ${PARAMS[@]}
+
+its arguments are
+
+    tftpput.sh <target IP> <temporary file> <timeout> <filesize>
+
+ o <target IP> is $TARGET, from the original order.
+
+ o obey.sh has invented <temporary file> with a unique id, in the workfiles
+   directory, $WF.  It will typically be "/tmp/auto/wf/tftpput.1138".  In
+   this example, the test script will make files called
+   "/tmp/auto/wf/tftpput.1138.src" and "/tmp/auto/wf/tftpput.1138.tmp" to
+   play with; one is created by the tmpfile program, the other read back
+   from the TFTP server.
+
+ o <timeout> is part of the extra params supplied by the eCos testcase,
+   which in this case will serve TFTP for about 5 minutes, so it tells the
+   test script to diddle it for about 5 minutes too.
+
+ o <filesize> is another param supplied by the eCos testcase, which tells
+   the script to create a testfile of a particular size to exercise edge
+   conditions wrt the blocksize.
+
+The second part of the example is the IO redirection and backgrounding:
+
+	    2>&1 >$LG/tftpput.$unique | $SENDACK $XFAIL $TARGET & ;;
+
+This sets the script's fd2 to a copy of its stdout, then sets its stdout to
+go to the logfile, typically "/tmp/auto/log/tftpput.1138", then pipes the
+original stdout which now occupies fd2 into $SENDACK, the acknowledgement
+agent, which is itself invoked with the target's IP address and optionally
+XFAIL to tell it not to be so upset if it fails to return the result.  The
+whole thing is run in background by the "&" and the ";;" is the end of this
+case within the switch statement.  Phew!
+
+More briefly, the test script's stdout goes into the logfile and the test
+script's stderr goes into $SENDACK (./sendack.sh) and thence to the
+testcase.
+
+
+Typical Output
+--------------
+
+This is the output from awaitorder | obey.sh from running just one eCos
+testcase, which requests 3 simultaneous TFTP sessions for 5 minutes:
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+awaitorder: connection from 10.16.19.171:34554
+test TFTP_SERV_PUT; target 10.16.19.171; params 300 512
+awaitorder: connection from 10.16.19.171:46052
+test TFTP_SERV_PUT; target 10.16.19.171; params 300 513
+awaitorder: connection from 172.16.19.171:25388
+test TFTP_SERV_PUT; target 172.16.19.171; params 300 512
+10.16.19.171: result INFO:<10.16.19.171 is up>
+172.16.19.171: result INFO:<172.16.19.171 is up>
+10.16.19.171: result INFO:<10.16.19.171 is up>
+10.16.19.171: result PASS:<tftp put OK, 300 seconds 513 bytes 20696 xfers>
+10.16.19.171: result PASS:<tftp put OK, 300 seconds 512 bytes 14982 xfers>
+172.16.19.171: result PASS:<tftp put OK, 300 seconds 512 bytes 12649 xfers>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+and the eCos test case prints, amongst other things, on receipt of the
+results via sendack.sh
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+INFO:<10.16.19.171 is up> (10.16.19.171) (from 10.16.19.13:4764)
+INFO:<172.16.19.171 is up> (172.16.19.171) (from 172.16.19.13:4765)
+INFO:<10.16.19.171 is up> (10.16.19.171) (from 10.16.19.13:4766)
+....
+PASS:<tftp put OK, 300 seconds 513 bytes 20696 xfers> (10.16.19.171) (from 10.16.19.13:4775)
+PASS:<tftp put OK, 300 seconds 512 bytes 14982 xfers> (10.16.19.171) (from 10.16.19.13:4776)
+PASS:<tftp put OK, 300 seconds 512 bytes 12649 xfers> (172.16.19.171) (from 172.16.19.13:4777)
+....
+PASS:<Results from host[s] OK>
+EXIT:<Done>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This output format will change over time as more features may be added, but
+this example should convey the general idea.
+
+
+Individual Host Testing Scripts
+-------------------------------
+
+The params and invocation of these is entirely a matter of agreement
+between the eCos testcase and the test script.  A new case arm in the
+obey.sh switch statement must be written for any new testcase, so the
+script's invocation is not prescribed in any way.
+
+For the sake of easier separate development of testcases, it would be
+better to follow the pattern of the other testcases, also for consistency
+and comprehensibility.  Here are some guidelines and requirements, but
+first some assumptions:
+
+ o One test script "does things to" one target board, and more specifically
+   one target IP address.  If you want several things done to your target
+   board at once, invoke several scripts at once - all on the same IP
+   address if you want, that's fine.
+
+ o The test script may need to be told that the target network stack is
+   configured to simulate network unreliability, so the test script should
+   not expect perfect communications.  Eg. weaker protocols will in fact
+   fail - the point of the test is verify that the target does not hang or
+   crash or assert-fail and so on; host side network failures within the
+   script are unimportant.  Otherwise, the test script should expect
+   correct operation in the operations it performs.
+
+ o The network test server can serve testing to many eCos target boards at
+   once.  Therefore any particular test script can be invoked several times
+   at once to deal with different target boards, if they happen at random
+   to run the same testcase at the same time as each other.  Therefore a
+   test script should only use temporary files which are uniquely named per
+   invocation.
+
+These lead to requirements and guidelines:
+
+ o Take the flag XFAIL optionally as the first argument, if it is XFAIL
+   shift to get the other arguments.
+
+ o Take the target IP address as the next argument; it's an obvious place
+   for it and you'll certainly need it anyhow.
+
+ o For workfiles, have obey.sh supply a parameter to name such files
+   uniquely.  Use a full pathname.  Include the test type also, for example
+   "/tmp/auto/wf/tftpput.1138" identifies the file as belonging to the
+   tftpput testcase.  Make required workfiles be second and subsequent
+   arguments.
+
+ o Further arguments which are arbitrary and passed from the testcase
+   should be last, and passed all together.  It's not convenient in the
+   shell to split out words 2 through the end from an array if you already
+   quoted word one elsewhere, so instead put all the extras together as in
+   ${PARAMS[@]} in the tftpput.sh invocation discussed above.
+
+
+Other Environment
+-----------------
+
+ o DHCP
+
+Set up DHCP to support the target board - it's the easiest way.
+
+The tests know which server to talk to by looking in the server ID field of
+the bootp information record; if DHCP or BOOTP is used, this will be the
+server that served it.  It is also possible to set up the stack with static
+initialization of that field - if you do this, make sure it points to a
+machine that is running the network test server.
+
+Setting up the server to serve DHCP to the target boards only is easy;
+keeping other DHCP servers, who offer dynamic addresses to any new net
+presence, from offering service to them requires a little trick.  A dynamic
+server should be set up to supply a static address to the target board's
+MAC address, with the additional key: "deny booting;".  This does nothing
+malicious, but it lets the server recognize the target board and ignore it.
+
+This ensures that the network test server machine "wins" the race to set up
+the target, and so ensures that the test talks to the network test server
+rather than trying to talk to a global DHCP server.
+
+
+ o /tmp clearance
+
+The ongoing testing fills /tmp with log files and work files.  The logs
+will likely not be very large, but the work files could be a few Mb per
+test run.
+
+A cron job to remove everything older than an hour, or some such might be
+useful; or if the machine can stand it, just wipe /tmp/auto every night.
+
+
+ o Ping!
+
+The tests will expect to ping (and flood ping) the server; it should be
+allowed to do this back.  An suid executable (CARE!) is needed to enable
+this.  "./_suping" is built by the host makefile: make it be suid root.
+It is a trivial app that execs ping after setting the effective UID to
+root.  This is necessary because ping is an suid-root executable anyway, to
+be able to get at raw sockets; it checks the effective UID to decide
+whether to permit flood pinging; we need this for the flood tests floodping
+and floodpingmux.
+
+
+ o Network aliases in the loopback interface
+
+The routing tests require a network setup like this:
+
+  10.0.3.1      A.B.C.D   A.B.C.E        N.M.O.P   N.M.O.Q      10.0.4.1
+  -------- Box1 ----------------- target ----------------- Box2 --------
+
+
+Optionally with 10.0.3 and 10.0.4 being real networks, with other stations
+on them; addresses 10.0.x.99 are also pinged.  Alternatively, 10.0.3 and
+10.0.4 can be aliases for the loopback device in Box1 and Box2 (which may
+be the same box really).  A typical setup might really look like:
+             
+  HOST: eth0 172.16.19.13 ------ 172.16.19.171 eth0 on TARGET
+  HOST: eth1 10.16.19.13 -------- 10.16.19.171 eth1 on TARGET
+  HOST: lo:0 10.0.3.1
+  HOST: lo:1 10.0.4.1
+
+with all netmasks being /24 (255.255.255.0).
+
+This means that the target can only ping addresses 10.0.3.x and 10.0.4.x if
+a route has been set up via 172.16.19.13 or 10.16.19.13 (respectively, for
+the case of having two distinct hosts).  The routing tests verify that
+behaviour.
+
+
+ o TFTP server and its files
+
+No test of the eCos TFTP client yet, so no details here.
+
+ o FTP server and its files
+
+No test for the eCos FTP client yet, so no details here.
+
+
+
+.fin
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/doc/strategy.txt
@@ -0,0 +1,237 @@
+
+Some Thoughts on Automated Network Testing for eCos
+***************************************************
+
+Hugo Tyson, Red Hat, Cambridge UK, 2000-07-28
+
+
+Requirements
+============
+
+This thinking is dominated by the need for automated continuous testing
+of the StrongARM EBSA-285 boards, which have two ethernet interfaces.
+We also have some needs for ongoing eCos network testing.
+
+ o TCP testing: move a large amount of data, checking its correctness.
+   (with several streams running in parallel at once)
+
+ o UDP testing: similar but using UDP.
+
+ o TFTP testing: an external server, from a choice of LINUX, NT, SunOS, and
+   another EBSA board, get from the target some files, of sizes 0, 1, 512,
+   513, 1048576 bytes.  (with several streams running in parallel at once)
+
+ o TFTP testing: put to the target some files, ....
+
+ o TFTP testing: the target tftp client code does the same, getting and
+   putting, to an external server.
+
+   [ All that TFTP test makes explicit testing of UDP unneccessary; UDP
+   testing would need sequence numbers and so on, so we may as well use
+   TFTP as the implementation of that]
+
+ o FTP test: we have a trivial "connect" test; continue to use it.
+
+ o Performance testing: TCP_ECHO, TCP_SOURCE, TCP_SINK programs work in
+   concert to measure throughput of a partially loaded target board.
+   Source and Sink apps run on an external host.
+
+ o Flood pings: the target floods the hosts on its two external interfaces
+   whilst they flood it.  This is left going for a long time, and store
+   leaks or crashes are checked for.
+
+Orthogonally to these "feature tests" are requirements to run these tests
+with and without these features in combinations:
+
+ o The "realtime test harness" operating - it checks interrupt latencies
+   and so on.  This is written and works.
+
+ o Booting statically, via bootp, via DHCP statically/leased on the two
+   interfaces in combination.
+
+ o Simulated failure of the network, of the kinds "drop 1 in N packets",
+   "drop all for 0 < random() < 30 Seconds" and the like.  Corrupted
+   packets being sent out by the target, also!
+
+Needs
+---------------
+
+We have some other requirements:
+
+ o Support testing of other net-enabled targets!
+
+ o Run tests at a reasonable rate, so do NOT require a reboot of, say, a
+   LINUX host every test run to reconfigure the network environment.
+
+ o Feasible: do NOT require anything too complex in terms of controlling
+   the network environment.
+
+ o Do not use too many machines.  The farm is full already.
+
+
+Other Goals
+-----------
+
+These are some ideas that are useful but not strictly necessary:
+
+ o Re-use/work-with the existing test infrastructure
+
+ o Provide the sort of results information that the existing test
+   infrastructure does.
+
+ o Work with standard testing *host* computers of various kinds.
+
+ o Support conveniently debugging these test examples at developers' desks
+   - not just in the farm.
+
+
+Details
+=======
+
+Because of the flood pinging and malformed packet requirements, the target
+boards need to be on an isolated network.
+
+The target board's two interfaces need to be on distinct networks for the
+stack to behave properly.
+
+
+
+Strategy
+========
+
+I believe we can implement everything we need for the host computers to do
+using a daemon or server, (cf. the serial test filter) which sits on the
+host computer waiting to be told what test we are about to run, and takes
+appropriate action.
+
+Note that this does work even for situations where the target is passive,
+eg. being a TFTP server.  The target simply "does" TFTP serving for a set
+period of time - or perhaps until a cookie file exists in its test file
+system - and then performs a set of consistency checks (including on the
+state of the test FS), thus creating a PASS/FAIL test result.  It can also
+periodically run those checks anyway, and choose FAIL at any time.
+
+But who tells the host daemon what to do?  The target does, of course.
+That way, the host is stateless, it simply runs that daemon doing what it's
+bid, and does NOT ever have to report test results.  This has enormous
+advantages, because it means we gather test results from what the target
+said, and no other source, thus minimizing changes to the farm software.
+It also means that to add a new test, we can asynchronously add the feature
+to the test daemons of that is required, then add a new testcase in the
+usual manner, with all the usual (compile-time) testing of its
+applicability as usual.
+
+Network Topology
+----------------
+
+The idea is that we can initially have a setup like this:
+
+    house network <---> [net-testfarm-machine] serial -------+
+                                                             |
+                                                           serial
+    house network <----> eth0 [LINUX BOX] eth1 <---> eth0 [ EBSA ]
+                              [ dhcpd   ] eth2 <---> eth1 [      ]
+                              [ tftpd   ]
+                              [ ftpd    ]
+                              [ testd   ]
+
+for developing the system.  Testd is our new daemon that runs tcp_sink, or
+tcp_source, or a floodping, or does tftp to the target (rather than vice
+versa) as and when the target instructs it.  The target can report test
+results to the net-testfarm-machine as usual, but with bigger timeouts &c
+configured in the test farm.
+
+This system can then be generalized to
+
+        test-server1            test-server2            test-serverN
+           eth0                   eth0                     eth0
+            |                      |                        |
+            |                      |                        |
+           eth0                    |                        |
+        target1                 target4                 targetM
+           target2                target5                 targetM+1
+              target3               target6                 targetM+2
+           eth1
+            |
+            |
+        test-server11
+                
+where target1,2,3 have 2 ethernet interfaces and the others have only one.
+
+And further, provided the testd protocol supports targets choosing one
+server from many which offer service, which would be a good thing:
+
+        test-server1            test-server2            test-serverN
+           eth0                   eth0                     eth0
+         [LINUX]                 [Solaris]                [NT4.0]
+            |                      |                        |
+            +----------------------+------------------------+
+            |                      |                        |
+           eth0                    |                        |
+        target1                 target4                 targetM
+           target2                target5                 targetM+1
+              target3               target6                 targetM+2
+           eth1
+            |
+            +-----------------------+
+            |                       |
+         [LINUX]                 [NT4.0]
+        test-server11          test-server12
+
+which would IMHO be a good thing IN ADDITION to a completely partitioned
+set of test network as above.  The partitioned set of test networks is
+required also because we need to test all of:
+
+ Target asks for BOOTP vs. DHCP  -X-  Server does only BOOTP vs. DHCP
+
+in combinations on the different interfaces.  Simply setting up servers
+that way statically is best, rather than trying to script controls for
+servers that have them offering bootp one minute and DHCP the next.
+
+
+Test Farm
+---------
+
+Orthogonal to the network topology, the network test farm is connected to
+all these targets in the usual manner by serial lines.  That way the tests
+can run and busy/cripple that local network without affecting the house
+network *and* without affecting the debug connection, and with the
+advantage that tests net traffic can interfere with each other, providing a
+diverse network environment for testing, rather than a quiet net.
+
+For testing with GDB connection over the network, which is desirable, I
+suggest either keeping those machines separate, or having the farm's
+connection into the test-net be via second interfaces fitted to the server
+machines.
+
+Otherwise, it's a standard test farm, which knows to choose only from a
+special set of perms, and which has waaay longer timeouts.
+
+
+Test Cases
+----------
+
+In this way, tests of the form "make an external machine do tftp to the
+target board" are implemented by means of a standard eCos test case, which
+requests that action from a server, then waits for it to be told AOK or
+just for a certain time, and reports as such to the test farm as usual.
+
+These special tests are only compiled in certain perms.
+
+Those same special perms select between the various initialization options
+required also: DHCP or BOOTP or static initialization, and so on, in the
+usual manner.
+
+
+Implementation
+--------------
+
+Just a quick note on this: DHCP has a lot of the properties we want for the
+test protocol.  We should take a copy of that and use different port
+numbers, re-use a lot of the code, since server code is also available.
+
+Or something simpler; none of this seems especially challenging.
+
+
+That's all for now.
+.ends
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/host/_suping.c
@@ -0,0 +1,14 @@
+// _suping.c
+
+#include <unistd.h>
+
+// This a piece of lameness to convince ping to do a floodping.
+int main( int argc, char **argv )
+{
+    setuid( 0 );
+    execvp( "ping", argv );
+    perror( "What, no ping?" );
+    exit( 1 );
+}
+
+// EOF
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/host/awaitorder.c
@@ -0,0 +1,153 @@
+//==========================================================================
+//
+//      awaitorder.c
+//
+//      Await an order from the target, and print it out...
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-10
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <stdio.h>
+
+#include <net/if.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/ip_icmp.h>
+#include <net/route.h>
+
+void
+pexit(char *s)
+{
+    perror(s);
+    exit(1);
+}
+
+#define SOURCE_PORT 9980
+
+int main( int argc, char **argv )
+{
+    int s_source, e_source;
+    struct sockaddr_in e_source_addr, local;
+    int one = 1;
+    int len;
+    char orders[256];
+    char ack[] = "Acknowledged\n";
+    int loop = 1;
+
+    if ( 2 < argc ) {
+    usage:
+        fprintf( stderr, "usage: %s [once|many]\n", argv[0] );
+        exit(1);
+    } 
+
+    if ( 2 == argc ) {
+        if ( !strcmp( "once", argv[1] ) )
+            loop = 0;
+        else if ( !strcmp( "many", argv[1] ) )
+            loop = 1;
+        else 
+            goto usage;
+    }
+
+    s_source = socket(AF_INET, SOCK_STREAM, 6 /* TCP */ );
+    if (s_source < 0) {
+        pexit("stream socket");
+    }
+
+
+    memset(&local, 0, sizeof(local));
+    local.sin_family = AF_INET;
+    local.sin_len = sizeof(local);
+    local.sin_port = ntohs(SOURCE_PORT);
+    local.sin_addr.s_addr = INADDR_ANY;
+    if(bind(s_source, (struct sockaddr *) &local, sizeof(local)) < 0) {
+        pexit("bind /source/ error");
+    }
+    if (setsockopt(s_source, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))) {
+        pexit("setsockopt /source/ SO_REUSEADDR");
+    }
+#ifdef SO_REUSEPORT
+    if (setsockopt(s_source, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one))) {
+        pexit("setsockopt /source/ SO_REUSEPORT");
+    }
+#endif
+
+    listen(s_source, SOMAXCONN);
+
+    do {
+        len = sizeof(e_source_addr);
+        if ((e_source = accept(s_source,
+                 (struct sockaddr *)&e_source_addr, &len)) < 0) {
+            pexit("accept /source/");
+        }
+        fprintf( stderr, "awaitorder: connection from %s:%d\n", 
+                 inet_ntoa(e_source_addr.sin_addr), ntohs(e_source_addr.sin_port));
+        
+        // Wait for "source" to tell us the orders
+        if ( 0 >= (len = read(e_source, orders, sizeof(orders)))) {
+            pexit("Can't read orders");
+        }
+        if ( sizeof(ack) != write(e_source, ack, sizeof( ack ) ) ) {
+            pexit("Can't write ACK");
+        }
+
+        orders[len] = 0;
+
+        printf( "ORDERS: %s\n", orders );
+        fflush( stdout );
+
+        close( e_source );
+    } while ( loop );
+
+    close( s_source );
+}
+// EOF awaitorder.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/host/floodping.sh
@@ -0,0 +1,86 @@
+#!/bin/sh
+
+# timeout is the total time to run the test, or thereabouts.
+#
+# ping/rest times are to let us do stuff like flood for 3 seconds then do
+# nothing for 5 seconds, over the total test time.
+#
+# That way this script can be used to torment other test variants such as
+# the SNMP walk, ordinary pinging and so on, all making for a more diverse
+# test environment.
+
+
+if [ $# -lt 1 ]; then
+    echo "Usage: $0 [XFAIL] target [timeout [size [ping rest]]" > /dev/stderr
+    exit 1
+fi
+
+[ "xXFAIL" == "x$1" ] && { XFAIL="XFAIL"; shift; }
+TARGET=$1
+if [ "x" == "x$2" ]; then TIMEOUT=10;   else TIMEOUT=$2;  fi
+if [ "x" == "x$3" ]; then PINGSIZE=64;  else PINGSIZE=$3; fi
+if [ "x" == "x$4" ]; then PINGTIME=19;  else PINGTIME=$4; fi
+if [ "x" == "x$5" ]; then RESTTIME=1;   else RESTTIME=$5; fi
+
+# By default, flood for 19 seconds then rest for one.
+# We take one second off occasionally to allow eg. DHCP to stay alive in
+# configurations/environments where it is so short lived.
+
+if [ "x$XFAIL" != "xXFAIL" ]; then
+    # first try normal size packets
+    if ping -n -c 5 $TARGET > /dev/null ; then
+	echo "INFO:<$$: $TARGET is up>" > /dev/stderr
+    else
+	echo "FAIL:<$$: $TARGET is down>" > /dev/stderr; exit 1
+    fi
+fi
+
+# allow other pingers &c to start up:
+sleep 5
+
+declare -i COUNT=0
+
+# then the size we were asked to do, for the time requested
+
+while [ $SECONDS -le $TIMEOUT ]; do
+
+# Use an explicit path in '.' because this must be an SUID script to be
+# able to use the flood option.  Direct stderr to tmp also because we
+# cannot report results whilst flooding.
+./_suping -f -n -w $PINGTIME -q -s $PINGSIZE $TARGET > /tmp/ping$$ 2>&1
+
+# dump this out for the controller logfile
+cat /tmp/ping$$
+
+INFO1=$(grep "bytes of data" /tmp/ping$$)
+INFO2=$(grep "packet loss" /tmp/ping$$)
+INFO3=$(grep "round-trip" /tmp/ping$$)
+
+rm -f /tmp/ping$$
+
+# but do not print it all out to stderr (and so to sendack and over the
+# net); the two cannot coexist reliably.
+
+#[ "x" != "x$INFO1" ] && echo "INFO:<$$: $INFO1>" > /dev/stderr
+#[ "x" != "x$INFO2" ] && echo "INFO:<$$: $INFO2>" > /dev/stderr
+#[ "x" != "x$INFO3" ] && echo "INFO:<$$: $INFO3>" > /dev/stderr
+
+# then a delay for other traffic - else other tests fail
+sleep $RESTTIME
+
+((COUNT++));
+done
+
+# allow other flood pingers to finish:
+sleep 5
+
+if [ "x$XFAIL" == "xXFAIL" ]; then
+    echo "PASS:<$$: flood ping XFAIL, $PINGSIZE bytes $TIMEOUT seconds $COUNT sessions>" > /dev/stderr
+    exit 0
+fi
+
+# we cannot really look for pass/fail from a flood ping...
+
+echo "PASS:<$$: flood ping OK, $PINGSIZE bytes $TIMEOUT seconds $COUNT sessions>" > /dev/stderr
+
+# EOF
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/host/makefile
@@ -0,0 +1,19 @@
+
+all: awaitorder tmpfile _suping
+
+awaitorder: awaitorder.c
+	gcc -g -o awaitorder awaitorder.c
+
+
+tmpfile: tmpfile.c
+	gcc -g -o tmpfile tmpfile.c
+
+_suping: _suping.c
+	gcc -g -o _suping _suping.c
+	@echo "*** Don't forget to   chown root _suping; chmod u+sx _suping   ***"
+
+clean:
+	rm -f tmpfile
+	rm -f awaitorder
+	rm -f _suping
+	rm -f *~
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/host/obey.sh
@@ -0,0 +1,83 @@
+#!/bin/sh
+
+if [ $# -gt 1 ]; then
+    echo "Usage: $0 [acknowledgement-agent]" > /dev/stderr
+    exit 1
+fi
+
+# add . to the path for testing.
+export PATH=$PATH:.
+
+# get a script for returning results to the testcase; its API is
+#      echo .... | SENDACK [XFAIL] <target>
+if [ $# -gt 0 ]; then
+    SENDACK=$1; shift
+else
+    SENDACK=sendack.sh
+fi
+
+TMP=/tmp/auto	;# root of temporary filespace
+
+WF=${TMP}/wf	;# work files for tftp et al
+LG=${TMP}/log	;# log files for individual tests
+
+declare -i unique=0 ;# unique IDs for workfiles and logfiles
+
+while [ true ]; do
+
+    ((unique++))
+
+    read -a ORDERS || {	echo "FAIL: EOF on read" > /dev/stderr; exit 1; }
+
+    set ${ORDERS[@]}
+
+    [ "xQUIT" == "x$1" ] && break
+
+    [ "xORDERS:" != "x$1" ] && \
+	{ echo "No ORDERS tag" > /dev/stderr; continue; }
+
+    XFAIL=""; [ "xXFAIL" == "x$2" ] && { XFAIL="XFAIL"; shift; }
+
+    shift; TEST=$1
+    shift; TARGET=$1
+    shift; PARAMS=($@)
+
+    echo "test $TEST [$XFAIL]; target $TARGET; params ${PARAMS[@]}"
+
+    # Be robust against zealous GC of workfiles - as late as possible
+    # before we use them, it's in the read above that we sleep.
+    [ ! -d ${TMP} ] && mkdir ${TMP}
+    [ ! -d ${WF}  ] && mkdir ${WF}
+    [ ! -d ${LG}  ] && mkdir ${LG}
+
+    # Now the main switch that runs the test script: this is where
+    # new testcases are added:
+    case $TEST in
+
+    TFTP_SERV_GET)
+    tftpget.sh $XFAIL $TARGET $WF/tftpget.$unique ${PARAMS[@]} \
+	    2>&1 >$LG/tftpget.$unique   | $SENDACK $XFAIL $TARGET & ;;
+
+    TFTP_SERV_PUT)
+    tftpput.sh $XFAIL $TARGET $WF/tftpput.$unique ${PARAMS[@]} \
+	    2>&1 >$LG/tftpput.$unique   | $SENDACK $XFAIL $TARGET & ;;
+
+    SLOW_PING)
+    slowping.sh $XFAIL $TARGET ${PARAMS[@]} \
+	    2>&1 >$LG/slowping.$unique  | $SENDACK $XFAIL $TARGET & ;;
+
+    FLOOD_PING)
+    floodping.sh $XFAIL $TARGET ${PARAMS[@]} \
+	    2>&1 >$LG/floodping.$unique  | $SENDACK $XFAIL $TARGET & ;;
+
+    SNMP_WALK)
+    snmpwalk.sh $XFAIL $TARGET ${PARAMS[@]} \
+	    2>&1 >$LG/snmpwalk.$unique  | $SENDACK $XFAIL $TARGET & ;;
+
+    *) echo "Unknown order $TEST" > /dev/stderr ;;
+
+    esac
+
+done
+
+# EOF
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/host/sendack.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+if [ $# -gt 2 ] || [ $# -lt 1 ]; then
+    echo "Usage: $0 [XFAIL] target-IP [port]" > /dev/stderr
+    exit 1
+fi
+
+[ "xXFAIL" == "x$1" ] && { XFAIL="XFAIL"; shift; }
+
+TARGET=$1; shift
+
+PORT=9990; [ "x" != "x$1" ] && { PORT=$1; shift; }
+
+while [ true ]; do
+
+    read -a RESULT || {	exit 0; }
+
+    echo "$TARGET: result ${RESULT[@]}"
+
+    # I really want it to try quite hard to get the message through
+    # (but not too hard if XFAIL)
+    echo "${RESULT[@]} ($TARGET)" > /dev/tcp/$TARGET/$PORT || \
+    echo "${RESULT[@]} ($TARGET)" > /dev/tcp/$TARGET/$PORT || \
+    { sleep 1 && { \
+    echo "${RESULT[@]} ($TARGET)" > /dev/tcp/$TARGET/$PORT || \
+    echo "${RESULT[@]} ($TARGET)" > /dev/tcp/$TARGET/$PORT || \
+    { sleep 3 && { \
+    echo "${RESULT[@]} ($TARGET)" > /dev/tcp/$TARGET/$PORT || \
+    echo "${RESULT[@]} ($TARGET)" > /dev/tcp/$TARGET/$PORT || \
+    { [ "x$XFAIL" != "xXFAIL" ] && sleep 5 && { \
+    echo "${RESULT[@]} ($TARGET)" > /dev/tcp/$TARGET/$PORT || \
+    echo "${RESULT[@]} ($TARGET)" > /dev/tcp/$TARGET/$PORT || \
+    { sleep 10 && { \
+    echo "${RESULT[@]} ($TARGET)" > /dev/tcp/$TARGET/$PORT || \
+    echo "${RESULT[@]} ($TARGET)" > /dev/tcp/$TARGET/$PORT || \
+    echo "***FAILED TO SEND RESULT TO $TARGET: result ${RESULT[@]}" \
+    ;};};};};};};};}
+    # brute force seems as good as any means...
+
+done
+
+# EOF
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/host/slowping.sh
@@ -0,0 +1,50 @@
+#!/bin/sh
+
+if [ $# -lt 1 ]; then
+    echo "Usage: $0 [XFAIL] target [timeout [size]]" > /dev/stderr
+    exit 1
+fi
+
+[ "xXFAIL" == "x$1" ] && { XFAIL="XFAIL"; shift; }
+TARGET=$1
+if [ "x" == "x$2" ]; then TIMEOUT=10;   else TIMEOUT=$2; fi
+if [ "x" == "x$3" ]; then PINGSIZE=64;  else PINGSIZE=$3; fi
+
+if [ "x$XFAIL" != "xXFAIL" ]; then
+    # first try normal size packets
+    if ping -n -c 5 $TARGET > /dev/null ; then
+	echo "INFO:<$$: $TARGET is up>" > /dev/stderr
+    else
+	echo "FAIL:<$$: $TARGET is down>" > /dev/stderr; exit 1
+    fi
+fi
+
+# then the size we were asked to do, for the time requested
+ping -n -c $TIMEOUT -s $PINGSIZE $TARGET > /tmp/ping$$ && PINGRESULT=ok
+
+# dump this out for the controller logfile
+cat /tmp/ping$$
+
+INFO1=$(grep "bytes of data" /tmp/ping$$)
+INFO2=$(grep "packet loss" /tmp/ping$$)
+INFO3=$(grep "round-trip" /tmp/ping$$)
+
+rm -f /tmp/ping$$
+
+[ "x" != "x$INFO1" ] && echo "INFO:<$$: $INFO1>" > /dev/stderr
+[ "x" != "x$INFO2" ] && echo "INFO:<$$: $INFO2>" > /dev/stderr
+[ "x" != "x$INFO3" ] && echo "INFO:<$$: $INFO3>" > /dev/stderr
+
+if [ "x$XFAIL" == "xXFAIL" ]; then
+    echo "PASS:<$$: slow ping XFAIL, $PINGSIZE bytes $TIMEOUT packets/seconds>" > /dev/stderr
+    exit 0
+fi
+
+if [ "x" == "x$PINGRESULT" ]; then
+    echo "FAIL:<$$: slow ping failed, $PINGSIZE bytes $TIMEOUT packets/seconds>" > /dev/stderr
+    exit 1
+fi
+
+echo "PASS:<$$: slow ping OK, $PINGSIZE bytes $TIMEOUT packets/seconds>" > /dev/stderr
+
+# EOF
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/host/snmpwalk.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+if [ $# -lt 1 ]; then
+    echo "Usage: $0 [XFAIL] target [timeout]" > /dev/stderr
+    exit 1
+fi
+
+[ "xXFAIL" == "x$1" ] && { XFAIL="XFAIL"; shift; }
+TARGET=$1
+if [ "x" == "x$2" ]; then TIMEOUT=10;   else TIMEOUT=$2;  fi
+
+if [ "x$XFAIL" != "xXFAIL" ]; then
+    # first try normal size packets
+    if ping -n -c 5 $TARGET > /dev/null ; then
+	echo "INFO:<$$: $TARGET is up>" > /dev/stderr
+    else
+	echo "FAIL:<$$: $TARGET is down>" > /dev/stderr; exit 1
+    fi
+fi
+
+export MIBS=all
+
+declare -i COUNT=0
+declare -i FAILS=0
+
+# then the size we were asked to do, for the time requested
+
+while [ $SECONDS -le $TIMEOUT ]; do
+
+snmpwalk -OS $TARGET public
+
+snmpstatus $TARGET public || { ((FAILS++)); [ "x$XFAIL" == "xXFAIL" ]; } || break
+
+((COUNT++));
+
+done
+
+
+if [ "x$XFAIL" == "xXFAIL" ]; then
+    echo "PASS:<$$: snmpwalk XFAIL, $TIMEOUT seconds $COUNT snmpwalks $FAILS failed>" > /dev/stderr
+    exit 0
+fi
+
+if [ $FAILS -ne 0 ]; then
+    echo "FAIL:<$$: snmpwalk $TIMEOUT seconds $COUNT snmpwalks - status failed>" > /dev/stderr
+    exit 1
+fi
+
+echo "PASS:<$$: snmpwalk $TIMEOUT seconds $COUNT snmpwalks>" > /dev/stderr
+
+# EOF
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/host/tftpget.sh
@@ -0,0 +1,104 @@
+#!/bin/sh
+
+if [ $# -lt 1 ]; then
+    echo "Usage: $0 target [tempfile [timeout [filesize]]]" > /dev/stderr
+    exit 1
+fi
+
+[ "xXFAIL" == "x$1" ] && { XFAIL="XFAIL"; shift; }
+TARGET=$1
+if [ "x" == "x$2" ]; then TMP=tftpdata; else TMP=$2; fi
+if [ "x" == "x$3" ]; then TIMEOUT=10;   else TIMEOUT=$3; fi
+if [ "x" == "x$4" ]; then SIZE=unknown; else SIZE=$4; fi
+
+if [ -f $TMP ]; then
+    SRC=${TMP}
+    TMP=${TMP}.tmp
+else
+    SRC=${TMP}.src
+    TMP=${TMP}.tmp
+fi
+
+if [ -f $SRC ]; then
+    [ $SIZE == unknown ] ||  \
+    { echo "FAIL: '$SRC' exists but size given" > /dev/stderr; exit 1; }
+else
+    [ $SIZE == unknown ] && SIZE=876543
+    tmpfile $SRC $SIZE $$ || \
+    { echo "FAIL: Sourcefile '$SRC' create" > /dev/stderr; exit 1; }
+fi
+
+if [ ! -f $SRC ]; then
+    echo "FAIL: Sourcefile '$SRC' not found" > /dev/stderr; exit 1
+fi
+
+if [ "x$XFAIL" != "xXFAIL" ]; then
+    if ping -n -c5 $TARGET > /dev/null ; then
+	echo "INFO:<$$: $TARGET is up>" > /dev/stderr
+    else
+	echo "FAIL:<$$: $TARGET is down>" > /dev/stderr; exit 1
+    fi
+fi
+
+tftp $TARGET  <<-EOF
+	rexmt 1
+	binary
+	put $SRC $TMP
+EOF
+
+declare -i COUNT=0
+declare -i FAILS=0
+
+# This test is to test tftp GET not PUT so gloss over one failed put
+# (ie. if it reports corrupt the first time, put it again).
+rm -f $TMP
+tftp $TARGET  <<-EOF
+	rexmt 1
+	binary
+	get $TMP $TMP
+EOF
+if ! cmp -s $SRC $TMP; then
+echo "INFO:<$$: putting $SIZE bytes to $TARGET a second time>"
+tftp $TARGET  <<-EOF
+	rexmt 1
+	binary
+	put $SRC $TMP
+EOF
+else
+((COUNT++));
+fi
+
+while [ $SECONDS -le $TIMEOUT ]; do
+rm -f $TMP
+tftp $TARGET  <<-EOF
+	rexmt 1
+	binary
+	get $TMP $TMP
+EOF
+[ -f $TMP ]       || [ "x$XFAIL" == "xXFAIL" ] || break
+cmp -s $SRC $TMP  || { ((FAILS++)); [ "x$XFAIL" == "xXFAIL" ]; } || break
+((COUNT++));
+done
+
+if [ "x$XFAIL" == "xXFAIL" ]; then
+    echo "PASS:<$$: tftp get XFAIL, $TIMEOUT seconds $SIZE bytes $FAILS/$COUNT fails>" > /dev/stderr
+    exit 0
+fi
+
+if [ 1 -lt $FAILS ]; then
+    echo "FAIL:<$$: wierd, multiple failures $FAILS in $COUNT xfers>" > /dev/stderr
+fi
+
+if [ ! -f $TMP ]; then
+    echo "FAIL:<$$: temp file $TMP nonexistent $COUNT xfers>" > /dev/stderr
+    exit 1
+fi
+
+if ! cmp -s $SRC $TMP; then
+    echo "FAIL:<$$: temp file $TMP corrupt $COUNT xfers>" > /dev/stderr
+    exit 1
+fi
+
+echo "PASS:<$$: tftp get OK, $TIMEOUT seconds $SIZE bytes $COUNT xfers>" > /dev/stderr
+
+# EOF
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/host/tftpput.sh
@@ -0,0 +1,80 @@
+#!/bin/sh
+
+if [ $# -lt 1 ]; then
+    echo "Usage: $0 target [tempfile [timeout [filesize]]]" > /dev/stderr
+    exit 1
+fi
+
+[ "xXFAIL" == "x$1" ] && { XFAIL="XFAIL"; shift; }
+TARGET=$1
+if [ "x" == "x$2" ]; then TMP=tftpdata; else TMP=$2; fi
+if [ "x" == "x$3" ]; then TIMEOUT=10;   else TIMEOUT=$3; fi
+if [ "x" == "x$4" ]; then SIZE=unknown; else SIZE=$4; fi
+
+if [ -f $TMP ]; then
+    SRC=${TMP}
+    TMP=${TMP}.tmp
+else
+    SRC=${TMP}.src
+    TMP=${TMP}.tmp
+fi
+
+if [ -f $SRC ]; then
+    [ $SIZE == unknown ] ||  \
+    { echo "FAIL: '$SRC' exists but size given" > /dev/stderr; exit 1; }
+else
+    [ $SIZE == unknown ] && SIZE=876543
+    tmpfile $SRC $SIZE $$ || \
+    { echo "FAIL: Sourcefile '$SRC' create" > /dev/stderr; exit 1; }
+fi
+
+if [ ! -f $SRC ]; then
+    echo "FAIL: Sourcefile '$SRC' not found" > /dev/stderr; exit 1
+fi
+
+if [ "x$XFAIL" != "xXFAIL" ]; then
+    if ping -n -c5 $TARGET > /dev/null ; then
+	echo "INFO:<$$: $TARGET is up>" > /dev/stderr
+    else
+	echo "FAIL:<$$: $TARGET is down>" > /dev/stderr; exit 1
+    fi
+fi
+
+declare -i COUNT=0
+
+# Just put the file without checking the data; the get test tests that.
+while [ $SECONDS -le $TIMEOUT ]; do
+tftp $TARGET  <<-EOF
+	rexmt 1
+	binary
+	put $SRC $TMP
+EOF
+((COUNT++));
+done
+
+if [ "x$XFAIL" == "xXFAIL" ]; then
+    echo "PASS:<$$: tftp put XFAIL, $TIMEOUT seconds $SIZE bytes $COUNT tries>" > /dev/stderr
+    exit 0
+fi
+
+# Verify it once at the end.
+rm -f $TMP
+tftp $TARGET  <<-EOF
+	rexmt 1
+	binary
+	get $TMP $TMP
+EOF
+
+if [ ! -f $TMP ]; then
+    echo "FAIL:<$$: temp file $TMP nonexistent $COUNT xfers>" > /dev/stderr
+    exit 1
+fi
+
+if ! cmp -s $SRC $TMP; then
+    echo "FAIL:<$$: temp file $TMP corrupt $COUNT xfers>" > /dev/stderr
+    exit 1
+fi
+
+echo "PASS:<$$: tftp put OK, $TIMEOUT seconds $SIZE bytes $COUNT xfers>" > /dev/stderr
+
+# EOF
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/host/tmpfile.c
@@ -0,0 +1,144 @@
+//==========================================================================
+//
+//      tmpfile.c
+//
+//      Make a temporary data file for test purposes
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt
+// Contributors: hmt
+// Date:         2000-10-23
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <stdio.h>
+#include <errno.h>
+
+int main( int argc, char **argv )
+{
+    FILE *f;
+    int i;
+    unsigned int size, iirandom, z, csum;
+    char sizec, scratchc;
+
+    if ( 3 > argc || 4 < argc) {
+    usage:
+        fprintf( stderr, "usage: %s filename length [seed]\n", argv[0] );
+        exit(1);
+    } 
+
+    f = fopen( argv[1], "rb" );
+    if ( f ) {
+        fclose( f );
+        fprintf( stderr, "File %s already exists\n", argv[1] );
+        goto usage;
+    }
+
+    i = sscanf( argv[2], "%u%1c%1c", &size, &sizec, &scratchc );
+    if ( 0 >= i || 2 < i )
+        goto usage;
+
+    if ( 2 == i ) 
+        switch ( sizec ) {
+        case 'G': size *= 1024;
+        case 'M': size *= 1024;
+        case 'k': size *= 1024;
+            break;
+        case 'b': size *= 512;
+            break;
+        default:
+            goto usage;
+        }
+
+    iirandom = 0;
+    if ( 4 == argc ) {
+        i = sscanf( argv[3], "%u%1c", &iirandom, &scratchc );
+        if ( 0 >= i || 1 < i )
+            goto usage;
+    }
+
+    f = fopen( argv[1], "wb" );
+    if ( !f ) {
+        perror( "fopen [create]" );
+        goto usage;
+    }
+
+    csum = 0;
+    iirandom += 0x23164920; // What date said
+
+    if ( size > 4 ) i = size-4; else i = size;
+
+    for ( /* i */ ; i > 0; i-- ) {
+        iirandom = iirandom * 91 + 137;
+        iirandom ^= iirandom >> 14 | iirandom << 7;
+        z = (i ^ iirandom) & 0xff;
+        // Keep a simple checksum in case we make some trick to check it in
+        // the pretend filesystem.
+        csum += z;
+        csum = (csum >> (z & 31)) ^ (csum << (32 - (z & 31)));
+        if ( 0 > putc( z, f ) ) {
+            perror( "putc" );
+            fclose( f );
+            exit( 1 );
+        }
+    }
+    // And bung the checksum on the end.
+    for ( i = 4 ; i < size && i > 0; i-- ) {
+        z = csum & 0xff;
+        csum >>= 8;
+        if ( 0 > putc( z, f ) ) {
+            perror( "putc" );
+            fclose( f );
+            exit( 1 );
+        }
+    }
+    fclose( f );
+    exit( 0 );
+}
+
+// EOF awaitorder.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/permtests/netauto_bootp.ptest
@@ -0,0 +1,13 @@
+
+# add the net and the net drivers
+pkgconf -disable-uitron -enable-net -enable-net_drivers -enable-autotest
+
+# asserts on
+header infra.h {
+	enable CYGPKG_INFRA_DEBUG
+}
+
+# no DHCP, just bootp
+header net.h {
+	disable CYGPKG_NET_DHCP
+}
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/permtests/netauto_corrupt.ptest
@@ -0,0 +1,19 @@
+
+# add the net and the net drivers, and the SNMP parts
+pkgconf -disable-uitron -enable-net -enable-net_drivers -enable-snmplib -enable-snmpagent -enable-autotest
+
+# larger heap for SNMP to run?  Not needed any more.
+
+# asserts on
+header infra.h {
+        enable CYGPKG_INFRA_DEBUG
+}
+
+# Simulated failures on:
+header io_eth_drivers.h {
+	enable CYGPKG_IO_ETH_DRIVERS_SIMULATED_FAILURES
+	disable CYGPKG_IO_ETH_DRIVERS_SIMULATE_DROP_RX      
+	value CYGPKG_IO_ETH_DRIVERS_SIMULATE_CORRUPT_RX  10
+	disable CYGPKG_IO_ETH_DRIVERS_SIMULATE_DROP_TX	  
+	disable CYGPKG_IO_ETH_DRIVERS_SIMULATE_LINE_CUT
+}
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/permtests/netauto_failrx.ptest
@@ -0,0 +1,19 @@
+
+# add the net and the net drivers, and the SNMP parts
+pkgconf -disable-uitron -enable-net -enable-net_drivers -enable-snmplib -enable-snmpagent -enable-autotest
+
+# larger heap for SNMP to run?  Not needed any more.
+
+# asserts on
+header infra.h {
+        enable CYGPKG_INFRA_DEBUG
+}
+
+# Simulated failures on:
+header io_eth_drivers.h {
+	enable CYGPKG_IO_ETH_DRIVERS_SIMULATED_FAILURES
+	value   CYGPKG_IO_ETH_DRIVERS_SIMULATE_DROP_RX    10   
+	disable CYGPKG_IO_ETH_DRIVERS_SIMULATE_CORRUPT_RX
+	disable CYGPKG_IO_ETH_DRIVERS_SIMULATE_DROP_TX	  
+	disable CYGPKG_IO_ETH_DRIVERS_SIMULATE_LINE_CUT
+}
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/permtests/netauto_failtx.ptest
@@ -0,0 +1,19 @@
+
+# add the net and the net drivers, and the SNMP parts
+pkgconf -disable-uitron -enable-net -enable-net_drivers -enable-snmplib -enable-snmpagent -enable-autotest
+
+# larger heap for SNMP to run?  Not needed any more.
+
+# asserts on
+header infra.h {
+        enable CYGPKG_INFRA_DEBUG
+}
+
+# Simulated failures on:
+header io_eth_drivers.h {
+	enable CYGPKG_IO_ETH_DRIVERS_SIMULATED_FAILURES
+	disable CYGPKG_IO_ETH_DRIVERS_SIMULATE_DROP_RX      
+	disable CYGPKG_IO_ETH_DRIVERS_SIMULATE_CORRUPT_RX
+	value   CYGPKG_IO_ETH_DRIVERS_SIMULATE_DROP_TX	 10 
+	disable CYGPKG_IO_ETH_DRIVERS_SIMULATE_LINE_CUT
+}
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/permtests/netauto_rt.ptest
@@ -0,0 +1,13 @@
+
+# add the net and the net drivers, and the SNMP parts
+pkgconf -disable-uitron -enable-net -enable-net_drivers -enable-snmplib -enable-snmpagent -enable-autotest
+
+# larger heap for SNMP to run?  Not needed any more.
+
+# use the RealTime test harness, and two loopback interfaces
+header net.h {
+	enable CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS
+	value  CYGPKG_NET_NLOOP 2
+}
+
+
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/permtests/netauto_snmp.ptest
@@ -0,0 +1,11 @@
+
+# add the net and the net drivers, and the SNMP parts
+pkgconf -disable-uitron -enable-net -enable-net_drivers -enable-snmplib -enable-snmpagent -enable-autotest
+
+# larger heap for SNMP to run?  Not needed any more.
+
+# asserts on
+header infra.h {
+        enable CYGPKG_INFRA_DEBUG
+}
+
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/permtests/netauto_std.ptest
@@ -0,0 +1,10 @@
+
+# add the net and the net drivers
+pkgconf -disable-uitron -enable-net -enable-net_drivers -enable-autotest
+
+
+# asserts on
+header infra.h {
+        enable CYGPKG_INFRA_DEBUG
+}
+
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/autohost.inl
@@ -0,0 +1,367 @@
+//==========================================================================
+//
+//      tests/auto/autohost.inl
+//
+//      Automated Testing by a Host Computer
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-18
+// Purpose:      Automated testing of the eCos TCP/IP Network Stack
+// Description:  
+
+//	This .inl file defines routines which send /orders/ to the server
+//	running on the host machine who served us DHCP, and receive
+//	/results/ from the same machine or machines.
+//
+//	autohost_tell() sends the order to an app "awaitorder" which feeds
+//	the order into obey.sh which obeys the order, for example, running
+//	some tftp sessions to exercise the tftp server.
+//
+//	The /orders/ must come from a predefined list, to match the
+//	selection which obey.sh is expecting, for example "TFTP_SERV_GET"
+//	which has further parameters <target> <timeout>.  Additional
+//	parameters are added/manipulated by obey.sh which then invokes a
+//	relevent script (tftpget.sh) to do the test.
+//
+//	The test script's output is returned to us, and is collected by
+//	autohost_getresults() which runs in a high-ist prio thread.  It
+//	prints the output, which is expected to match the traditional eCos
+//	PASS:<happy> FAIL:<eek!> sort of format, so that the test farm can
+//	collect these messages from the testcase output, without any direct
+//	connection to the server.
+//
+//	autohost_init() simply starts the autohost_getresults() thread.
+//
+//	The predefined list of orders is *not* defined here or anywhere
+//	else besides obey.sh which does a switch statement for them, to
+//	make it easier to extent; similarly the params each order takes are
+//	not centrally recorded either.  It is however a convention that the
+//	word following the /order/ is our own IP address.
+//
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include "memcheck.inl"                 // check on memory usage
+
+externC int sprintf( char * /* str */, const char * /* format */, ... );
+
+// ------------------------------------------------------------------------
+
+#include <pkgconf/system.h>
+#ifdef CYGPKG_IO_ETH_DRIVERS
+#include <pkgconf/io_eth_drivers.h>
+#endif
+
+#if defined(XFAIL) || defined(XPASS)
+// So that the test can override this automation
+# if defined(XFAIL) && defined(XPASS)
+#  error Both XFAIL and XPASS predefined
+# endif
+# undef XFAIL
+# ifndef XPASS
+#  define XFAIL "XFAIL"
+# endif
+#else
+# ifdef CYGPKG_IO_ETH_DRIVERS_SIMULATED_FAILURES
+// Then we must tell the test server to expect failures.
+#  define XFAIL "XFAIL"
+# endif
+#endif // XFAIL/XPASS not predefined
+
+// ------------------------------------------------------------------------
+
+void
+pexit(char *s)
+{
+    TNR_OFF();
+    CYG_TEST_FAIL_EXIT( s );
+}
+
+// ------------------------------------------------------------------------
+
+#define SOURCE_PORT 9980
+#define RESULT_PORT 9990
+
+static int
+autohost_tell( struct bootp *bp, char *orders )
+{
+    int s_host;
+    struct sockaddr_in slave, local;
+    int one = 1;
+    int len = strlen( orders );
+    char ack[32];
+    int ret;
+
+    char complete_order[256];
+
+    if ( len > 240 )
+        pexit( "Orders too long" );
+
+    memset(&slave, 0, sizeof(slave));
+    slave.sin_family = AF_INET;
+    slave.sin_len = sizeof(slave);
+    slave.sin_port = htons(SOURCE_PORT);
+    slave.sin_addr = bp->bp_siaddr; // Talk to our DHCP server
+
+    s_host = socket(AF_INET, SOCK_STREAM, 0);
+    if (s_host < 0) {
+        pexit("stream socket");
+    }
+
+    memset(&local, 0, sizeof(local));
+    local.sin_family = AF_INET;
+    local.sin_len = sizeof(local);
+    local.sin_port = INADDR_ANY;
+    local.sin_addr.s_addr = INADDR_ANY;
+    if(bind(s_host, (struct sockaddr *) &local, sizeof(local)) < 0) {
+        pexit("bind /source/ error");
+   }
+    if (setsockopt(s_host, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))) {
+        pexit("setsockopt /source/ SO_REUSEADDR");
+    }
+
+    ret = connect(s_host, (struct sockaddr *)&slave, sizeof(slave));
+    if ( ret < 0) {
+        TNR_OFF();
+        diag_printf(
+            "Connect failed %d err %d, s_host %d, sin_port %x, sin_addr %08x\n", 
+                    ret, errno, s_host, slave.sin_port, slave.sin_addr.s_addr );
+        pexit("Can't connect to target");
+    }
+
+    sprintf( complete_order,
+#ifdef XFAIL
+             "%s %s", XFAIL,
+#else
+             "%s",
+#endif
+             orders );
+    len = 1 + strlen( complete_order ); // Send the null also
+
+    if ( len != write(s_host, (unsigned char *)complete_order, len ) ) {
+        pexit("Can't send orders");
+    }
+    ret = read(s_host, (unsigned char *)&ack, sizeof(ack));
+    if ( 0 >= ret ) {
+        pexit("Can't get ACK");
+    }
+    close(s_host);
+    return 1;
+}
+
+// ---------------------------------------------------------------------------
+
+#define nHALTAFTERFAIL
+#ifdef HALTAFTERFAIL
+static cyg_alarm ahr_fail_alarm;
+static cyg_handle_t ahr_fail_alarm_handle = 0;
+static cyg_alarm_t ahr_fail_alarm_function;
+
+void ahr_fail_alarm_function(cyg_handle_t alarm, cyg_addrword_t data)
+{
+    CYG_TEST_FAIL_EXIT( "Failure reported by autohost" );
+}
+#endif
+
+static int result_passes = 0;
+static int result_fails  = 0;
+
+static void
+autohost_getresults( cyg_addrword_t loop )
+{
+    int s_source, e_source;
+    struct sockaddr_in e_source_addr, local;
+    int one = 1;
+    int len;
+    char result[256];
+
+    s_source = socket(AF_INET, SOCK_STREAM, 6 /* TCP */ );
+    if (s_source < 0) {
+        pexit("stream socket");
+    }
+
+    memset(&local, 0, sizeof(local));
+    local.sin_family = AF_INET;
+    local.sin_len = sizeof(local);
+    local.sin_port = ntohs(RESULT_PORT);
+    local.sin_addr.s_addr = INADDR_ANY;
+    if(bind(s_source, (struct sockaddr *) &local, sizeof(local)) < 0) {
+        pexit("bind /source/ error");
+    }
+    if (setsockopt(s_source, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))) {
+        pexit("setsockopt /source/ SO_REUSEADDR");
+    }
+#ifdef SO_REUSEPORT
+    if (setsockopt(s_source, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one))) {
+        pexit("setsockopt /source/ SO_REUSEPORT");
+    }
+#endif
+
+    listen(s_source, SOMAXCONN);
+
+    do {
+        len = sizeof(e_source_addr);
+        if ((e_source = accept(s_source,
+                 (struct sockaddr *)&e_source_addr, &len)) < 0) {
+            pexit("accept /source/");
+        }
+        
+        // Wait for "source" to tell us the result
+        if ( 0 >= (len = read(e_source, result, sizeof(result)))) {
+            pexit("Can't read result");
+        }
+
+        result[len] = 0;
+        len--;
+        while( len && ('\r' == result[len] || '\n' == result[len]) )
+            result[len--] = 0;
+
+        TNR_OFF();
+        diag_printf( "%s (from %s:%d)\n", result,
+           inet_ntoa(e_source_addr.sin_addr), ntohs(e_source_addr.sin_port));
+        TNR_ON();
+
+        // Check for a pass message right now:
+        if ( 'P' == result[0] &&
+             'A' == result[1] &&
+             'S' == result[2] &&
+             'S' == result[3] ) {
+            result_passes++;
+        }
+        else
+        // Check for a failure right now:
+        if ( 'F' == result[0] &&
+             'A' == result[1] &&
+             'I' == result[2] &&
+             'L' == result[3] ) {
+            result_fails++;
+#ifdef HALTAFTERFAIL
+            // Wait a bit for the others, if any, to come in before halting
+            // the test, since the host is typically running multiple
+            // threads to torment us.  Set an alarm to go FAIL_EXIT in 20S.
+            if ( ! ahr_fail_alarm_handle ) {
+                cyg_handle_t h;
+                cyg_clock_to_counter(cyg_real_time_clock(), &h),
+                cyg_alarm_create(
+                    h,                       /* Attached to this ctr */
+                    ahr_fail_alarm_function, /* Call-back function   */
+                    0,                       /* Call-back data       */
+                    &ahr_fail_alarm_handle,  /* Returned alarm obj   */
+                    &ahr_fail_alarm          /* put alarm here       */
+                    );
+                cyg_alarm_initialize(
+                    ahr_fail_alarm_handle,
+                    cyg_current_time() + (20 * 100),
+                    0 );
+                cyg_alarm_enable( ahr_fail_alarm_handle );
+            }
+#endif
+        }
+
+        close( e_source );
+    } while ( loop );
+
+    close( s_source );
+}
+
+// ---------------------------------------------------------------------------
+
+static void autohost_end( int expected_passes )
+{
+#ifdef HALTAFTERFAIL
+    if ( ahr_fail_alarm_handle )
+        cyg_alarm_disable( ahr_fail_alarm_handle );
+#endif
+#ifdef XFAIL
+    if ( ! (result_passes >= expected_passes) )
+        CYG_TEST_INFO( "XFAIL: Not enough PASS results posted" );
+    if ( ! (0 == result_fails) )
+        CYG_TEST_INFO( "XFAIL: FAIL results posted" );
+    if ( ! (result_passes >= expected_passes && 0 == result_fails) )
+        CYG_TEST_PASS( "XFAIL: Pass anyway" );
+#else
+    CYG_TEST_CHECK( result_passes >= expected_passes,
+                    "Not enough PASS results posted" );
+    CYG_TEST_CHECK( 0 == result_fails,
+                    "FAIL results posted" );
+#endif
+    if ( result_passes >= expected_passes && 0 == result_fails )
+        CYG_TEST_PASS( "Results from host[s] OK" );
+
+    // Record and check final state of net stack memory consumption
+    memcheck_final();
+}
+
+// ---------------------------------------------------------------------------
+
+static char ahr_stack[ CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x400 ];
+static cyg_thread ahr_thread_data;
+
+static void autohost_init( void )
+{
+    cyg_handle_t ahr_thread_handle;
+    cyg_thread_create(    5,            // Priority - just a number
+           autohost_getresults,         // entry
+           1,                           // entry parameter
+           "Autohost result monitor",   // Name
+           &ahr_stack[0],               // Stack
+           sizeof(ahr_stack),           // Size
+           &ahr_thread_handle,          // Handle
+           &ahr_thread_data             // Thread data structure
+        );
+    cyg_thread_resume(ahr_thread_handle);  // Start it
+
+    // Record initial state of net stack memory consumption
+    memcheck_init();
+}
+
+// EOF autohost.inl
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/floodping.c
@@ -0,0 +1,183 @@
+//==========================================================================
+//
+//      autotest/current/tests/floodping.c
+//
+//      Flood pinging test, the server floods me and little else.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-23
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#ifdef CYGBLD_DEVS_ETH_DEVICE_H    // Get the device config if it exists
+#include CYGBLD_DEVS_ETH_DEVICE_H  // May provide CYGTST_DEVS_ETH_TEST_NET_REALTIME
+#endif
+
+#ifdef CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS // do we use the rt test?
+# ifdef CYGTST_DEVS_ETH_TEST_NET_REALTIME // Get the test ancilla if it exists
+#  include CYGTST_DEVS_ETH_TEST_NET_REALTIME
+# endif
+#endif
+
+
+// Fill in the blanks if necessary
+#ifndef TNR_OFF
+# define TNR_OFF()
+#endif
+#ifndef TNR_ON
+# define TNR_ON()
+#endif
+#ifndef TNR_INIT
+# define TNR_INIT()
+#endif
+#ifndef TNR_PRINT_ACTIVITY
+# define TNR_PRINT_ACTIVITY()
+#endif
+
+// ------------------------------------------------------------------------
+
+#include <errno.h>
+#include <network.h>
+
+#include "autohost.inl"
+
+#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x10000)
+static char stack[STACK_SIZE];
+static cyg_thread thread_data;
+static cyg_handle_t thread_handle;
+
+static void
+do_ping_tests(struct bootp *bp, int testtime, int filesize)
+{
+    char order[256];
+    diag_printf( "INFO: telling %s to run 1 flood ping for %d seconds, %d bytes\n",
+          inet_ntoa(bp->bp_siaddr), testtime, filesize );
+
+    sprintf( order, "%s %s %d %d", "FLOOD_PING",
+             inet_ntoa(bp->bp_yiaddr),
+             testtime,
+             filesize );
+    autohost_tell( bp, order );
+}
+
+#define TESTTIME (5 * 60) // Seconds
+
+void
+net_test(cyg_addrword_t param)
+{
+    CYG_TEST_INIT();
+    CYG_TEST_INFO("Start PING server test");
+    init_all_network_interfaces();
+
+    autohost_init();
+
+    TNR_INIT();
+    
+    // Now command the host to do ping to us...
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up) {
+        do_ping_tests(&eth0_bootp_data, TESTTIME, 56);
+    }
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up) {
+        do_ping_tests(&eth1_bootp_data, TESTTIME, 56);
+    }
+#endif
+
+    // Let the server run for 5 minutes
+    cyg_thread_delay(2*100); // let the stuff start up first
+    TNR_ON();
+    cyg_thread_delay(TESTTIME*100); // FIXME - assume cS clock.
+    // Additional delay 'cos host may be slower than us - and it has to
+    // complete a transfer anyway:
+    cyg_thread_delay(  30    *100); // FIXME - assume cS clock.
+    TNR_OFF();
+
+    autohost_end( 0
+#ifdef CYGHWR_NET_DRIVER_ETH0
+                  + eth0_up
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+                  + eth1_up
+#endif
+        ); // check for 2 pass messages from hosts
+
+    TNR_PRINT_ACTIVITY();
+    CYG_TEST_EXIT("Done");
+}
+
+void
+cyg_start(void)
+{
+    // Create a main thread, so we can run the scheduler and have time 'pass'
+    cyg_thread_create(10,                // Priority - just a number
+                      net_test,          // entry
+                      0,                 // entry parameter
+                      "Network test",    // Name
+                      &stack[0],         // Stack
+                      STACK_SIZE,        // Size
+                      &thread_handle,    // Handle
+                      &thread_data       // Thread data structure
+            );
+    cyg_thread_resume(thread_handle);  // Start it
+    cyg_scheduler_start();
+}
+
+// EOF floodping.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/floodpingmux.c
@@ -0,0 +1,466 @@
+//==========================================================================
+//
+//      autotest/current/tests/floodpingmux.c
+//
+//      Flood pinging test, the server floods me and I flood hir.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-23
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#ifdef CYGBLD_DEVS_ETH_DEVICE_H    // Get the device config if it exists
+#include CYGBLD_DEVS_ETH_DEVICE_H  // May provide CYGTST_DEVS_ETH_TEST_NET_REALTIME
+#endif
+
+#ifdef CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS // do we use the rt test?
+# ifdef CYGTST_DEVS_ETH_TEST_NET_REALTIME // Get the test ancilla if it exists
+#  include CYGTST_DEVS_ETH_TEST_NET_REALTIME
+# endif
+#endif
+
+
+// Fill in the blanks if necessary
+#ifndef TNR_OFF
+# define TNR_OFF()
+#endif
+#ifndef TNR_ON
+# define TNR_ON()
+#endif
+#ifndef TNR_INIT
+# define TNR_INIT()
+#endif
+#ifndef TNR_PRINT_ACTIVITY
+# define TNR_PRINT_ACTIVITY()
+#endif
+
+// ------------------------------------------------------------------------
+
+#include <errno.h>
+#include <network.h>
+
+#define MAX_PACKET 4096
+
+#define NUMTHREADS 3
+#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + MAX_PACKET + MAX_PACKET + 0x1000)
+static char thread_stack[NUMTHREADS][STACK_SIZE];
+static cyg_thread thread_data[NUMTHREADS];
+static cyg_handle_t thread_handle[NUMTHREADS];
+
+#define DO_DUMPSTATS( seq ) (0 == (0xffff & seq))
+
+#ifdef CYGHWR_NET_DRIVER_ETH0
+struct sockaddr_in host0;
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+struct sockaddr_in host1;
+#endif
+static int sock;
+
+static int uniqueid[3] = { 0x1234, 0x4321, 0xdead };
+
+static int ok_recv[3] = { 0,0,0 };
+static int bogus_recv[3] = { 0,0,0 };
+static int pings_sent[3] = { 0,0,0 };
+
+// ------------------------------------------------------------------------
+static void dumpstats(void)
+{
+    TNR_OFF();
+    diag_printf( "------------------------\n" );
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up) {
+        diag_printf("%16s: Sent %d packets, received %d OK, %d bad\n",
+                    inet_ntoa(host0.sin_addr), pings_sent[0],
+                    ok_recv[0], bogus_recv[0]);
+    }
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up) {
+        diag_printf("%16s: Sent %d packets, received %d OK, %d bad\n",
+                    inet_ntoa(host1.sin_addr), pings_sent[1],
+                    ok_recv[1], bogus_recv[1]);
+    }
+#endif
+    if ( pings_sent[2] )
+        diag_printf("Wierd!  %d unknown sends!\n", pings_sent[2] );
+    if ( ok_recv[2] )
+        diag_printf("Wierd!  %d unknown good recvs!\n", ok_recv[2] );
+    if ( bogus_recv[2] )
+        diag_printf("Wierd!  %d unknown bogus recvs!\n", bogus_recv[2] );
+    diag_printf( "------------------------\n" );
+    TNR_ON();
+}
+
+
+// ------------------------------------------------------------------------
+// Compute INET checksum
+int
+inet_cksum(u_short *addr, int len)
+{
+    register int nleft = len;
+    register u_short *w = addr;
+    register u_short answer;
+    register u_int sum = 0;
+    u_short odd_byte = 0;
+
+    /*
+     *  Our algorithm is simple, using a 32 bit accumulator (sum),
+     *  we add sequential 16 bit words to it, and at the end, fold
+     *  back all the carry bits from the top 16 bits into the lower
+     *  16 bits.
+     */
+    while( nleft > 1 )  {
+        sum += *w++;
+        nleft -= 2;
+    }
+
+    /* mop up an odd byte, if necessary */
+    if( nleft == 1 ) {
+        *(u_char *)(&odd_byte) = *(u_char *)w;
+        sum += odd_byte;
+    }
+
+    /*
+     * add back carry outs from top 16 bits to low 16 bits
+     */
+    sum = (sum >> 16) + (sum & 0x0000ffff); /* add hi 16 to low 16 */
+    sum += (sum >> 16);                     /* add carry */
+    answer = ~sum;                          /* truncate to 16 bits */
+    return (answer);
+}
+
+// ------------------------------------------------------------------------
+static void
+show_icmp(unsigned char *pkt, int len, struct sockaddr_in *from)
+{
+    cyg_tick_count_t *tp, tv;
+    struct ip *ip;
+    struct icmp *icmp;
+    int which = 2;
+    tv = cyg_current_time();
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up && (from->sin_addr.s_addr == host0.sin_addr.s_addr) )
+        which = 0;
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up && (from->sin_addr.s_addr == host1.sin_addr.s_addr) )
+        which = 1;
+#endif
+
+    ip = (struct ip *)pkt;
+    if ((len < sizeof(*ip)) || ip->ip_v != IPVERSION) {
+        TNR_OFF();
+        diag_printf("%s: Short packet or not IP! - Len: %d, Version: %d\n", 
+                    inet_ntoa(from->sin_addr), len, ip->ip_v);
+        TNR_ON();
+        bogus_recv[which]++;
+        return;
+    }
+    icmp = (struct icmp *)(pkt + sizeof(*ip));
+    len -= (sizeof(*ip) + 8);
+    tp = (cyg_tick_count_t *)&icmp->icmp_data;
+    if (icmp->icmp_type != ICMP_ECHOREPLY) { 
+        TNR_OFF();
+        diag_printf("%s: Invalid ICMP - type: %d\n", 
+                    inet_ntoa(from->sin_addr), icmp->icmp_type);
+        TNR_ON();
+        bogus_recv[which]++;
+        return;
+    }
+    ok_recv[which]++;
+    if (icmp->icmp_id != uniqueid[which]) {
+        TNR_OFF();
+        diag_printf("%s: ICMP received for wrong id - sent: %x, recvd: %x\n", 
+                    inet_ntoa(from->sin_addr), uniqueid[which], icmp->icmp_id);
+        TNR_ON();
+    }
+//    diag_printf("%d bytes from %s: ", len, inet_ntoa(from->sin_addr));
+//    diag_printf("icmp_seq=%d", icmp->icmp_seq);
+//    diag_printf(", time=%dms\n", (int)(tv - *tp)*10);
+}
+
+// ------------------------------------------------------------------------
+static void
+floodrecv(cyg_addrword_t p)
+{
+    unsigned char pkt[MAX_PACKET];
+    struct sockaddr_in from;
+    int len, fromlen;
+
+    diag_printf("PING listener...\n" );
+    for (;;) {
+        // Wait for a response
+        fromlen = sizeof(from);
+        len = recvfrom(sock, pkt, sizeof(pkt), 0,
+                       (struct sockaddr *)&from, &fromlen);
+        if (len < 0)
+            perror("recvfrom");
+        else
+            show_icmp(pkt, len, &from);
+    }
+}
+
+// ------------------------------------------------------------------------
+static void
+pingsend( int seq, struct sockaddr_in *host,
+          struct icmp *icmp, int icmp_len, int which )
+{
+    cyg_tick_count_t *tp;
+    long *dp;
+    int i;
+    // Build ICMP packet for interface
+    icmp->icmp_type = ICMP_ECHO;
+    icmp->icmp_code = 0;
+    icmp->icmp_cksum = 0;
+    icmp->icmp_seq = seq;
+    icmp->icmp_id = uniqueid[which];
+    // Set up ping data
+    tp = (cyg_tick_count_t *)&icmp->icmp_data;
+    *tp++ = cyg_current_time();
+    dp = (long *)tp;
+    for (i = sizeof(*tp);  i < icmp_len;  i += sizeof(*dp))
+        *dp++ = i;
+
+    // Add checksum
+    icmp->icmp_cksum = inet_cksum( (u_short *)icmp, icmp_len+8);
+    // Send it off
+    if (sendto(sock, icmp, icmp_len+8, MSG_DONTWAIT,
+              (struct sockaddr *)host, sizeof(*host)) < 0) {
+        perror("sendto");
+    }
+    pings_sent[which]++;
+}
+
+// ------------------------------------------------------------------------
+static void
+floodsend(cyg_addrword_t param)
+{
+    unsigned char pkt0[MAX_PACKET], pkt1[MAX_PACKET];
+
+    struct icmp *icmp0 = (struct icmp *)pkt0;
+    struct icmp *icmp1 = (struct icmp *)pkt1;
+
+    int icmp_len = 64;
+    int seq;
+
+    for (seq = 0; 1 ; seq++) {
+        if ( DO_DUMPSTATS( seq ) )
+            dumpstats();
+
+#ifdef CYGHWR_NET_DRIVER_ETH0
+        if (eth0_up)
+            pingsend( seq, &host0, icmp0, icmp_len, 0 );
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+        if (eth1_up)
+            pingsend( seq, &host1, icmp1, icmp_len, 1 );
+#endif
+    }
+}
+
+
+// ------------------------------------------------------------------------
+
+#include "autohost.inl"
+
+static void
+do_ping_tests(struct bootp *bp, int testtime, int filesize)
+{
+    char order[256];
+    diag_printf( "INFO: telling %s to run 1 flood ping for %d seconds, %d bytes\n",
+          inet_ntoa(bp->bp_siaddr), testtime, filesize );
+
+    sprintf( order, "%s %s %d %d", "FLOOD_PING",
+             inet_ntoa(bp->bp_yiaddr),
+             testtime,
+             filesize );
+    autohost_tell( bp, order );
+}
+
+// ------------------------------------------------------------------------
+
+#define TESTTIME (5 * 60) // Seconds
+
+void
+net_test(cyg_addrword_t param)
+{
+    struct protoent *p;
+
+    diag_printf("Start Flood PING test\n");
+    init_all_network_interfaces();
+    diag_printf("Interfaces up:\n");
+
+    if ((p = getprotobyname("icmp")) == (struct protoent *)0) {
+        perror("getprotobyname");
+        return;
+    }
+    sock = socket(AF_INET, SOCK_RAW, p->p_proto);
+    if (sock < 0) {
+        perror("tx socket");
+        return;
+    }
+
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up) {
+        host0.sin_family = AF_INET;
+        host0.sin_len = sizeof(host0);
+        host0.sin_addr = eth0_bootp_data.bp_siaddr;
+        host0.sin_port = 0;
+        diag_printf("PING server %16s\n", inet_ntoa(host0.sin_addr));
+    }
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up) {
+        host1.sin_family = AF_INET;
+        host1.sin_len = sizeof(host1);
+        host1.sin_addr = eth1_bootp_data.bp_siaddr;
+        host1.sin_port = 0;
+        diag_printf("PING server %16s\n", inet_ntoa(host1.sin_addr));
+    }
+#endif
+    autohost_init();
+
+    TNR_INIT();
+    
+    // Now command the host to do ping to us...
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up) {
+        do_ping_tests(&eth0_bootp_data, TESTTIME, 56);
+    }
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up) {
+        do_ping_tests(&eth1_bootp_data, TESTTIME, 56);
+    }
+#endif
+
+    // And start the threads that make us ping them, and count the results
+    cyg_thread_resume(thread_handle[1]);
+    cyg_thread_resume(thread_handle[2]);
+
+    // Let the server run for 5 minutes
+    cyg_thread_delay(2*100); // let the stuff start up first
+    TNR_ON();
+    cyg_thread_delay(TESTTIME*100); // FIXME - assume cS clock.
+
+    // Stop the threads that make us ping them.  Thread [2] is the pinger,
+    // thread [1] the receiver so that might as well continue.
+    cyg_thread_suspend(thread_handle[2]);
+
+    // Additional delay 'cos host may be slower than us - and it has to
+    // complete a transfer anyway:
+    cyg_thread_delay(  30    *100); // FIXME - assume cS clock.
+    TNR_OFF();
+
+    autohost_end( 0
+#ifdef CYGHWR_NET_DRIVER_ETH0
+                  + eth0_up
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+                  + eth1_up
+#endif
+        ); // check for 2 pass messages from hosts
+
+    diag_printf("After running:\n");
+    dumpstats();
+    TNR_OFF(); // dumpstats() turned it on again!
+    TNR_PRINT_ACTIVITY();
+    CYG_TEST_EXIT("Done");
+}
+
+void
+cyg_start(void)
+{
+    // Create a main thread, so we can run the scheduler and have time 'pass'
+    cyg_thread_create(10,                // Priority - just a number
+                      net_test,          // entry
+                      0,                 // entry parameter
+                      "Network test",    // Name
+                     &thread_stack[0][0], // Stack
+                      STACK_SIZE,        // Size
+                      &thread_handle[0], // Handle
+                      &thread_data[0]    // Thread data structure
+            );
+    cyg_thread_resume(thread_handle[0]);  // Start it
+
+    // Create the secondary threads
+    cyg_thread_create(11,                // Priority - just a number
+                      floodrecv,         // entry
+                      0,                 // entry parameter
+                      "Flood Ping Recv", // Name
+                     &thread_stack[1][0], // Stack
+                      STACK_SIZE,        // Size
+                      &thread_handle[1], // Handle
+                      &thread_data[1]    // Thread data structure
+            );
+    cyg_thread_create(12,                // Priority - just a number
+                      floodsend,         // entry
+                      0,                 // entry parameter
+                      "Flood Ping Send", // Name
+                     &thread_stack[2][0], // Stack
+                      STACK_SIZE,        // Size
+                      &thread_handle[2], // Handle
+                      &thread_data[2]    // Thread data structure
+            );
+
+    cyg_scheduler_start();
+}
+
+// EOF floodpingmux.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/memcheck.inl
@@ -0,0 +1,132 @@
+//==========================================================================
+//
+//      tests/auto/memcheck.inl
+//
+//      Automated Testing by a Host Computer
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt
+// Contributors: hmt
+// Date:         2000-11-10
+// Purpose:      Check memory usage of the eCos TCP/IP Network Stack
+// Description:  
+
+#ifndef CYG_NET_GET_MEM_STATS_MISC
+// API is not present, so dummies:
+void memcheck_init( void )  {}
+void memcheck_final( void ) {}
+#else
+
+#include <sys/mbuf.h>
+extern struct  mbstat mbstat;
+
+extern void cyg_kmem_print_stats( void );
+
+cyg_mempool_info initial[3], final[3];
+
+#define RATIO 15
+
+static char *names[3] = { "Misc", "Mbufs", "Clusters" };
+
+void memcheck_init( void )
+{
+    int i;
+
+    cyg_kmem_print_stats();
+
+    for ( i = 0; i < 3; i++ )
+        if ( ! cyg_net_get_mem_stats( i, initial + i ) )
+            CYG_TEST_FAIL( "Getting initial mem stats" );
+}
+
+void memcheck_final( void )
+{
+    int i;
+    for ( i = 0; i < 3; i++ )
+        if ( ! cyg_net_get_mem_stats( i, final + i ) )
+            CYG_TEST_FAIL( "Getting final mem stats" );
+
+    cyg_kmem_print_stats();
+
+    // NB do NOT check clusters (index 2) because clusters are managed
+    // differently.
+    for ( i = 0; i < 3; i++ ) {
+        int size = final[i].totalmem;
+        int initial_used = size - initial[i].freemem;
+        int margin = size * RATIO / 100;
+        int final_used = size - final[i].freemem;
+        int extra_used = final_used - initial_used;
+
+        if ( 2 == i ) {
+#ifdef XFAIL
+            // ignore clusters if a faulty network is being simulated
+            // because memory gets eaten for partial packets awaiting
+            // reassembly.
+            continue; 
+#else            
+            // Then it's clusters - they're managed differently
+            final_used -= (mbstat.m_clfree * final[i].blocksize);
+            extra_used = final_used - initial_used;
+#endif
+        }
+
+        // Using up up to whatever was initially used -or- the percentage
+        // we test for; whichever is larger, is OK.
+        if ( (extra_used > initial_used) && (extra_used > margin) ) {
+            CYG_TEST_INFO( "Memory leak suspected" );
+            CYG_TEST_INFO( names[i] );
+            CYG_TEST_INFO( (final[i].blocksize > 0) ?
+                           "Variable mempool" : "Fixed mempool" );
+            CYG_TEST_FAIL( "Too much memory used - storeleak suspected" );
+        }
+    }
+}
+
+#undef RATIO
+
+#endif
+
+// EOF memcheck.inl
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/route_3.c
@@ -0,0 +1,76 @@
+//==========================================================================
+//
+//      autotest/current/tests/route_3.c
+//
+//      Simple pinging test, the server pings me and I ping her.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-23
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+// Check that we can be pinged by the host(s):
+#define DOHOSTPINGS
+
+// Add a route to net 10.0.3.x via eth0's server
+#define ADDROUTETONET_10_0_3_x
+
+// Add a route to net 10.0.4.x via eth1's server
+//#define ADDROUTETONET_10_0_4_x
+
+// Check the correct working of a global gateway:
+#define PING_WWW_CYGNUS_COM
+
+#include "routeping.inl"
+
+// EOF route_3.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/route_3_4.c
@@ -0,0 +1,76 @@
+//==========================================================================
+//
+//      autotest/current/tests/route_3_4.c
+//
+//      Simple pinging test, the server pings me and I ping her.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-23
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+// Check that we can be pinged by the host(s):
+#define DOHOSTPINGS
+
+// Add a route to net 10.0.3.x via eth0's server
+#define ADDROUTETONET_10_0_3_x
+
+// Add a route to net 10.0.4.x via eth1's server
+#define ADDROUTETONET_10_0_4_x
+
+// Check the correct working of a global gateway:
+#define PING_WWW_CYGNUS_COM
+
+#include "routeping.inl"
+
+// EOF route_3_4.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/route_4.c
@@ -0,0 +1,76 @@
+//==========================================================================
+//
+//      autotest/current/tests/route_4.c
+//
+//      Simple pinging test, the server pings me and I ping her.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-23
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+// Check that we can be pinged by the host(s):
+#define DOHOSTPINGS
+
+// Add a route to net 10.0.3.x via eth0's server
+//#define ADDROUTETONET_10_0_3_x
+
+// Add a route to net 10.0.4.x via eth1's server
+#define ADDROUTETONET_10_0_4_x
+
+// Check the correct working of a global gateway:
+#define PING_WWW_CYGNUS_COM
+
+#include "routeping.inl"
+
+// EOF route_4.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/route_none.c
@@ -0,0 +1,76 @@
+//==========================================================================
+//
+//      autotest/current/tests/route_none.c
+//
+//      Simple pinging test, the server pings me and I ping her.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-23
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+// Check that we can be pinged by the host(s):
+#define DOHOSTPINGS
+
+// Add a route to net 10.0.3.x via eth0's server
+//#define ADDROUTETONET_10_0_3_x
+
+// Add a route to net 10.0.4.x via eth1's server
+//#define ADDROUTETONET_10_0_4_x
+
+// Check the correct working of a global gateway:
+#define PING_WWW_CYGNUS_COM
+
+#include "routeping.inl"
+
+// EOF route_none.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/routeping.inl
@@ -0,0 +1,640 @@
+//==========================================================================
+//
+//      autotest/current/tests/routeping.inl
+//
+//      Simple pinging test, the server pings me and I ping her.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-23
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#ifdef CYGBLD_DEVS_ETH_DEVICE_H    // Get the device config if it exists
+#include CYGBLD_DEVS_ETH_DEVICE_H  // May provide CYGTST_DEVS_ETH_TEST_NET_REALTIME
+#endif
+
+#ifdef CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS // do we use the rt test?
+# ifdef CYGTST_DEVS_ETH_TEST_NET_REALTIME // Get the test ancilla if it exists
+#  include CYGTST_DEVS_ETH_TEST_NET_REALTIME
+# endif
+#endif
+
+
+// Fill in the blanks if necessary
+#ifndef TNR_OFF
+# define TNR_OFF()
+#endif
+#ifndef TNR_ON
+# define TNR_ON()
+#endif
+#ifndef TNR_INIT
+# define TNR_INIT()
+#endif
+#ifndef TNR_PRINT_ACTIVITY
+# define TNR_PRINT_ACTIVITY()
+#endif
+
+// ------------------------------------------------------------------------
+
+#include <errno.h>
+#include <network.h>
+
+#include "autohost.inl"
+
+// ------------------------------------------------------------------------
+
+externC int sscanf( char * /* str */, const char * /* format */, ... );
+
+// ------------------------------------------------------------------------
+
+static int route_add_s( struct sockaddr_in *target,
+                        struct sockaddr_in *gw,
+                        int maskbits,
+                        int metric )
+{
+    struct ecos_rtentry route;
+    struct sockaddr_in mask;
+
+    int s;
+
+    memcpy( &mask, gw, sizeof(*gw) );
+    maskbits--;
+    mask.sin_addr.s_addr = htonl( (0xfffffffful ^ ((0x80000000ul >> maskbits)-1)) );
+
+    memset( &route, 0, sizeof(route) );
+
+    memcpy( &route.rt_dst    ,  target, sizeof(*target) );
+    memcpy( &route.rt_gateway,  gw    , sizeof(*gw) );
+    memcpy( &route.rt_genmask, &mask  , sizeof(mask) ); 
+
+    route.rt_flags = RTF_UP|RTF_GATEWAY;
+    route.rt_metric = metric;
+
+    route.rt_dev = NULL;
+
+    diag_printf("INFO:<Route - dst: %s",
+                inet_ntoa(((struct sockaddr_in *)&route.rt_dst)->sin_addr));
+    diag_printf(", mask: %s",
+                inet_ntoa(((struct sockaddr_in *)&route.rt_genmask)->sin_addr));
+    diag_printf(", gateway: %s>\n",
+                inet_ntoa(((struct sockaddr_in *)&route.rt_gateway)->sin_addr));
+
+    s = socket( AF_INET, SOCK_DGRAM, 0 );
+    if (s < 0) {
+        perror( "socket" );
+        return false;
+    }
+    if (ioctl(s, SIOCADDRT, &route)) {
+        perror("SIOCADDRT");
+        close(s);
+        return false;
+    }
+    diag_printf( "PASS:<Route added OK>\n" );
+    close(s);
+    return true;
+}
+
+
+
+int route_add( char *target,
+                      char *gw,
+                      int maskbits,
+                      int metric )
+{
+    struct sockaddr_in t_s, gw_s;
+    int ints[4];
+
+    memset( &t_s,  0, sizeof(t_s)  );
+    memset( &gw_s, 0, sizeof(gw_s) );
+
+    t_s.sin_len    = gw_s.sin_len    = sizeof(t_s);
+    t_s.sin_family = gw_s.sin_family = AF_INET;
+
+    if ( 4 != sscanf( target, "%d.%d.%d.%d", ints, ints+1, ints+2, ints+3 ) )
+        CYG_TEST_FAIL( "sscanf of target IP addr" );
+    else
+        t_s.sin_addr.s_addr = htonl( 
+            (ints[0] << 24) |
+            (ints[1] << 16) |
+            (ints[2] <<  8) |
+            (ints[3]      )  );
+    
+    if ( 4 != sscanf( gw, "%d.%d.%d.%d", ints, ints+1, ints+2, ints+3 ) )
+        CYG_TEST_FAIL( "sscanf of target IP addr" );
+    else
+        gw_s.sin_addr.s_addr = htonl( 
+            (ints[0] << 24) |
+            (ints[1] << 16) |
+            (ints[2] <<  8) |
+            (ints[3]      )  );
+
+    return route_add_s( &t_s, &gw_s, maskbits, metric );
+}
+
+// ------------------------------------------------------------------------
+
+#define NUM_PINGS 16
+#define MAX_PACKET 4096
+#define MIN_PACKET   64
+#define MAX_SEND   4000
+
+#define PACKET_ADD  ((MAX_SEND - MIN_PACKET)/NUM_PINGS)
+#define nPACKET_ADD  1 
+
+static unsigned char pkt1[MAX_PACKET], pkt2[MAX_PACKET];
+
+#define UNIQUEID 0x1234
+
+// Compute INET checksum
+int
+inet_cksum(u_short *addr, int len)
+{
+    register int nleft = len;
+    register u_short *w = addr;
+    register u_short answer;
+    register u_int sum = 0;
+    u_short odd_byte = 0;
+
+    /*
+     *  Our algorithm is simple, using a 32 bit accumulator (sum),
+     *  we add sequential 16 bit words to it, and at the end, fold
+     *  back all the carry bits from the top 16 bits into the lower
+     *  16 bits.
+     */
+    while( nleft > 1 )  {
+        sum += *w++;
+        nleft -= 2;
+    }
+
+    /* mop up an odd byte, if necessary */
+    if( nleft == 1 ) {
+        *(u_char *)(&odd_byte) = *(u_char *)w;
+        sum += odd_byte;
+    }
+
+    /*
+     * add back carry outs from top 16 bits to low 16 bits
+     */
+    sum = (sum >> 16) + (sum & 0x0000ffff); /* add hi 16 to low 16 */
+    sum += (sum >> 16);                     /* add carry */
+    answer = ~sum;                          /* truncate to 16 bits */
+    return (answer);
+}
+
+static int
+errshorts, errinvalids, errbadids, errwronghosts, errsendtos, errrecvfroms;
+#define ERRRESET() \
+errshorts=errinvalids=errbadids=errwronghosts=errsendtos=errrecvfroms=0
+
+static int
+check_icmp(unsigned char *pkt, int len, 
+          struct sockaddr_in *from, struct sockaddr_in *to)
+{
+    cyg_tick_count_t *tp, tv;
+    struct ip *ip;
+    struct icmp *icmp;
+    tv = cyg_current_time();
+    ip = (struct ip *)pkt;
+    if (len < sizeof(*ip))
+        if (ip->ip_v != IPVERSION) {
+        errshorts++;
+        return 0;
+    }
+    icmp = (struct icmp *)(pkt + sizeof(*ip));
+    len -= (sizeof(*ip) + 8);
+    tp = (cyg_tick_count_t *)&icmp->icmp_data;
+    if (icmp->icmp_type != ICMP_ECHOREPLY) {
+        errinvalids++;
+        return 0;
+    }
+    if (icmp->icmp_id != UNIQUEID) {
+        errbadids++;
+        return 0;
+    }
+    if (from->sin_addr.s_addr != to->sin_addr.s_addr) {
+        errwronghosts++;
+        return 0;
+    }
+    return 1;
+}
+
+// expect is
+// 0 - require failure
+// 1 - require success
+// 2 - don't care
+
+#define FAILURE_REQUIRED 0
+#define SUCCESS_REQUIRED 1
+#define NOTHING_REQUIRED 2
+
+static void
+ping_host(int s, struct sockaddr_in *host, int expect )
+{
+    struct icmp *icmp = (struct icmp *)pkt1;
+    int icmp_len = MIN_PACKET;
+    int seq, ok_recv, bogus_recv;
+    cyg_tick_count_t *tp;
+    long *dp;
+    struct sockaddr_in from;
+    int i, len, fromlen;
+
+    ERRRESET();
+    ok_recv = 0;
+    bogus_recv = 0;
+    TNR_OFF();
+    diag_printf("INFO:<PING server %s ....>\n", inet_ntoa(host->sin_addr));
+    for (seq = 0;  seq < NUM_PINGS;  seq++, icmp_len += PACKET_ADD ) {
+        TNR_ON();
+        cyg_thread_delay( 47 ); // Half a second...
+        // Build ICMP packet
+        icmp->icmp_type = ICMP_ECHO;
+        icmp->icmp_code = 0;
+        icmp->icmp_cksum = 0;
+        icmp->icmp_seq = seq;
+        icmp->icmp_id = 0x1234;
+        // Set up ping data
+        tp = (cyg_tick_count_t *)&icmp->icmp_data;
+        *tp++ = cyg_current_time();
+        dp = (long *)tp;
+        for (i = sizeof(*tp);  i < icmp_len;  i += sizeof(*dp)) {
+            *dp++ = i;
+        }
+        // Add checksum
+        icmp->icmp_cksum = inet_cksum( (u_short *)icmp, icmp_len+8);
+        // Send it off
+        if (sendto(s, icmp, icmp_len+8, 0, (struct sockaddr *)host, sizeof(*host)) < 0) {
+            errsendtos++;
+            continue;
+        }
+        // Wait for a response
+        fromlen = sizeof(from);
+        len = recvfrom(s, pkt2, sizeof(pkt2), 0, (struct sockaddr *)&from, &fromlen);
+        if (len < 0) {
+            errrecvfroms++;
+            icmp_len = MIN_PACKET - PACKET_ADD; // just in case - long routes
+        } else {
+            if ( check_icmp(pkt2, len, &from, host) )
+                ok_recv++;
+            else
+                bogus_recv++;
+        }
+    }
+    TNR_OFF();
+    diag_printf("INFO:<Sent %d packets, received %d OK, %d bad>\n", NUM_PINGS, ok_recv, bogus_recv);
+    if ( errsendtos + errrecvfroms )
+        diag_printf("INFO:<%d sendto errors, %d recvfrom errors>\n", errsendtos, errrecvfroms );
+
+    if ( SUCCESS_REQUIRED == expect ) {
+        CYG_TEST_CHECK( 0 < ok_recv, "No pings succeeded" );
+        CYG_TEST_CHECK( 0 == errsendtos, "Sendto failures" );
+#ifndef XFAIL
+        CYG_TEST_CHECK( NUM_PINGS/2 <  ok_recv, "Not enough pings succeeded" );
+        CYG_TEST_CHECK( NUM_PINGS/2 > bogus_recv, "Too many pings failed" );
+#endif
+    }
+    if ( FAILURE_REQUIRED == expect ) {
+        CYG_TEST_CHECK( 0 == ok_recv, "Pings succeeded" );
+        CYG_TEST_CHECK( bogus_recv + errsendtos + errrecvfroms == NUM_PINGS, "Not enough failures" );
+#ifndef XFAIL
+        CYG_TEST_CHECK( 0 == bogus_recv, "Some pings got bogus recv" );
+#endif
+    }
+    CYG_TEST_PASS( SUCCESS_REQUIRED == expect ? "Expected successful ping behaviour" :
+                   FAILURE_REQUIRED == expect ? "Expected failure ping behaviour" :
+                                                "Non-predicted ping behaviour" );
+
+    TNR_ON();
+    return;
+}
+
+static void
+ping_test(struct bootp *bp)
+{
+    struct protoent *p;
+    struct timeval tv;
+    struct sockaddr_in host;
+    int s;
+
+    if ((p = getprotobyname("icmp")) == (struct protoent *)0) {
+        pexit("getprotobyname");
+        return;
+    }
+    s = socket(AF_INET, SOCK_RAW, p->p_proto);
+    if (s < 0) {
+        pexit("socket");
+        return;
+    }
+    tv.tv_sec = 1;
+    tv.tv_usec = 0;
+    setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
+    // Set up host address
+    host.sin_family = AF_INET;
+    host.sin_len = sizeof(host);
+    host.sin_addr = bp->bp_siaddr;
+    host.sin_port = 0;
+    ping_host(s, &host, SUCCESS_REQUIRED );
+    // Now try a bogus host
+    host.sin_addr.s_addr = htonl(ntohl(host.sin_addr.s_addr) + 32);
+    ping_host(s, &host, NOTHING_REQUIRED ); // Success is optional
+    close(s);
+}
+
+static void
+station_ping(char *name, int expect)
+{
+    struct protoent *p;
+    struct timeval tv;
+    struct sockaddr_in host;
+    int s;
+
+    int ints[4];
+
+    if ((p = getprotobyname("icmp")) == (struct protoent *)0) {
+        pexit("getprotobyname");
+        return;
+    }
+    s = socket(AF_INET, SOCK_RAW, p->p_proto);
+    if (s < 0) {
+        pexit("socket");
+        return;
+    }
+    tv.tv_sec = 1;
+    tv.tv_usec = 0;
+    setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
+    // Set up host address
+    host.sin_family = AF_INET;
+    host.sin_len = sizeof(host);
+    host.sin_port = 0;
+
+    if ( 4 != sscanf( name, "%d.%d.%d.%d", ints, ints+1, ints+2, ints+3 ) )
+        CYG_TEST_FAIL( "sscanf of host IP addr" );
+    else {
+        host.sin_addr.s_addr = htonl( 
+            (ints[0] << 24) |
+            (ints[1] << 16) |
+            (ints[2] <<  8) |
+            (ints[3]      )  );
+            
+        ping_host(s, &host, expect );
+
+    }
+    close(s);
+}
+
+// ------------------------------------------------------------------------
+
+#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x10000)
+static char stack[STACK_SIZE];
+static cyg_thread thread_data;
+static cyg_handle_t thread_handle;
+
+static void
+do_ping_tests(struct bootp *bp, int N, int testtime, int filesize)
+{
+    int i;
+    char order[256];
+    diag_printf( "INFO: telling %s to run %d pings for %d seconds, %d bytes and up\n",
+          inet_ntoa(bp->bp_siaddr), N, testtime, filesize );
+
+    // For 2nd and subsequent orders, we vary the ping data size:
+    for ( i = 0; i < N; i++ ) {
+        sprintf( order, "%s %s %d %d", "SLOW_PING",
+                 inet_ntoa(bp->bp_yiaddr),
+                 testtime,
+                 filesize + 100 * i );
+        autohost_tell( bp, order );
+    }
+}
+
+#define TESTTIME (5 * 60) // Seconds
+
+#define NUM_SESSIONS 10 // why not?
+
+// ------------------------------------------------------------------------
+//
+// The plan is as follows: 
+//
+// The host(s) will be set up so as to have additional interfaces as follows:
+//
+// eth0-host -> 10.0.3.1 and maybe others
+// eth1-host -> 10.0.4.1 and maybe others
+//              10.0.5.x should not exist
+//
+// These additional addresses can exist as extra loopback addresses, lo0:0,
+// lo0:1 and so on in a linux box.
+//
+// We want to ping all of the following:
+//
+// eth0-host		should always work
+// eth0-host+32		not expected to work
+// eth1-host		should always work
+// eth1-host+32		not expected to work
+// www.cygnus.com	should always work if default gw is correct
+// 10.0.3.1		should only work if route via eth0-host is added
+// 10.0.3.99		might work if route via eth0-host is added
+// 10.0.4.1		should only work if route via eth0-host is added
+// 10.0.4.99		might work if route via eth0-host is added
+// 10.0.5.1		should never work
+// 10.0.5.99		should never work
+//
+// So we test those places in the following contexts:
+// 
+// 1) No special routing added
+// 2) route via eth0-host to 10.0.3.x is added
+// 3) route via eth1-host to 10.0.4.x is added
+// 4) Both routes are added
+//
+// and check for correct operation and correct failure in all cases.
+//
+// Because of the time taken, these are separate test cases which include
+// this INL file after making suitable #defines.
+//
+// All the while, the hosts shall ping us, and when all is going we loop for
+// the rest of the test time.
+//
+
+void
+net_test(cyg_addrword_t param)
+{
+#ifdef DOHOSTPINGS
+    int i;
+    int numtests;
+#endif
+    int net3expect = FAILURE_REQUIRED;
+    int net4expect = FAILURE_REQUIRED;
+
+    cyg_tick_count_t ticks;
+    CYG_TEST_INIT();
+    CYG_TEST_INFO("Start PING routing test");
+    init_all_network_interfaces();
+
+    autohost_init();
+
+    TNR_INIT();
+
+#ifdef ADDROUTETONET_10_0_3_x
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up) {
+        route_add( "10.0.3.0", inet_ntoa(eth0_bootp_data.bp_siaddr), 24, 1 );
+        net3expect = SUCCESS_REQUIRED;
+    }
+#endif
+#endif // ADDROUTETONET_10_0_3_x
+
+#ifdef ADDROUTETONET_10_0_4_x
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up) {
+        route_add( "10.0.4.0", inet_ntoa(eth1_bootp_data.bp_siaddr), 24, 1 );
+        net4expect = SUCCESS_REQUIRED;
+    }
+#endif
+#endif // ADDROUTETONET_10_0_4_x
+
+    numtests = NUM_SESSIONS; // The number of pingers started OK
+    i = numtests;
+#ifdef DOHOSTPINGS
+    // Now command the host to do ping to us...
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up) {
+        do_ping_tests(&eth0_bootp_data, 1, TESTTIME, 64);
+        do_ping_tests(&eth0_bootp_data, 1, TESTTIME, 2000);
+        i -= 2;
+    }
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up && i > 0) {
+        do_ping_tests(&eth1_bootp_data, 1, TESTTIME, 100);
+        do_ping_tests(&eth1_bootp_data, 1, TESTTIME, 1800);
+        i -= 2;
+    }
+#endif
+#endif // DOHOSTPINGS
+    numtests -= i; // Adjust to how many we *actually* requested
+
+    ticks = cyg_current_time() + TESTTIME * 100; // FIXME - assume cS clock.
+
+    // Let the server run for 5 minutes
+    TNR_ON();
+
+    while (1) {
+#ifdef CYGHWR_NET_DRIVER_ETH0
+        if (eth0_up)
+            ping_test(&eth0_bootp_data);
+        if ( ticks < cyg_current_time() ) break;
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+        if (eth1_up)
+            ping_test(&eth1_bootp_data);
+        if ( ticks < cyg_current_time() ) break;
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH0
+        if (eth0_up) {
+            station_ping( "10.0.3.1",  net3expect );
+            if ( ticks < cyg_current_time() ) break;
+            station_ping( "10.0.3.99", net3expect );
+        }
+        if ( ticks < cyg_current_time() ) break;
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+        if (eth1_up) {
+            station_ping( "10.0.4.1",  net4expect );
+            if ( ticks < cyg_current_time() ) break;
+            station_ping( "10.0.4.99", net4expect );
+        }
+        if ( ticks < cyg_current_time() ) break;
+#endif
+        station_ping( "10.0.5.1", FAILURE_REQUIRED ); // Not valid
+        if ( ticks < cyg_current_time() ) break;
+        station_ping( "10.0.5.99", FAILURE_REQUIRED ); // Not valid
+        if ( ticks < cyg_current_time() ) break;
+#ifdef PING_WWW_CYGNUS_COM
+        station_ping( "205.180.83.41", NOTHING_REQUIRED ); // www.cygnus.com
+        if ( ticks < cyg_current_time() ) break;
+#endif
+    };
+
+    // Additional delay 'cos host may be slower than us - and it has to
+    // complete a transfer anyway:
+    cyg_thread_delay(  30    *100); // FIXME - assume cS clock.
+    TNR_OFF();
+
+    autohost_end( 0 ); // check for N pass messages from hosts
+
+    TNR_PRINT_ACTIVITY();
+    CYG_TEST_EXIT("Done");
+}
+
+void
+cyg_start(void)
+{
+    // Create a main thread, so we can run the scheduler and have time 'pass'
+    cyg_thread_create(10,                // Priority - just a number
+                      net_test,          // entry
+                      0,                 // entry parameter
+                      "Network test",    // Name
+                      &stack[0],         // Stack
+                      STACK_SIZE,        // Size
+                      &thread_handle,    // Handle
+                      &thread_data       // Thread data structure
+            );
+    cyg_thread_resume(thread_handle);  // Start it
+    cyg_scheduler_start();
+}
+
+// EOF routeping.inl
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/slowping.c
@@ -0,0 +1,201 @@
+//==========================================================================
+//
+//      autotest/current/tests/slowping.c
+//
+//      Simple pinging test, the server pings me and little else.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-23
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#ifdef CYGBLD_DEVS_ETH_DEVICE_H    // Get the device config if it exists
+#include CYGBLD_DEVS_ETH_DEVICE_H  // May provide CYGTST_DEVS_ETH_TEST_NET_REALTIME
+#endif
+
+#ifdef CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS // do we use the rt test?
+# ifdef CYGTST_DEVS_ETH_TEST_NET_REALTIME // Get the test ancilla if it exists
+#  include CYGTST_DEVS_ETH_TEST_NET_REALTIME
+# endif
+#endif
+
+
+// Fill in the blanks if necessary
+#ifndef TNR_OFF
+# define TNR_OFF()
+#endif
+#ifndef TNR_ON
+# define TNR_ON()
+#endif
+#ifndef TNR_INIT
+# define TNR_INIT()
+#endif
+#ifndef TNR_PRINT_ACTIVITY
+# define TNR_PRINT_ACTIVITY()
+#endif
+
+// ------------------------------------------------------------------------
+
+#include <errno.h>
+#include <network.h>
+
+#include "autohost.inl"
+
+#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x10000)
+static char stack[STACK_SIZE];
+static cyg_thread thread_data;
+static cyg_handle_t thread_handle;
+
+static void
+do_ping_tests(struct bootp *bp, int N, int testtime, int filesize)
+{
+    int i;
+    char order[256];
+    diag_printf( "INFO: telling %s to run %d pings for %d seconds, %d bytes and up\n",
+          inet_ntoa(bp->bp_siaddr), N, testtime, filesize );
+
+    // For 2nd and subsequent orders, we vary the ping data size:
+    for ( i = 0; i < N; i++ ) {
+        sprintf( order, "%s %s %d %d", "SLOW_PING",
+                 inet_ntoa(bp->bp_yiaddr),
+                 testtime,
+                 filesize + 50 * i );
+        autohost_tell( bp, order );
+    }
+}
+
+#define TESTTIME (5 * 60) // Seconds
+
+#define NUM_SESSIONS 10 // why not?
+
+void
+net_test(cyg_addrword_t param)
+{
+    int i;
+    int numtests;
+    CYG_TEST_INIT();
+    CYG_TEST_INFO("Start PING server test");
+    init_all_network_interfaces();
+
+    autohost_init();
+
+    TNR_INIT();
+    
+    numtests = NUM_SESSIONS; // The number of pingers started OK
+    i = numtests;
+    // Now command the host to do ping to us...
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up) {
+        // 2 small tests by default and a couple of larger ones
+        do_ping_tests(&eth0_bootp_data, 2, TESTTIME, 64);
+        do_ping_tests(&eth0_bootp_data, 2, TESTTIME, 1000);
+        do_ping_tests(&eth0_bootp_data, 2, TESTTIME, 10000);
+        i -= 6;
+    }
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up && i > 0) {
+        // rest of the tests depending...
+        do_ping_tests(&eth1_bootp_data, 1, TESTTIME, 64);
+        i--;
+        if ( i > 0 ) {
+            do_ping_tests(&eth1_bootp_data, 1, TESTTIME, 4000);
+            i--;
+        }
+        if ( i > 0 ) {
+            do_ping_tests(&eth1_bootp_data, i, TESTTIME, 1200);
+            i = 0;
+        }
+    }
+#endif
+    numtests -= i; // Adjust to how many we *actually* requested
+
+    // Let the server run for 5 minutes
+    cyg_thread_delay(2*100); // let the stuff start up first
+    TNR_ON();
+    cyg_thread_delay(TESTTIME*100); // FIXME - assume cS clock.
+    // Additional delay 'cos host may be slower than us - and it has to
+    // complete a transfer anyway:
+    cyg_thread_delay(  30    *100); // FIXME - assume cS clock.
+    TNR_OFF();
+
+    autohost_end( numtests ); // check for N pass messages from hosts
+
+    TNR_PRINT_ACTIVITY();
+    CYG_TEST_EXIT("Done");
+}
+
+void
+cyg_start(void)
+{
+    // Create a main thread, so we can run the scheduler and have time 'pass'
+    cyg_thread_create(10,                // Priority - just a number
+                      net_test,          // entry
+                      0,                 // entry parameter
+                      "Network test",    // Name
+                      &stack[0],         // Stack
+                      STACK_SIZE,        // Size
+                      &thread_handle,    // Handle
+                      &thread_data       // Thread data structure
+            );
+    cyg_thread_resume(thread_handle);  // Start it
+    cyg_scheduler_start();
+}
+
+// EOF slowping.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/slowpingmux.c
@@ -0,0 +1,391 @@
+//==========================================================================
+//
+//      autotest/current/tests/slowpingmux.c
+//
+//      Simple pinging test, the server pings me and I ping her.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-23
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#ifdef CYGBLD_DEVS_ETH_DEVICE_H    // Get the device config if it exists
+#include CYGBLD_DEVS_ETH_DEVICE_H  // May provide CYGTST_DEVS_ETH_TEST_NET_REALTIME
+#endif
+
+#ifdef CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS // do we use the rt test?
+# ifdef CYGTST_DEVS_ETH_TEST_NET_REALTIME // Get the test ancilla if it exists
+#  include CYGTST_DEVS_ETH_TEST_NET_REALTIME
+# endif
+#endif
+
+
+// Fill in the blanks if necessary
+#ifndef TNR_OFF
+# define TNR_OFF()
+#endif
+#ifndef TNR_ON
+# define TNR_ON()
+#endif
+#ifndef TNR_INIT
+# define TNR_INIT()
+#endif
+#ifndef TNR_PRINT_ACTIVITY
+# define TNR_PRINT_ACTIVITY()
+#endif
+
+// ------------------------------------------------------------------------
+
+#include <errno.h>
+#include <network.h>
+
+#include "autohost.inl"
+
+
+#define NUM_PINGS 16
+#define MAX_PACKET 4096
+#define MIN_PACKET   64
+#define MAX_SEND   4000
+
+#define PACKET_ADD  ((MAX_SEND - MIN_PACKET)/NUM_PINGS)
+#define nPACKET_ADD  1 
+
+static unsigned char pkt1[MAX_PACKET], pkt2[MAX_PACKET];
+
+#define UNIQUEID 0x1234
+
+// Compute INET checksum
+int
+inet_cksum(u_short *addr, int len)
+{
+    register int nleft = len;
+    register u_short *w = addr;
+    register u_short answer;
+    register u_int sum = 0;
+    u_short odd_byte = 0;
+
+    /*
+     *  Our algorithm is simple, using a 32 bit accumulator (sum),
+     *  we add sequential 16 bit words to it, and at the end, fold
+     *  back all the carry bits from the top 16 bits into the lower
+     *  16 bits.
+     */
+    while( nleft > 1 )  {
+        sum += *w++;
+        nleft -= 2;
+    }
+
+    /* mop up an odd byte, if necessary */
+    if( nleft == 1 ) {
+        *(u_char *)(&odd_byte) = *(u_char *)w;
+        sum += odd_byte;
+    }
+
+    /*
+     * add back carry outs from top 16 bits to low 16 bits
+     */
+    sum = (sum >> 16) + (sum & 0x0000ffff); /* add hi 16 to low 16 */
+    sum += (sum >> 16);                     /* add carry */
+    answer = ~sum;                          /* truncate to 16 bits */
+    return (answer);
+}
+
+static int
+show_icmp(unsigned char *pkt, int len, 
+          struct sockaddr_in *from, struct sockaddr_in *to)
+{
+    cyg_tick_count_t *tp, tv;
+    struct ip *ip;
+    struct icmp *icmp;
+    tv = cyg_current_time();
+    ip = (struct ip *)pkt;
+    if ((len < sizeof(*ip)) || ip->ip_v != IPVERSION) {
+        diag_printf("%s: Short packet or not IP! - Len: %d, Version: %d\n", 
+                    inet_ntoa(from->sin_addr), len, ip->ip_v);
+        return 0;
+    }
+    icmp = (struct icmp *)(pkt + sizeof(*ip));
+    len -= (sizeof(*ip) + 8);
+    tp = (cyg_tick_count_t *)&icmp->icmp_data;
+    if (icmp->icmp_type != ICMP_ECHOREPLY) {
+        diag_printf("%s: Invalid ICMP - type: %d\n", 
+                    inet_ntoa(from->sin_addr), icmp->icmp_type);
+        return 0;
+    }
+    if (icmp->icmp_id != UNIQUEID) {
+        diag_printf("%s: ICMP received for wrong id - sent: %x, recvd: %x\n", 
+                    inet_ntoa(from->sin_addr), UNIQUEID, icmp->icmp_id);
+    }
+//    diag_printf("%d bytes from %s: ", len, inet_ntoa(from->sin_addr));
+//    diag_printf("icmp_seq=%d", icmp->icmp_seq);
+//    diag_printf(", time=%dms\n", (int)(tv - *tp)*10);
+    return (from->sin_addr.s_addr == to->sin_addr.s_addr);
+}
+
+static void
+ping_host(int s, struct sockaddr_in *host)
+{
+    struct icmp *icmp = (struct icmp *)pkt1;
+    int icmp_len = MIN_PACKET;
+    int seq, ok_recv, bogus_recv;
+    cyg_tick_count_t *tp;
+    long *dp;
+    struct sockaddr_in from;
+    int i, len, fromlen;
+    int maxlen = 0;
+
+    ok_recv = 0;
+    bogus_recv = 0;
+    TNR_OFF();
+    diag_printf("PING server %s\n", inet_ntoa(host->sin_addr));
+    for (seq = 0;  seq < NUM_PINGS;  seq++, icmp_len += PACKET_ADD ) {
+        TNR_ON();
+        cyg_thread_delay( 47 ); // Half a second...
+        // Build ICMP packet
+        icmp->icmp_type = ICMP_ECHO;
+        icmp->icmp_code = 0;
+        icmp->icmp_cksum = 0;
+        icmp->icmp_seq = seq;
+        icmp->icmp_id = 0x1234;
+        // Set up ping data
+        tp = (cyg_tick_count_t *)&icmp->icmp_data;
+        *tp++ = cyg_current_time();
+        dp = (long *)tp;
+        for (i = sizeof(*tp);  i < icmp_len;  i += sizeof(*dp)) {
+            *dp++ = i;
+        }
+        // Add checksum
+        icmp->icmp_cksum = inet_cksum( (u_short *)icmp, icmp_len+8);
+        // Send it off
+        if (sendto(s, icmp, icmp_len+8, 0, (struct sockaddr *)host, sizeof(*host)) < 0) {
+            TNR_OFF();
+            perror("sendto");
+            continue;
+        }
+        // Wait for a response
+        fromlen = sizeof(from);
+        len = recvfrom(s, pkt2, sizeof(pkt2), 0, (struct sockaddr *)&from, &fromlen);
+        TNR_OFF();
+        if (len < 0) {
+//            perror("recvfrom");
+            icmp_len = MIN_PACKET - PACKET_ADD; // just in case - long routes
+        } else {
+            if (show_icmp(pkt2, len, &from, host)) {
+                ok_recv++;
+                if ( len > maxlen )
+                    maxlen = len;
+            } else {
+                bogus_recv++;
+            }
+        }
+    }
+    TNR_OFF();
+    diag_printf("Sent %d packets, received %d OK, %d bad max len %d\n",
+                NUM_PINGS, ok_recv, bogus_recv, maxlen);
+}
+
+static void
+ping_test(struct bootp *bp)
+{
+    struct protoent *p;
+    struct timeval tv;
+    struct sockaddr_in host;
+    int s;
+
+    if ((p = getprotobyname("icmp")) == (struct protoent *)0) {
+        pexit("getprotobyname");
+        return;
+    }
+    s = socket(AF_INET, SOCK_RAW, p->p_proto);
+    if (s < 0) {
+        pexit("socket");
+        return;
+    }
+    tv.tv_sec = 1;
+    tv.tv_usec = 0;
+    setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
+    // Set up host address
+    host.sin_family = AF_INET;
+    host.sin_len = sizeof(host);
+    host.sin_addr = bp->bp_siaddr;
+    host.sin_port = 0;
+    ping_host(s, &host);
+    // Now try a bogus host
+    host.sin_addr.s_addr = htonl(ntohl(host.sin_addr.s_addr) + 32);
+    ping_host(s, &host);
+    close(s);
+}
+
+// ------------------------------------------------------------------------
+
+#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x10000)
+static char stack[STACK_SIZE];
+static cyg_thread thread_data;
+static cyg_handle_t thread_handle;
+
+static void
+do_ping_tests(struct bootp *bp, int N, int testtime, int filesize)
+{
+    int i;
+    char order[256];
+    diag_printf( "INFO: telling %s to run %d pings for %d seconds, %d bytes and up\n",
+          inet_ntoa(bp->bp_siaddr), N, testtime, filesize );
+
+    // For 2nd and subsequent orders, we vary the ping data size:
+    for ( i = 0; i < N; i++ ) {
+        sprintf( order, "%s %s %d %d", "SLOW_PING",
+                 inet_ntoa(bp->bp_yiaddr),
+                 testtime,
+                 filesize + 100 * i );
+        autohost_tell( bp, order );
+    }
+}
+
+#define TESTTIME (5 * 60) // Seconds
+
+#define NUM_SESSIONS 10 // why not?
+
+void
+net_test(cyg_addrword_t param)
+{
+    int i;
+    int numtests;
+    cyg_tick_count_t ticks;
+    CYG_TEST_INIT();
+    CYG_TEST_INFO("Start PING server test");
+    init_all_network_interfaces();
+
+    autohost_init();
+
+    TNR_INIT();
+    
+    numtests = NUM_SESSIONS; // The number of pingers started OK
+    i = numtests;
+    // Now command the host to do ping to us...
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up) {
+        // 2 small tests by default and a couple of larger ones
+        do_ping_tests(&eth0_bootp_data, 1, TESTTIME, 64);
+        do_ping_tests(&eth0_bootp_data, 2, TESTTIME, 1000);
+        do_ping_tests(&eth0_bootp_data, 2, TESTTIME, 10000);
+        i -= 5;
+    }
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up && i > 0) {
+        // rest of the tests depending...
+        do_ping_tests(&eth1_bootp_data, 2, TESTTIME, 64);
+        i -= 2;
+        do_ping_tests(&eth1_bootp_data, 1, TESTTIME, 4000);
+        i -= 1;
+        do_ping_tests(&eth1_bootp_data, i, TESTTIME, 1200);
+        i = 0; // Since we just used up the rest
+    }
+#endif
+    numtests -= i; // Adjust to how many we *actually* requested
+
+    // Let the server run for 5 minutes
+    cyg_thread_delay(2*100); // let the stuff start up first
+    TNR_ON();
+
+    ticks = cyg_current_time() + TESTTIME * 100; // FIXME - assume cS clock.
+    while (1) {
+        if ( ticks < cyg_current_time() ) break;
+#ifdef CYGHWR_NET_DRIVER_ETH0
+        if (eth0_up) {
+            ping_test(&eth0_bootp_data);
+        }
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+        if ( ticks < cyg_current_time() ) break;
+        if (eth1_up) {
+            ping_test(&eth1_bootp_data);
+        }
+#endif
+    };
+
+    // Additional delay 'cos host may be slower than us - and it has to
+    // complete a transfer anyway:
+    cyg_thread_delay(  30    *100); // FIXME - assume cS clock.
+    TNR_OFF();
+
+    autohost_end( numtests ); // check for N pass messages from hosts
+
+    TNR_PRINT_ACTIVITY();
+    CYG_TEST_EXIT("Done");
+}
+
+void
+cyg_start(void)
+{
+    // Create a main thread, so we can run the scheduler and have time 'pass'
+    cyg_thread_create(10,                // Priority - just a number
+                      net_test,          // entry
+                      0,                 // entry parameter
+                      "Network test",    // Name
+                      &stack[0],         // Stack
+                      STACK_SIZE,        // Size
+                      &thread_handle,    // Handle
+                      &thread_data       // Thread data structure
+            );
+    cyg_thread_resume(thread_handle);  // Start it
+    cyg_scheduler_start();
+}
+
+// EOF slowpingmux.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/snmpmulti.c
@@ -0,0 +1,203 @@
+//==========================================================================
+//
+//      autotest/current/tests/snmpmulti.c
+//
+//      Simple pinging test, the server pings me and little else.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-23
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#ifdef CYGPKG_SNMPAGENT // Do we support SNMP at all?
+
+#ifdef CYGBLD_DEVS_ETH_DEVICE_H    // Get the device config if it exists
+#include CYGBLD_DEVS_ETH_DEVICE_H  // May provide CYGTST_DEVS_ETH_TEST_NET_REALTIME
+#endif
+
+#ifdef CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS // do we use the rt test?
+# ifdef CYGTST_DEVS_ETH_TEST_NET_REALTIME // Get the test ancilla if it exists
+#  include CYGTST_DEVS_ETH_TEST_NET_REALTIME
+# endif
+#endif
+
+
+// Fill in the blanks if necessary
+#ifndef TNR_OFF
+# define TNR_OFF()
+#endif
+#ifndef TNR_ON
+# define TNR_ON()
+#endif
+#ifndef TNR_INIT
+# define TNR_INIT()
+#endif
+#ifndef TNR_PRINT_ACTIVITY
+# define TNR_PRINT_ACTIVITY()
+#endif
+
+// ------------------------------------------------------------------------
+
+#include <errno.h>
+#include <network.h>
+
+#include "autohost.inl"
+
+#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x10000)
+static char stack[STACK_SIZE];
+static cyg_thread thread_data;
+static cyg_handle_t thread_handle;
+
+static void
+do_snmp_tests(struct bootp *bp, int N, int testtime)
+{
+    int i;
+    char order[256];
+    diag_printf( "INFO: telling %s to run %d snmpwalks for %d seconds\n",
+          inet_ntoa(bp->bp_siaddr), N, testtime );
+
+#ifdef XFAIL
+    // reduce the time to run so that we get a result
+    testtime *= 3;
+    testtime /= 4;
+#endif
+    for ( i = 0; i < N; i++ ) {
+        sprintf( order, "%s %s %d", "SNMP_WALK",
+                 inet_ntoa(bp->bp_yiaddr),
+                 testtime );
+        autohost_tell( bp, order );
+    }
+}
+
+#define TESTTIME (5 * 60) // Seconds
+
+#define NUM_SESSIONS 10 // why not?
+
+void
+net_test(cyg_addrword_t param)
+{
+    extern void cyg_net_snmp_init(void);
+
+    CYG_TEST_INIT();
+    CYG_TEST_INFO("Start multiple SNMP server test");
+    init_all_network_interfaces();
+
+    autohost_init();
+
+    cyg_net_snmp_init();
+
+    TNR_INIT();
+    
+    // Now command the host to do ping to us...
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up) {
+        do_snmp_tests(&eth0_bootp_data, 3, TESTTIME);
+    }
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up) {
+        do_snmp_tests(&eth1_bootp_data, 3, TESTTIME);
+    }
+#endif
+    // Let the server run for 5 minutes
+    cyg_thread_delay(2*100); // let the stuff start up first
+    TNR_ON();
+    cyg_thread_delay(TESTTIME*100); // FIXME - assume cS clock.
+    // Additional delay 'cos host may be slower than us - and it has to
+    // complete a transfer anyway:
+    cyg_thread_delay(  30    *100); // FIXME - assume cS clock.
+    TNR_OFF();
+
+    autohost_end( 3 * (0
+#ifdef CYGHWR_NET_DRIVER_ETH0
+                  + eth0_up
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+                  + eth1_up
+#endif
+        ) ); // check for N pass messages from hosts
+
+    TNR_PRINT_ACTIVITY();
+    CYG_TEST_EXIT("Done");
+}
+
+#endif // CYGPKG_SNMPAGENT - Do we support SNMP at all?
+
+void
+cyg_start(void)
+{
+#ifdef CYGPKG_SNMPAGENT // Do we support SNMP at all?
+    // Create a main thread, so we can run the scheduler and have time 'pass'
+    cyg_thread_create(10,                // Priority - just a number
+                      net_test,          // entry
+                      0,                 // entry parameter
+                      "Network test",    // Name
+                      &stack[0],         // Stack
+                      STACK_SIZE,        // Size
+                      &thread_handle,    // Handle
+                      &thread_data       // Thread data structure
+            );
+    cyg_thread_resume(thread_handle);  // Start it
+    cyg_scheduler_start();
+#else
+    CYG_TEST_NA( "No SNMP agent in this configuration" );
+#endif // CYGPKG_SNMPAGENT - Do we support SNMP at all?
+}
+
+// EOF snmpmulti.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/snmppings.c
@@ -0,0 +1,251 @@
+//==========================================================================
+//
+//      autotest/current/tests/snmppings.c
+//
+//      Simple pinging test, the server pings me and little else.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-23
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#ifdef CYGPKG_SNMPAGENT // Do we support SNMP at all?
+
+#ifdef CYGBLD_DEVS_ETH_DEVICE_H    // Get the device config if it exists
+#include CYGBLD_DEVS_ETH_DEVICE_H  // May provide CYGTST_DEVS_ETH_TEST_NET_REALTIME
+#endif
+
+#ifdef CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS // do we use the rt test?
+# ifdef CYGTST_DEVS_ETH_TEST_NET_REALTIME // Get the test ancilla if it exists
+#  include CYGTST_DEVS_ETH_TEST_NET_REALTIME
+# endif
+#endif
+
+
+// Fill in the blanks if necessary
+#ifndef TNR_OFF
+# define TNR_OFF()
+#endif
+#ifndef TNR_ON
+# define TNR_ON()
+#endif
+#ifndef TNR_INIT
+# define TNR_INIT()
+#endif
+#ifndef TNR_PRINT_ACTIVITY
+# define TNR_PRINT_ACTIVITY()
+#endif
+
+// ------------------------------------------------------------------------
+
+#include <errno.h>
+#include <network.h>
+
+#include "autohost.inl"
+
+#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x10000)
+static char stack[STACK_SIZE];
+static cyg_thread thread_data;
+static cyg_handle_t thread_handle;
+
+static void
+do_ping_tests(struct bootp *bp, int N, int testtime, int filesize)
+{
+    int i;
+    char order[256];
+    diag_printf( "INFO: telling %s to run %d pings for %d seconds, %d bytes and up\n",
+          inet_ntoa(bp->bp_siaddr), N, testtime, filesize );
+
+    // For 2nd and subsequent orders, we vary the ping data size:
+    for ( i = 0; i < N; i++ ) {
+        sprintf( order, "%s %s %d %d", "SLOW_PING",
+                 inet_ntoa(bp->bp_yiaddr),
+                 testtime,
+                 filesize + 50 * i );
+        autohost_tell( bp, order );
+    }
+}
+
+static void
+do_snmp_tests(struct bootp *bp, int N, int testtime)
+{
+    int i;
+    char order[256];
+    diag_printf( "INFO: telling %s to run %d snmpwalks for %d seconds\n",
+          inet_ntoa(bp->bp_siaddr), N, testtime );
+
+#ifdef XFAIL
+    // reduce the time to run so that we get a result
+    testtime *= 3;
+    testtime /= 4;
+#endif
+    for ( i = 0; i < N; i++ ) {
+        sprintf( order, "%s %s %d", "SNMP_WALK",
+                 inet_ntoa(bp->bp_yiaddr),
+                 testtime );
+        autohost_tell( bp, order );
+    }
+}
+
+static void
+do_flood_tests(struct bootp *bp, int testtime, int on, int off)
+{
+    char order[256];
+    diag_printf( "INFO: telling %s to run 1 flood ping for %d seconds, %d/%d flood/sleep\n",
+          inet_ntoa(bp->bp_siaddr), testtime, on, off );
+
+    sprintf( order, "%s %s %d %d %d %d", "FLOOD_PING",
+             inet_ntoa(bp->bp_yiaddr),
+             testtime,
+             56, // constant size
+             on, off );
+    autohost_tell( bp, order );
+}
+
+
+#define TESTTIME (5 * 60) // Seconds
+
+#define NUM_SESSIONS 10 // why not?
+
+void
+net_test(cyg_addrword_t param)
+{
+    extern void cyg_net_snmp_init(void);
+
+    CYG_TEST_INIT();
+    CYG_TEST_INFO("Start multiple SNMP server test");
+    init_all_network_interfaces();
+
+    autohost_init();
+
+    cyg_net_snmp_init();
+
+    TNR_INIT();
+    
+    // Now command the host to do ping to us...
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up) {
+        // Two SNMP walk tests
+        do_snmp_tests(&eth0_bootp_data, 2, TESTTIME);
+        // ...and flood ping for one second in 10
+        do_flood_tests(&eth0_bootp_data, TESTTIME, 1, 9 );
+        // ...and ping a couple of times too, 56 bytes and 2000 bytes.
+        do_ping_tests(&eth0_bootp_data, 1, TESTTIME, 56 );
+        do_ping_tests(&eth0_bootp_data, 1, TESTTIME, 2000 );
+        // which makes 5 tests in all.
+    }
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up) {
+        // Two SNMP walk tests
+        do_snmp_tests(&eth1_bootp_data, 2, TESTTIME);
+        // ...and flood ping for two seconds in 13
+        do_flood_tests(&eth1_bootp_data, TESTTIME, 2, 11 );
+        // ...and ping a couple of times too, 500 bytes and 1600 bytes.
+        do_ping_tests(&eth1_bootp_data, 1, TESTTIME, 500 );
+        do_ping_tests(&eth1_bootp_data, 1, TESTTIME, 1600 );
+        // which makes 5 tests in all.
+    }
+#endif
+    // Let the server run for 5 minutes
+    cyg_thread_delay(2*100); // let the stuff start up first
+    TNR_ON();
+    cyg_thread_delay(TESTTIME*100); // FIXME - assume cS clock.
+    // Additional delay 'cos host may be slower than us - and it has to
+    // complete a transfer anyway:
+    cyg_thread_delay(  30    *100); // FIXME - assume cS clock.
+    TNR_OFF();
+
+    autohost_end( 5 * (0
+#ifdef CYGHWR_NET_DRIVER_ETH0
+                  + eth0_up
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+                  + eth1_up
+#endif
+        ) ); // check for N pass messages from hosts
+
+    TNR_PRINT_ACTIVITY();
+    CYG_TEST_EXIT("Done");
+}
+
+#endif // CYGPKG_SNMPAGENT - Do we support SNMP at all?
+
+void
+cyg_start(void)
+{
+#ifdef CYGPKG_SNMPAGENT // Do we support SNMP at all?
+    // Create a main thread, so we can run the scheduler and have time 'pass'
+    cyg_thread_create(10,                // Priority - just a number
+                      net_test,          // entry
+                      0,                 // entry parameter
+                      "Network test",    // Name
+                      &stack[0],         // Stack
+                      STACK_SIZE,        // Size
+                      &thread_handle,    // Handle
+                      &thread_data       // Thread data structure
+            );
+    cyg_thread_resume(thread_handle);  // Start it
+    cyg_scheduler_start();
+#else
+    CYG_TEST_NA( "No SNMP agent in this configuration" );
+#endif // CYGPKG_SNMPAGENT - Do we support SNMP at all?
+}
+
+// EOF snmppings.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/snmpwalk.c
@@ -0,0 +1,203 @@
+//==========================================================================
+//
+//      autotest/current/tests/snmpwalk.c
+//
+//      Simple pinging test, the server pings me and little else.
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-23
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#ifdef CYGPKG_SNMPAGENT // Do we support SNMP at all?
+
+#ifdef CYGBLD_DEVS_ETH_DEVICE_H    // Get the device config if it exists
+#include CYGBLD_DEVS_ETH_DEVICE_H  // May provide CYGTST_DEVS_ETH_TEST_NET_REALTIME
+#endif
+
+#ifdef CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS // do we use the rt test?
+# ifdef CYGTST_DEVS_ETH_TEST_NET_REALTIME // Get the test ancilla if it exists
+#  include CYGTST_DEVS_ETH_TEST_NET_REALTIME
+# endif
+#endif
+
+
+// Fill in the blanks if necessary
+#ifndef TNR_OFF
+# define TNR_OFF()
+#endif
+#ifndef TNR_ON
+# define TNR_ON()
+#endif
+#ifndef TNR_INIT
+# define TNR_INIT()
+#endif
+#ifndef TNR_PRINT_ACTIVITY
+# define TNR_PRINT_ACTIVITY()
+#endif
+
+// ------------------------------------------------------------------------
+
+#include <errno.h>
+#include <network.h>
+
+#include "autohost.inl"
+
+#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x10000)
+static char stack[STACK_SIZE];
+static cyg_thread thread_data;
+static cyg_handle_t thread_handle;
+
+static void
+do_snmp_tests(struct bootp *bp, int N, int testtime)
+{
+    int i;
+    char order[256];
+    diag_printf( "INFO: telling %s to run %d snmpwalks for %d seconds\n",
+          inet_ntoa(bp->bp_siaddr), N, testtime );
+
+#ifdef XFAIL
+    // reduce the time to run so that we get a result
+    testtime *= 3;
+    testtime /= 4;
+#endif
+    for ( i = 0; i < N; i++ ) {
+        sprintf( order, "%s %s %d", "SNMP_WALK",
+                 inet_ntoa(bp->bp_yiaddr),
+                 testtime );
+        autohost_tell( bp, order );
+    }
+}
+
+#define TESTTIME (5 * 60) // Seconds
+
+#define NUM_SESSIONS 10 // why not?
+
+void
+net_test(cyg_addrword_t param)
+{
+    extern void cyg_net_snmp_init(void);
+
+    CYG_TEST_INIT();
+    CYG_TEST_INFO("Start simple SNMP server test");
+    init_all_network_interfaces();
+
+    autohost_init();
+
+    cyg_net_snmp_init();
+
+    TNR_INIT();
+    
+    // Now command the host to do ping to us...
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up) {
+        do_snmp_tests(&eth0_bootp_data, 1, TESTTIME);
+    }
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up) {
+        do_snmp_tests(&eth1_bootp_data, 1, TESTTIME);
+    }
+#endif
+    // Let the server run for 5 minutes
+    cyg_thread_delay(2*100); // let the stuff start up first
+    TNR_ON();
+    cyg_thread_delay(TESTTIME*100); // FIXME - assume cS clock.
+    // Additional delay 'cos host may be slower than us - and it has to
+    // complete a transfer anyway:
+    cyg_thread_delay(  30    *100); // FIXME - assume cS clock.
+    TNR_OFF();
+
+    autohost_end( 0
+#ifdef CYGHWR_NET_DRIVER_ETH0
+                  + eth0_up
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+                  + eth1_up
+#endif
+        ); // check for 2 pass messages from hosts
+
+    TNR_PRINT_ACTIVITY();
+    CYG_TEST_EXIT("Done");
+}
+
+#endif // CYGPKG_SNMPAGENT - Do we support SNMP at all?
+
+void
+cyg_start(void)
+{
+#ifdef CYGPKG_SNMPAGENT // Do we support SNMP at all?
+    // Create a main thread, so we can run the scheduler and have time 'pass'
+    cyg_thread_create(10,                // Priority - just a number
+                      net_test,          // entry
+                      0,                 // entry parameter
+                      "Network test",    // Name
+                      &stack[0],         // Stack
+                      STACK_SIZE,        // Size
+                      &thread_handle,    // Handle
+                      &thread_data       // Thread data structure
+            );
+    cyg_thread_resume(thread_handle);  // Start it
+    cyg_scheduler_start();
+#else
+    CYG_TEST_NA( "No SNMP agent in this configuration" );
+#endif // CYGPKG_SNMPAGENT - Do we support SNMP at all?
+}
+
+// EOF snmpwalk.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/tftp_serv.inl
@@ -0,0 +1,229 @@
+//==========================================================================
+//
+//      tests/auto/tftp_serv.inl
+//
+//      Automated Multiple TFTP server GET test
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-10
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+// TFTP test code
+
+#ifdef CYGBLD_DEVS_ETH_DEVICE_H    // Get the device config if it exists
+#include CYGBLD_DEVS_ETH_DEVICE_H  // May provide CYGTST_DEVS_ETH_TEST_NET_REALTIME
+#endif
+
+#ifdef CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS // do we use the rt test?
+# ifdef CYGTST_DEVS_ETH_TEST_NET_REALTIME // Get the test ancilla if it exists
+#  include CYGTST_DEVS_ETH_TEST_NET_REALTIME
+# endif
+#endif
+
+
+// Fill in the blanks if necessary
+#ifndef TNR_OFF
+# define TNR_OFF()
+#endif
+#ifndef TNR_ON
+# define TNR_ON()
+#endif
+#ifndef TNR_INIT
+# define TNR_INIT()
+#endif
+#ifndef TNR_PRINT_ACTIVITY
+# define TNR_PRINT_ACTIVITY()
+#endif
+
+// ------------------------------------------------------------------------
+
+#include <errno.h>
+#include <network.h>
+#include <tftp_support.h>
+
+#include "autohost.inl"
+
+#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x10000)
+static char stack[STACK_SIZE];
+static cyg_thread thread_data;
+static cyg_handle_t thread_handle;
+
+static void
+do_tftp_tests(struct bootp *bp, int N, int testtime, int filesize)
+{
+    int i;
+    char order[256];
+    diag_printf( "INFO: telling %s to run %d tests for %d seconds, %d+/-%d bytes\n",
+          inet_ntoa(bp->bp_siaddr), N, testtime, filesize, N-1 );
+
+    // For 2nd and subsequent orders, we vary the filesize, thus testing
+    // together: 0 and 1 bytes; 512 and 513 bytes; 1Mb and 1Mb-1; in the
+    // standard invocations of this test.  Don't go over 1Mb.
+    for ( i = 0; i < N; i++ ) {
+        sprintf( order, "%s %s %d %d", OPERATION,
+                 inet_ntoa(bp->bp_yiaddr),
+                 testtime,
+                 filesize + ((filesize < (1024*1024)) ? i : -i ) );
+        autohost_tell( bp, order );
+    }
+}
+
+#define NUM_SERVERS 4
+static int servers[NUM_SERVERS] = { 0 };
+
+#define TESTTIME (5 * 60) // Seconds
+
+#define NUM_SESSIONS 3 // the dummy fileops system can only accept 3 new files
+
+void
+net_test(cyg_addrword_t param)
+{
+    int i;
+    int numtests;
+    CYG_TEST_INIT();
+    CYG_TEST_INFO("Start TFTP server test");
+    init_all_network_interfaces();
+
+    autohost_init();
+
+    TNR_INIT();
+    
+    // Create TFTP servers
+    for ( i = 0; i < NUM_SERVERS; i++ ) {
+        extern struct tftpd_fileops dummy_fileops;
+        int server_id = tftpd_start(0, &dummy_fileops);
+        if (server_id > 0) {
+            diag_printf("INFO: TFTP server %d created - id: %x\n", i, server_id);
+            servers[i] = server_id;
+        }
+        else {
+            diag_printf("INFO: TFTP server %d NOT created [%x]\n", i, server_id);
+            i--;
+            break;
+        }
+    }
+
+    numtests = i; // The number of servers started OK
+    if ( numtests > NUM_SESSIONS )
+        numtests = NUM_SESSIONS;
+    i = numtests;
+
+    if ( i < 1 ) {
+        CYG_TEST_FAIL_EXIT( "Not enough TFTP servers created" );
+    }
+
+    // Now command the host to do tftp to us...
+#ifdef CYGHWR_NET_DRIVER_ETH0
+    if (eth0_up) {
+        // 2 tests by default - if we have enough servers
+        if ( i > 1 ) {
+            do_tftp_tests(&eth0_bootp_data, 2, TESTTIME, FILESIZE);
+            i -= 2;
+        }
+        else {
+            do_tftp_tests(&eth0_bootp_data, 1, TESTTIME, FILESIZE);
+            i -= 1;
+        }
+    }
+#endif
+#ifdef CYGHWR_NET_DRIVER_ETH1
+    if (eth1_up && i > 0) {
+        // rest of the tests depending...
+        do_tftp_tests(&eth1_bootp_data, i, TESTTIME, FILESIZE);
+        i = 0;
+    }
+#endif
+    numtests -= i; // Adjust to how many we *actually* requested
+
+    // Let the server run for 5 minutes
+    cyg_thread_delay(2*100); // let the tftpds start up first
+    TNR_ON();
+    cyg_thread_delay(TESTTIME*100); // FIXME - assume cS clock.
+    // Additional delay 'cos host may be slower than us - and it has to
+    // complete a transfer anyway:
+    cyg_thread_delay(  30    *100); // FIXME - assume cS clock.
+    TNR_OFF();
+
+    for ( i = 0; i < NUM_SERVERS; i++ ) {
+        int server_id = servers[i];
+        if ( server_id ) {
+            int res = tftpd_stop(servers[i]);
+            diag_printf("INFO: TFTP server %d stopped - res: %d\n", i, res);
+            CYG_TEST_CHECK( res > 0, "TFTP server did not die" );
+        }
+    }
+
+    autohost_end( numtests ); // check for 3 pass messages from hosts
+
+    TNR_PRINT_ACTIVITY();
+    CYG_TEST_EXIT("Done");
+}
+
+void
+cyg_start(void)
+{
+    // Create a main thread, so we can run the scheduler and have time 'pass'
+    cyg_thread_create(10,                // Priority - just a number
+                      net_test,          // entry
+                      0,                 // entry parameter
+                      "Network test",    // Name
+                      &stack[0],         // Stack
+                      STACK_SIZE,        // Size
+                      &thread_handle,    // Handle
+                      &thread_data       // Thread data structure
+            );
+    cyg_thread_resume(thread_handle);  // Start it
+    cyg_scheduler_start();
+}
+
+// EOF tftp_serv.inl
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/tftp_serv_g0.c
@@ -0,0 +1,74 @@
+//==========================================================================
+//
+//      tests/auto/tftp_serv_g0.c
+//
+//      Automated Multiple TFTP server GET test
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-10
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+// TFTP test code
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#define OPERATION "TFTP_SERV_GET"
+#define FILESIZE  0
+
+#include "tftp_serv.inl"
+
+// EOF tftp_serv_g0.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/tftp_serv_g1M.c
@@ -0,0 +1,74 @@
+//==========================================================================
+//
+//      tests/auto/tftp_serv_g1M.c
+//
+//      Automated Multiple TFTP server GET test
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-10
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+// TFTP test code
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#define OPERATION "TFTP_SERV_GET"
+#define FILESIZE  (1024 * 1024)
+
+#include "tftp_serv.inl"
+
+// EOF tftp_serv_g1M.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/tftp_serv_g512.c
@@ -0,0 +1,74 @@
+//==========================================================================
+//
+//      tests/auto/tftp_serv_g512.c
+//
+//      Automated Multiple TFTP server GET test
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-10
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+// TFTP test code
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#define OPERATION "TFTP_SERV_GET"
+#define FILESIZE  512
+
+#include "tftp_serv.inl"
+
+// EOF tftp_serv_g512.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/tftp_serv_get.c
@@ -0,0 +1,74 @@
+//==========================================================================
+//
+//      tests/auto/tftp_serv_get.c
+//
+//      Automated Multiple TFTP server GET test
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-10
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+// TFTP test code
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#define OPERATION "TFTP_SERV_GET"
+#define FILESIZE  (512 * 512 - 128)
+
+#include "tftp_serv.inl"
+
+// EOF tftp_serv_get.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/tftp_serv_p0.c
@@ -0,0 +1,74 @@
+//==========================================================================
+//
+//      tests/auto/tftp_serv_p0.c
+//
+//      Automated Multiple TFTP server GET test
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-10
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+// TFTP test code
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#define OPERATION "TFTP_SERV_PUT"
+#define FILESIZE  0
+
+#include "tftp_serv.inl"
+
+// EOF tftp_serv_p0.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/tftp_serv_p1M.c
@@ -0,0 +1,74 @@
+//==========================================================================
+//
+//      tests/auto/tftp_serv_p1M.c
+//
+//      Automated Multiple TFTP server GET test
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-10
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+// TFTP test code
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#define OPERATION "TFTP_SERV_PUT"
+#define FILESIZE  (1024 * 1024)
+
+#include "tftp_serv.inl"
+
+// EOF tftp_serv_p1M.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/tftp_serv_p512.c
@@ -0,0 +1,74 @@
+//==========================================================================
+//
+//      tests/auto/tftp_serv_p512.c
+//
+//      Automated Multiple TFTP server GET test
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-10
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+// TFTP test code
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#define OPERATION "TFTP_SERV_PUT"
+#define FILESIZE  512
+
+#include "tftp_serv.inl"
+
+// EOF tftp_serv_p512.c
new file mode 100644
--- /dev/null
+++ b/packages/net/autotest/current/tests/tftp_serv_put.c
@@ -0,0 +1,74 @@
+//==========================================================================
+//
+//      tests/auto/tftp_serv_put.c
+//
+//      Automated Multiple TFTP server GET test
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+//
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//####BSDCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from OpenBSD or other sources,
+// and are covered by the appropriate copyright disclaimers included herein.
+//
+// -------------------------------------------
+//
+//####BSDCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt,gthomas
+// Contributors: hmt,gthomas
+// Date:         2000-10-10
+// Purpose:      
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+// TFTP test code
+
+#include <pkgconf/system.h>
+
+#include <cyg/infra/testcase.h>         // testing infrastructure
+
+#include <pkgconf/net.h>
+
+#define OPERATION "TFTP_SERV_PUT"
+#define FILESIZE  (512 * 512 + 128)
+
+#include "tftp_serv.inl"
+
+// EOF tftp_serv_put.c