summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1998-08-19 20:29:35 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1998-08-19 20:29:35 +0000
commitab0c6890bf4ab674877448a1a60e1e4ceeb38a3c (patch)
tree92130f4d4b24ec876d0a2231bf1f71538012d23b
parent26b5c77fb1f484730bc016c5402c3bf6e070de46 (diff)
downloadrtems-ab0c6890bf4ab674877448a1a60e1e4ceeb38a3c.tar.bz2
Baseline
-rw-r--r--doc/networking/Makefile82
-rw-r--r--doc/networking/driver.t281
-rw-r--r--doc/networking/network.texi107
-rw-r--r--doc/networking/networkapp.t250
-rw-r--r--doc/networking/networking.eps1343
-rw-r--r--doc/networking/networking.gifbin0 -> 6274 bytes
-rw-r--r--doc/networking/networktasks.t60
-rw-r--r--doc/networking/preface.t23
-rw-r--r--doc/networking/testing.t175
9 files changed, 2321 insertions, 0 deletions
diff --git a/doc/networking/Makefile b/doc/networking/Makefile
new file mode 100644
index 0000000000..f0d8b85deb
--- /dev/null
+++ b/doc/networking/Makefile
@@ -0,0 +1,82 @@
+#
+# COPYRIGHT (c) 1988-1998.
+# On-Line Applications Research Corporation (OAR).
+# All rights reserved.
+#
+# $Id$
+#
+
+PROJECT=networking
+DISTRIBUTION_LEVEL=public
+
+include ../Make.config
+
+REPLACE=../tools/word-replace
+
+all: html info ps
+
+dirs:
+ $(make-dirs)
+
+COMMON_FILES=../common/cpright.texi ../common/setup.texi
+
+GENERATED_FILES=networkapp.texi driver.texi networktasks.texi testing.texi
+
+FILES= $(PROJECT).texi \
+ networktasks.texi preface.texi $(GENERATED_FILES)
+
+INFOFILES=$(wildcard $(PROJECT) $(PROJECT)-*)
+
+info: dirs networking
+ #cp $(wildcard $(PROJECT) $(PROJECT)-*) $(INFO_INSTALL)
+ cp $(PROJECT) $(INFO_INSTALL)
+
+networking: $(FILES)
+ $(MAKEINFO) $(PROJECT).texi
+
+dvi: $(PROJECT).dvi
+ps: dirs $(PROJECT).ps
+
+$(PROJECT).ps: $(PROJECT).dvi
+ dvips -o $(PROJECT).ps $(PROJECT).dvi
+ cp $(PROJECT).ps $(PS_INSTALL)
+
+$(PROJECT).dvi: $(FILES)
+ $(TEXI2DVI) $(PROJECT).texi
+
+networktasks.texi: networktasks.t
+ $(BMENU) -p "Preface" \
+ -u "Top" \
+ -n "Writing RTEMS/KA9Q Network Device Drivers" ${*}.t
+
+driver.texi: driver.t
+ $(BMENU) -p "KA9Q Task Structure and Data Flow" \
+ -u "Top" \
+ -n "Using KA9Q networking in an RTEMS Application" ${*}.t
+
+networkapp.texi: networkapp.t
+ $(BMENU) -p "Writing RTEMS/KA9Q Network Device Drivers Write your driver show function" \
+ -u "Top" \
+ -n "Testing the Driver" ${*}.t
+
+testing.texi: testing.t
+ $(BMENU) -p "Using KA9Q networking in an RTEMS Application Domain Name Service" \
+ -u "Top" \
+ -n "Command and Variable Index" ${*}.t
+
+html: dirs $(FILES)
+ -mkdir -p $(WWW_INSTALL)/networking
+ rm -f $(WWW_INSTALL)/$(PROJECT)/networking.gif
+ cp networking.gif $(WWW_INSTALL)/$(PROJECT)/networking.gif
+ $(TEXI2WWW) $(TEXI2WWW_ARGS) -dir $(WWW_INSTALL)/$(PROJECT) \
+ $(PROJECT).texi
+
+clean:
+ rm -f *.o $(PROG) *.txt core
+ rm -f *.dvi *.ps *.log *.aux *.cp *.fn *.ky *.pg *.toc *.tp *.vr $(BASE)
+ rm -f $(PROJECT) $(PROJECT)-* $(GENERATED_FILES)
+ rm -f networking networking-*
+ rm -f timedata.texi timetbl.texi intr.texi wksheets.texi
+ rm -f timetbl.t wksheets.t
+ rm -f *.fixed _*
+
diff --git a/doc/networking/driver.t b/doc/networking/driver.t
new file mode 100644
index 0000000000..43589aa694
--- /dev/null
+++ b/doc/networking/driver.t
@@ -0,0 +1,281 @@
+@c
+@c Written by Eric Norum
+@c
+@c COPYRIGHT (c) 1988-1998.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Writing RTEMS Network Device Drivers
+
+@section Introduction
+
+This chapter is intended to provide an introduction to the
+procedure for writing RTEMS network device drivers.
+The example code is taken from the `Generic 68360' network device
+driver. The source code for this driver is located in the
+@code{c/src/lib/libbsp/m68k/gen68360/network} directory in the RTEMS
+source code distribution. You should have a copy of this driver at
+hand when reading the following notes.
+
+@section Learn about the network device
+
+Before starting to write the network driver you need to be completely
+familiar with the programmer's view of the device.
+The following points list some of the details of the
+device that must be understood before a driver can be written.
+
+@itemize @bullet
+
+@item Does the device use DMA to transfer packets to and from
+memory or does the processor have to
+copy packets to and from memory on the device?
+
+@item If the device uses DMA, is it capable of forming a single
+outtoing packet from multiple fragments scattered in separate
+memory buffers?
+
+@item If the device uses DMA, is it capable of chaining multiple
+outgoing packets, or does each outgoing packet require
+intervention by the driver?
+
+@item Does the device automatically pad short frames to the minimum
+64 bytes or does the driver have to supply the padding?
+
+@item Does the device automatically retry a transmission on detection
+of a collision?
+
+@item If the device uses DMA, is it capable of buffering multiple
+packets to memory, or does the receiver have to be restarted
+after the arrival of each packet?
+
+@item How are packets that are too short, too long, or received with
+CRC errors handled? Does the device automatically continue
+reception or does the driver have to intervene?
+
+@item How is the device Ethernet address set? How is the device
+programmed to accept or reject broadcast and multicast packets?
+
+@item What interrupts does the device generate? Does it generate an
+interrupt for each incoming packet, or only for packets received
+without error? Does it generate an interrupt for each packet
+transmitted, or only when the transmit queue is empty? What
+happens when a transmit error is detected?
+
+@end itemize
+
+In addition, some controllers have specific questions regarding
+board specific configuration. For example, the SONIC Ethernet
+controller has a very configurable data bus interface. It can
+even be configured for sixteen and thirty-two bit data buses. This
+type of information should be obtained from the board vendor.
+
+@section Understand the network scheduling conventions
+
+When writing code for your driver transmit and receive tasks you must
+take care to follow the network scheduling conventions. All tasks
+which are associated with networking share various
+data structures and resources. To ensure the consistency
+of these structures the tasks
+execute only when they hold the network semaphore (@code{rtems_bsdnet_semaphore}).
+Your transmit and receive tasks must abide by this protocol which means you must
+be careful to avoid `deadly embraces' with the other network tasks.
+A number of routines are provided to make it easier for your code
+to conform to the network task scheduling conventions.
+
+@itemize @bullet
+
+@item @code{void rtems_bsdnet_semaphore_release(void)}
+
+This function releases the network semaphore.
+Your task must call this function immediately before
+making any blocking RTEMS request.
+
+@item @code{void rtems_bsdnet_semaphore_obtain(void)}
+
+This function obtains the network semaphore.
+If your task has released the network semaphore to allow other
+network-related tasks to run while your task blocks you must call this
+function to reobtain the semaphore immediately after the return from the
+blocking RTEMS request.
+
+@item @code{rtems_bsdnet_event_receive(rtems_event_set, rtems_option, rtems_interval, rtems_event_set *)}
+Your task should call this function when it wishes to wait for an event.
+This function releases the network semaphore,
+calls @code{rtems_event_receive} to wait for the specified event
+or events and reobtains the semaphore.
+The value returned is the value returned by the @code{rtems_event_receive}.
+
+@end itemize
+
+@section Write your driver attach function
+The driver attach function is responsible for configuring the driver
+and making the connection between the network stack
+and the driver.
+
+Driver attach functions take a pointer to an
+@code{rtems_bsdnet_ifconfig} structure as their only argument.
+and set the driver parameters based on the
+values in this structure. If an entry in the configuration
+structure is zero the attach function chooses an
+appropriate default value for that parameter.
+
+
+The driver should then set up several fields in the ifnet structure
+in the device-dependent data structure supplied and maintained by the driver:
+
+@table @code
+@item ifp->if_softc
+Pointer to the device-dependent data. The first entry
+in the device-dependent data structure must be an @code{arpcom}
+structure.
+
+@item ifp->if_name
+The name of the device. The network stack uses this string
+and the device number for device name lookups.
+
+@item ifp->if_unit
+The device number. The network stack uses this number and the
+device name for device name lookups. For example, if
+@code{ifp->if_name} is @samp{scc}, and @code{ifp->if_unit} is @samp{1},
+the full device name would be @samp{scc1}.
+
+@item ifp->if_mtu
+The maximum transmission unit for the device. For Ethernet
+devices this value should almost always be 1500.
+
+@item ifp->if_flags
+The device flags. Ethernet devices should set the flags
+to @code{IFF_BROADCAST|IFF_SIMPLEX}, indicating that the
+device can broadcast packets to multiple destinations
+and does not receive and transmit at the same time.
+
+@item ifp->if_snd.ifq_maxlen
+The maximum length of the queue of packets waiting to be
+sent to the driver. This is normally set to @code{ifqmaxlen}.
+
+@item ifp->if_init
+The address of the driver initialization function.
+
+@item ifp->if_start
+The address of the driver start function.
+
+@item ifp->if_ioctl
+The address of the driver ioctl function.
+
+@item ifp->if_output
+The address of the output function. Ethernet devices
+should set this to @code{ether_output}.
+@end table
+
+Once the attach function has set up the above entries it must link the
+driver data structure onto the list of devices by
+calling @code{if_attach}. Ethernet devices should then
+call @code{ether_ifattach}. Both functions take a pointer to the
+device's @code{ifnet} structure as their only argument.
+
+The attach function should return a non-zero value to indicate that
+the driver has been successfully configured and attached.
+
+
+
+
+@section Write your driver start function.
+This function is called each time the network stack wants to start the
+transmitter. This occures whenever the network stack adds a packet
+to a device's send queue and the @code{IFF_OACTIVE} bit in the
+device's @code{if_flags} is not set.
+
+For many devices this function need only set the @code{IFF_OACTIVE} bit in the
+@code{if_flags} and send an event to the transmit task
+indicating that a packet is in the driver transmit queue.
+
+
+@section Write your driver initialization function.
+This function should initialize the device, attach to interrupt handler,
+and start the driver transmit and receive tasks. The function
+
+@example
+rtems_id
+rtems_bsdnet_newproc (char *name,
+ int stacksize,
+ void(*entry)(void *),
+ void *arg);
+@end example
+
+should be used to start the driver tasks.
+
+Note that the network stack may call the driver initialization function more
+than once.
+Make sure you don't start multiple versions of the receive and transmit tasks.
+
+
+
+@section Write your driver transmit task.
+This task is reponsible for removing packets from the driver send queue and sending them to the device. The task should block waiting for an event from the
+driver start function indicating that packets are waiting to be transmitted.
+When the transmit task has drained the driver send queue the task should clear
+the @code{IFF_OACTIVE} bit in @code{if_flags} and block until another outgoing
+packet is queued.
+
+
+@section Write your driver receive task.
+This task should block until a packet arrives from the device. If the
+device is an Ethernet interface the function @code{ether_input} should be called
+to forward the packet to the network stack. The arguments to @code{ether_input}
+are a pointer to the interface data structure, a pointer to the ethernet
+header and a pointer to an mbuf containing the packet itself.
+
+
+
+
+@section Write your driver interrupt handler.
+A typical interrupt handler will do nothing more than the hardware
+manipulation required to acknowledge the interrupt and send an RTEMS event
+to wake up the driver receive or transmit task waiting for the event.
+Network interface interrupt handlers must not make any calls to other
+network routines.
+
+
+
+@section Write your driver ioctl function.
+This function handles ioctl requests directed at the device. The ioctl
+commands which must be handled are:
+
+@table @code
+@item SIOCGIFADDR
+@item SIOCSIFADDR
+If the device is an Ethernet interface these
+commands should be passed on to @code{ether_ioctl}.
+
+@item SIOCSIFFLAGS
+This command should be used to start or stop the device,
+depending on the state of the interface @code{IFF_UP} and
+@code{IFF_RUNNING} bits in @code{if_flags}:
+@table @code
+@item IFF_RUNNING
+Stop the device.
+
+@item IFF_UP
+Start the device.
+
+@item IFF_UP|IFF_RUNNING
+Stop then start the device.
+
+@item 0
+Do nothing.
+
+@end table
+@end table
+
+
+
+@section Write your driver statistic-printing function
+This function should print the values of any statistic/diagnostic
+counters your driver may use. The driver ioctl function should call
+the statistic-printing function when the ioctl command is
+@code{SIO_RTEMS_SHOW_STATS}.
+
+
diff --git a/doc/networking/network.texi b/doc/networking/network.texi
new file mode 100644
index 0000000000..87867a522f
--- /dev/null
+++ b/doc/networking/network.texi
@@ -0,0 +1,107 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename ka9q
+@syncodeindex vr fn
+@synindex ky cp
+@paragraphindent 0
+@c @smallbook
+@c %**end of header
+
+@c
+@c COPYRIGHT (c) 1988-1998.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c
+@c Master file for the network Supplement
+@c
+
+@include ../common/setup.texi
+
+@ignore
+@ifinfo
+@format
+START-INFO-DIR-ENTRY
+* RTEMS Network Supplement:
+END-INFO-DIR-ENTRY
+@end format
+@end ifinfo
+@end ignore
+
+@c
+@c Title Page Stuff
+@c
+
+@set edition @value{RTEMS-EDITION}
+@set version @value{RTEMS-VERSION}
+@set update-date @value{RTEMS-UPDATE-DATE}
+@set update-month @value{RTEMS-UPDATE-MONTH}
+
+@c
+@c I don't really like having a short title page. --joel
+@c
+@c @shorttitlepage RTEMS Network Supplement
+
+@setchapternewpage odd
+@settitle RTEMS Network Supplement
+@titlepage
+@finalout
+
+@title RTEMS Network Supplement
+@subtitle Edition @value{edition}, for RTEMS @value{version}
+@sp 1
+@subtitle @value{update-month}
+@author On-Line Applications Research Corporation
+@page
+@include ../common/cpright.texi
+@end titlepage
+
+@c This prevents a black box from being printed on "overflow" lines.
+@c The alternative is to rework a sentence to avoid this problem.
+
+@include preface.t
+@include networktasks.t
+@include driver.t
+@include networkapp.t
+@c@include testing.texi
+@ifinfo
+@node Top, Preface, (dir), (dir)
+@top ka9q
+
+This is the online version of the RTEMS Network Supplement.
+
+@menu
+* Preface::
+* Network Task Structure and Data Flow::
+* Writing RTEMS Network Device Drivers::
+* Using Networking in an RTEMS Application::
+* Testing the Driver::
+* Command and Variable Index::
+* Concept Index::
+@end menu
+
+@end ifinfo
+@c
+@c
+@c Need to copy the emacs stuff and "trailer stuff" (index, toc) into here
+@c
+
+@node Command and Variable Index, Concept Index, Testing the Driver Throughput, Top
+@unnumbered Command and Variable Index
+
+There are currently no Command and Variable Index entries.
+
+@c @printindex fn
+
+@node Concept Index, , Command and Variable Index, Top
+@unnumbered Concept Index
+
+There are currently no Concept Index entries.
+@c @printindex cp
+
+@c @contents
+@bye
+
diff --git a/doc/networking/networkapp.t b/doc/networking/networkapp.t
new file mode 100644
index 0000000000..778cf51400
--- /dev/null
+++ b/doc/networking/networkapp.t
@@ -0,0 +1,250 @@
+@c
+@c Written by Eric Norum
+@c
+@c COPYRIGHT (c) 1988-1998.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Using networking in an RTEMS application
+
+@section Makefile changes
+@subsection Including the required managers
+The KA9Q networking code requires several RTEMS managers
+in the application:
+
+@example
+MANAGERS = io event semaphore
+@end example
+
+@subsection Increasing the size of the heap
+The networking tasks allocate a lot of memory. For most applications
+the heap should be at least 256 kbytes.
+The amount of memory set aside for the heap can be adjusted by setting
+the @code{CFLAGS_LD} definition as shown below:
+
+@example
+CFLAGS_LD += -Wl,--defsym -Wl,HeapSize=0x80000
+@end example
+
+This sets aside 512 kbytes of memory for the heap.
+
+@section System Configuration
+
+The networking tasks allocate some RTEMS objects. These
+must be accounted for in the application configuration table. The following
+lists the requirements.
+
+@table @b
+@item TASKS
+One network task plus a receive and transmit task for each device.
+
+@item SEMAPHORES
+One network semaphore plus one syslog mutex semaphore if the application uses
+openlog/syslog.
+
+@item EVENTS
+The network stack uses @code{RTEMS_EVENT_24} and @code{RTEMS_EVENT_25}.
+This has no effect on the application configuration, but
+application tasks which call the network functions should not
+use these events for other purposes.
+
+@end table
+
+@section Initialization
+@subsection Additional include files
+The source file which declares the network configuration
+structures and calls the network initialization function must include
+
+@example
+#include <rtems_bsdnet.h>
+@end example
+
+@subsection Network configuration
+The network configuration is specified by declaring
+and initializing the @code{rtems_bsdnet_configuration}
+structure. This structure may be declared @code{const} since the
+network initialization functions do not write to any of the entries.
+
+The structure entries are described in the following table.
+If your application uses BOOTP to obtain network configuration
+information and if you are happy with the default values described
+below, you need to provide only the first two entries in this structure.
+
+@table @code
+
+@item struct rtems_bsdnet_ifconfig *ifconfig
+A pointer to the first configuration structure of the first network
+device. This structure is described in the following section.
+You must provide a value for this entry since there is no default value for it.
+
+
+@item void (*bootp)(void)
+This entry should be set to @code{rtems_bsdnet_do_bootp}
+if your application will use BOOTP to obtain network configuration information.
+It should be set to @code{NULL}
+if your application does not use BOOTP.
+
+
+@item int network_task_priority
+The priority at which the network task and network device
+receive and transmit tasks will run.
+If a value of 0 is specified the tasks will run at priority 100.
+
+@item unsigned long mbuf_bytecount
+The number of bytes to allocate from the heap for use as mbufs.
+If a value of 0 is specified, 64 kbytes will be allocated.
+
+@item unsigned long mbuf_cluster_bytecount
+The number of bytes to allocate from the heap for use as mbuf clusters.
+If a value of 0 is specified, 128 kbytes will be allocated.
+
+@item char *hostname
+The host name of the system.
+If this entry is @code{NULL} the host name,
+and all the remaining values specified by the @code{rtems_bsdnet_configuration}
+structure will be obtained from a BOOTP server.
+
+@item char *domainname
+The name of the Internet domain to which the system belongs.
+
+@item char *gateway
+The Internet host number of the network gateway machine,
+specified in `dotted decimal' (@code{129.128.4.1}) form.
+
+@item char *log_host
+The Internet host number of the machine to which @code{syslog} messages
+will be sent.
+
+@item char *name_server
+The Internet host number of up to three machines to be used as
+Internet Domain Name Servers.
+
+@end table
+
+@example
+rtems_task_set_priority (RTEMS_SELF, 30, &oldPri);
+@end example
+
+@subsection Network device configuration
+Network devices are specified and configured by declaring and initializing a
+@code{struct rtems_bsdnet_ifcontig} structure for each network device.
+These structures may be declared @code{const} since the
+network initialization functions do not write to any of the entries.
+
+The structure entries are described in the following table. An application
+which uses a single network interface, gets network configuration information
+from a BOOTP server, and uses the default values for all driver
+parameters needs to initialize only the first two entries in the
+structure.
+
+@table @code
+@item char *name
+The full name of the network device. This name consists of the
+driver name and the unit number (e.g. @code{"scc1"}).
+
+@item int (*attach)(struct rtems_bsdnet_ifconfig *conf)
+The address of the driver @code{attach} function. The network
+initialization function calls this function to configure the driver and
+attach it to the network stack.
+
+@item struct rtems_bsdnet_ifconfig *next
+A pointer to the network device configuration structure for the next network
+interface, or @code{NULL} if this is the configuration structure of the
+last network interface.
+
+@item char *ip_address
+The Internet address of the device,
+specified in `dotted decimal' (@code{129.128.4.2}) form, or @code{NULL}
+if the device configuration information is being obtained from a
+BOOTP server.
+
+@item char *ip_netmask
+The Internet inetwork mask of the device,
+specified in `dotted decimal' (@code{255.255.255.0}) form, or @code{NULL}
+if the device configuration information is being obtained from a
+BOOTP server.
+
+
+@item void *hardware_address
+The hardware address of the device, or @code{NULL} if the driver is
+to obtain the hardware address in some other way (usually by reading
+it from the device or from the bootstrap ROM).
+
+@item int ignore_broadcast
+Zero if the device is to accept broadcast packets, non-zero if the device
+is to ignore broadcast packets.
+
+@item int mtu
+The maximum transmission unit of the device, or zero if the driver
+is to choose a default value (typically 1500 for Ethernet devices).
+
+@item int rbuf_count
+The number of receive buffers to use, or zero if the driver is to
+choose a default value
+
+@item int xbuf_count
+The number of transmit buffers to use, or zero if the driver is to
+choose a default value
+Keep in mind that some network devices may use 4 or more
+transmit descriptors for a single transmit buffer.
+
+@end table
+
+
+@subsection Network initialization
+The networking tasks must be started before any
+network I/O operations can be performed. This is done by calling:
+@example
+rtems_bsdnet_initialize_network ();
+@end example
+
+
+@section Application code
+The RTEMS network package provides almost a complete set of BSD network
+services. The network functions work like their BSD counterparts
+with the following exceptions:
+
+@itemize
+@item A given socket can be read or written by only one task at a time.
+@item There is no @code{select} function.
+@item You must call @code{openlog} before calling any of the @code{syslog} functions.
+@item @b{Some of the network functions are not thread-safe.}
+For example the following functions return a pointer to a static
+buffer which remains valid only until the next call:
+
+@table @code
+@item gethostbyaddr
+@item gethostbyname
+@item inet_ntoa
+(@code{inet_ntop} is thread-safe, though).
+@end table
+@end itemize
+
+@subsection Network statistics
+There are a number of functions to print statistics gathered by the network stack:
+@table @code
+@item rtems_bsdnet_show_if_stats
+Display statistics gathered by network interfaces.
+
+@item rtems_bsdnet_show_ip_stats
+Display IP packet statistics.
+
+@item rtems_bsdnet_show_icmp_stats
+Display ICMP packet statistics.
+
+@item rtems_bsdnet_show_tcp_stats
+Display TCP packet statistics.
+
+@item rtems_bsdnet_show_udp_stats
+Display UDP packet statistics.
+
+@item rtems_bsdnet_show_mbuf_stats
+Display mbuf statistics.
+
+@item rtems_bsdnet_show_inet_routes
+Display the routing table.
+
+@end table
diff --git a/doc/networking/networking.eps b/doc/networking/networking.eps
new file mode 100644
index 0000000000..8aba78d55f
--- /dev/null
+++ b/doc/networking/networking.eps
@@ -0,0 +1,1343 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title:
+%%Creator: Diagram
+%%CreationDate: Tue Aug 18 16:41:45 1998
+%%For: eric
+%%DocumentFonts: (atend)
+%%Pages: 0 0
+%%BoundingBox: 0 0 487 549
+%%NXNextStepVersion: 3.0
+%%EndComments
+
+%%BeginProcSet: /usr/lib/NextStep/printPackage.ps 3.0
+%!
+% NeXT Printing Package
+% Version: 3.1
+% Copyright: 1988, NeXT, Inc.
+
+/__NXdef{1 index where{pop pop pop}{def}ifelse}bind def
+/__NXbdef{1 index where{pop pop pop}{bind def}ifelse}bind def
+/UserObjects 10 array __NXdef
+/defineuserobject{
+ exch dup 1 add dup UserObjects length gt{
+ array dup 0 UserObjects putinterval
+ /UserObjects exch def
+ }{pop}ifelse UserObjects exch 3 -1 roll put
+}__NXbdef
+/undefineuserobject{UserObjects exch null put}__NXbdef
+/execuserobject{UserObjects exch get exec}__NXbdef
+/__NXRectPath{4 2 roll moveto 1 index 0 rlineto
+0 exch rlineto neg 0 rlineto closepath}__NXbdef
+/__NXProcessRectArgs{
+ 1 index type /arraytype eq{
+ exch 0 4 2 index length 1 sub{
+ dup 3 add 1 exch{1 index exch get exch}for
+ 5 1 roll 5 index exec
+ }for pop pop
+ }{exec}ifelse
+}__NXbdef
+/rectfill{gsave newpath {__NXRectPath fill} __NXProcessRectArgs grestore}__NXbdef
+/rectclip{newpath {__NXRectPath} __NXProcessRectArgs clip newpath}__NXbdef
+/rectstroke{
+ gsave newpath dup type /arraytype eq{dup length 6 eq}{false}ifelse{
+ {gsave __NXRectPath null concat stroke grestore}
+ dup length array cvx copy dup 2 4 -1 roll put __NXProcessRectArgs
+ }{{__NXRectPath stroke} __NXProcessRectArgs}ifelse grestore
+}__NXbdef
+/_NXLevel2 systemdict /languagelevel known {languagelevel 2 ge}{false}ifelse __NXdef
+/xyshow{
+ 0 1 3 index length 1 sub{
+ currentpoint 4 index 3 index 1 getinterval show
+ 3 index 3 index 2 mul 1 add get add exch
+ 3 index 3 index 2 mul get add exch moveto pop
+ }for pop pop
+}__NXbdef
+/xshow{
+ 0 1 3 index length 1 sub{
+ currentpoint 4 index 3 index 1 getinterval show
+ exch 3 index 3 index get add exch moveto pop
+ }for pop pop
+}__NXbdef
+/yshow{
+ 0 1 3 index length 1 sub{
+ currentpoint 4 index 3 index 1 getinterval show
+ 3 index 3 index get add moveto pop
+ }for pop pop
+}__NXbdef
+/arct{arcto pop pop pop pop}__NXbdef
+/setbbox{pop pop pop pop}__NXbdef
+/ucache{}__NXbdef
+/ucachestatus{mark 0 0 0 0 0}__NXbdef
+/setucacheparams{cleartomark}__NXbdef
+/uappend{systemdict begin cvx exec end}__NXbdef
+/ueofill{gsave newpath uappend eofill grestore}__NXbdef
+/ufill{gsave newpath uappend fill grestore}__NXbdef
+/ustroke{
+ gsave newpath dup length 6 eq
+ {exch uappend concat}{uappend}ifelse
+ stroke grestore
+}__NXbdef
+/__NXustrokepathMatrix dup where {pop pop}{matrix def}ifelse
+/ustrokepath{
+ newpath dup length 6 eq{
+ exch uappend __NXustrokepathMatrix currentmatrix exch concat
+ strokepath setmatrix
+ }{uappend strokepath}ifelse
+} __NXbdef
+/upath{
+ [exch {/ucache cvx}if pathbbox /setbbox cvx
+ {/moveto cvx}{/lineto cvx}{/curveto cvx}{/closepath cvx}pathforall]cvx
+} __NXbdef
+/setstrokeadjust{pop}__NXbdef
+/currentstrokeadjust{false}__NXbdef
+/selectfont{exch findfont exch
+dup type /arraytype eq {makefont}{scalefont}ifelse setfont}__NXbdef
+/_NXCombineArrays{
+ counttomark dup 2 add index dup length 3 -1 roll {
+ 2 index length sub dup 4 1 roll 1 index exch 4 -1 roll putinterval exch
+ }repeat pop pop pop
+}__NXbdef
+/flushgraphics{}def
+/setwindowtype{pop pop}def
+/currentwindowtype{pop 0}def
+/setalpha{pop}def
+/currentalpha{1.0}def
+/hidecursor{}def
+/obscurecursor{}def
+/revealcursor{}def
+/setcursor{4 {pop}repeat}bind def
+/showcursor{}def
+/NextStepEncoding where not{
+/NextStepEncoding StandardEncoding 256 array copy def
+0 [129/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/Ccedilla/Egrave
+/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis
+/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/Ugrave/Uacute
+/Ucircumflex/Udieresis/Yacute/Thorn/mu/multiply/divide/copyright
+176/registered 181/brokenbar 190/logicalnot 192/onesuperior 201/twosuperior
+204/threesuperior 209/plusminus/onequarter/onehalf/threequarters/agrave
+/aacute/acircumflex/atilde/adieresis/aring/ccedilla/egrave/eacute
+/ecircumflex/edieresis/igrave 226/iacute 228/icircumflex/idieresis/eth
+/ntilde 236/ograve/oacute/ocircumflex/otilde/odieresis 242/ugrave/uacute
+/ucircumflex 246/udieresis/yacute 252/thorn/ydieresis]
+{dup type /nametype eq
+ {NextStepEncoding 2 index 2 index put pop 1 add}{exch pop}ifelse
+}forall pop
+/NextStepEncoding NextStepEncoding readonly def
+/_NXfstr 128 string dup 0 (_NX) putinterval def
+/_NXfindfont /findfont load def
+/findfont{
+ % Because we can never let NextStepEncoding get into
+ % SharedFontDirectory, we cannot reencode a font to NextStepEncoding
+ % if we are in shared mode. So if currentshared is true,
+ % we call the normal findfont and return that
+ /currentshared where {pop currentshared} {false} ifelse
+ {_NXfindfont}
+ {dup _NXfstr 3 125 getinterval cvs length 3 add _NXfstr 0 3 -1 roll
+ getinterval cvn exch FontDirectory 2 index known
+ {pop FontDirectory exch get}
+ {_NXfindfont dup /Encoding get StandardEncoding eq
+ { dup length dict exch
+ {1 index /FID ne {2 index 3 1 roll put}{pop pop}ifelse}forall
+ dup /Encoding NextStepEncoding put definefont
+ }{exch pop} ifelse
+ }ifelse
+ }ifelse
+}bind def
+}{pop}ifelse
+/_NXImageString {/__NXImageString where{pop}{/__NXImageString 4000 string __NXdef}ifelse __NXImageString}__NXbdef
+/_NXDoImageOp{
+ 3 dict begin /parr 5 array def 1 index{dup}{1}ifelse /chans exch def
+ chans 2 add 2 roll parr 0 chans getinterval astore pop
+ 5 index 4 index mul 2 index{1 sub 8 idiv 1 add mul}{mul 1 sub 8 idiv 1 add}ifelse
+ 4 index mul /totbytes exch def pop exch pop
+ gsave matrix invertmatrix concat 0.5 setgray 0 0 4 2 roll rectfill grestore
+ {0 1 chans 1 sub{parr exch get exec length totbytes exch sub /totbytes exch def}for totbytes 0 le{exit}if}loop end
+}__NXbdef
+/alphaimage{1 add _NXDoImageOp}def
+_NXLevel2{
+ /NXCalibratedRGBColorSpace where{pop}{
+ /NXCalibratedRGBColorSpace
+ {mark /NXCalibratedRGB /ColorSpace findresource exch pop}stopped
+ {cleartomark /NXCalibratedRGB[/CIEBasedABC 2 dict dup begin
+ /MatrixLMN[.4124 .2126 .0193 .3576 .7152 .1192 .1805 .0722 .9505]def
+ /WhitePoint[.9505 1 1.089] def end] /ColorSpace defineresource}if def}ifelse
+ /nxsetrgbcolor{NXCalibratedRGBColorSpace setcolorspace setcolor}__NXbdef
+ /nxsetgray{dup dup nxsetrgbcolor}__NXbdef
+ /_NXCalibratedImage{exch{array astore dup length true}{false}ifelse
+ 8 -1 roll{NXCalibratedRGBColorSpace setcolorspace}if
+ 8 dict dup 9 1 roll begin /ImageType 1 def /MultipleDataSources exch def
+ currentcolorspace 0 get /Indexed eq{pop /Decode[0 2 6 index exp 1 sub]def}
+ {2 mul dup array /Decode exch def 1 sub 0 1 3 -1 roll{Decode exch dup 2 mod put}for}ifelse
+ /DataSource exch def /ImageMatrix exch def
+ /BitsPerComponent exch def /Height exch def /Width exch def end image}__NXbdef
+} {
+ /setcmykcolor{
+ 1.0 exch sub dup dup 6 -1 roll sub dup 0 lt{pop 0}if 5 1 roll
+ 4 -1 roll sub dup 0 lt{pop 0}if 3 1 roll exch sub dup 0 lt{pop 0}if setrgbcolor}__NXbdef
+ /currentcmykcolor{currentrgbcolor 3{1.0 exch sub 3 1 roll}repeat 0}__NXbdef
+ /colorimage{2 copy 3 ne or{_NXDoImageOp}{4 index dup 8 ne exch 4 ne and{_NXDoImageOp}{
+ pop pop save 6 1 roll 12 dict begin/Proc exch def/Res 0 string def
+ /Alloc{2 index length mul 2 add dup 2 index load length gt{1.2 mul round cvi string def}{pop pop}ifelse}def
+ 1 index 8 eq{/Unpack{.34 Alloc}def}{
+ /Wid 4 index 3 mul def exch pop 8 exch/Str1 0 string def/Lim Wid def
+ /Unpack{.67 Alloc/Str1 2 Alloc 0 exch Lim exch
+ {dup -4 bitshift 17 mul Str1 exch 4 index exch put 15 and 17 mul Str1 exch 3 index 1 add exch put
+ 2 sub dup 0 le{0 lt Wid exch{exch 1 sub exch}if}if exch 2 add exch
+ }forall/Lim exch def Str1 exch 0 exch getinterval
+ }def
+ }ifelse
+ /Ops[{.3 mul add 1}{.59 mul add 2}{.11 mul add round cvi Res exch 2 index exch put 1 add 0.0 0}]def/Val 0.0 def/Phase 0 def
+ {0 Val Phase Proc/Res Unpack{exch Ops exch get exec}forall/Phase exch def/Val exch def Res exch 0 exch getinterval}
+ image end restore}ifelse}ifelse
+ }__NXbdef
+ /nxsetrgbcolor{setrgbcolor}__NXbdef /nxsetgray{setgray}__NXbdef
+ /setpattern{pop .5 setgray}__NXbdef
+ /_NXCalibratedImage{dup 1 eq {pop pop image}{colorimage}ifelse pop}__NXbdef
+} ifelse
+/_NXSetCMYKOrRGB where{pop}{
+ mark{systemdict /currentwindow get exec}stopped
+ {{pop pop pop setcmykcolor}}{{nxsetrgbcolor pop pop pop pop}}ifelse /_NXSetCMYKOrRGB exch def cleartomark
+}ifelse
+%%EndProcSet
+
+gsave
+ /__NXbasematrix matrix currentmatrix def
+grestore
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+gsave
+0 0 488 549 rectclip
+[1 0 0 -1 -26.5 567] concat
+26.5 18 487 549 rectclip
+gsave
+36 306 306 261 rectclip
+0 nxsetgray
+1 setlinewidth
+[6] 1 setdash
+36.5 306.5 305 260 rectstroke
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+58 418 166 472 setbbox
+68.800003 418 moveto
+155.200012 428.799988 10.8 -90 0 arc
+155.200012 461.199982 10.8 0 90 arc
+68.800003 461.199982 10.8 90 180 arc
+68.800003 428.799988 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+58 418 166 472 setbbox
+69.300003 418.5 moveto
+154.700012 429.299988 10.8 -90 0 arc
+154.700012 460.699982 10.8 0 90 arc
+69.300003 460.699982 10.8 90 180 arc
+69.300003 429.299988 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+58 418 166 472 setbbox
+69.300003 419 moveto
+154.700012 429.299988 10.3 -90 0 arc
+154.700012 460.699982 10.3 0 90 arc
+69.300003 460.699982 10.3 90 180 arc
+69.300003 429.299988 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+54 414 162 468 setbbox
+65.300003 415 moveto
+150.700012 425.299988 10.3 -90 0 arc
+150.700012 456.699982 10.3 0 90 arc
+65.300003 456.699982 10.3 90 180 arc
+65.300003 425.299988 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+54 414 162 468 setbbox
+64.800003 414 moveto
+151.200012 424.799988 10.8 -90 0 arc
+151.200012 457.199982 10.8 0 90 arc
+64.800003 457.199982 10.8 90 180 arc
+64.800003 424.799988 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+54 414 162 468 setbbox
+65.300003 414.5 moveto
+150.700012 425.299988 10.8 -90 0 arc
+150.700012 456.699982 10.8 0 90 arc
+65.300003 456.699982 10.8 90 180 arc
+65.300003 425.299988 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+/Helvetica findfont 12 scalefont [1 0 0 -1 0 0] makefont
+8
+exch
+defineuserobject
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+84 430 moveto (Interface) show
+85 445 moveto (Receive) show
+84 460 moveto (Daemon) show
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+193 418 301 472 setbbox
+203.800003 418 moveto
+290.200012 428.799988 10.8 -90 0 arc
+290.200012 461.199982 10.8 0 90 arc
+203.800003 461.199982 10.8 90 180 arc
+203.800003 428.799988 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+193 418 301 472 setbbox
+204.300003 418.5 moveto
+289.700012 429.299988 10.8 -90 0 arc
+289.700012 460.699982 10.8 0 90 arc
+204.300003 460.699982 10.8 90 180 arc
+204.300003 429.299988 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+193 418 301 472 setbbox
+204.300003 419 moveto
+289.700012 429.299988 10.3 -90 0 arc
+289.700012 460.699982 10.3 0 90 arc
+204.300003 460.699982 10.3 90 180 arc
+204.300003 429.299988 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+189 414 297 468 setbbox
+200.300003 415 moveto
+285.700012 425.299988 10.3 -90 0 arc
+285.700012 456.699982 10.3 0 90 arc
+200.300003 456.699982 10.3 90 180 arc
+200.300003 425.299988 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+189 414 297 468 setbbox
+199.800003 414 moveto
+286.200012 424.799988 10.8 -90 0 arc
+286.200012 457.199982 10.8 0 90 arc
+199.800003 457.199982 10.8 90 180 arc
+199.800003 424.799988 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+189 414 297 468 setbbox
+200.300003 414.5 moveto
+285.700012 425.299988 10.8 -90 0 arc
+285.700012 456.699982 10.8 0 90 arc
+200.300003 456.699982 10.8 90 180 arc
+200.300003 425.299988 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+219 430 moveto (Interface) show
+219 445 moveto (Transmit) show
+219 460 moveto (Daemon) show
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+184 328 310 382 setbbox
+184 328 moveto
+100.800003 0 rlineto
+25.200001 54 rlineto
+-100.800003 0 rlineto
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+184.5 328.5 309.5 381.5 setbbox
+184.5 328.5 moveto
+100 0 rlineto
+25 53 rlineto
+-100 0 rlineto
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+185 329 309 381 setbbox
+185 329 moveto
+99.199997 0 rlineto
+24.799999 52 rlineto
+-99.199997 0 rlineto
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+181 325 305 377 setbbox
+181 325 moveto
+99.199997 0 rlineto
+24.799999 52 rlineto
+-99.199997 0 rlineto
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+180 324 306 378 setbbox
+180 324 moveto
+100.800003 0 rlineto
+25.200001 54 rlineto
+-100.800003 0 rlineto
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+180.5 324.5 305.5 377.5 setbbox
+180.5 324.5 moveto
+100 0 rlineto
+25 53 rlineto
+-100 0 rlineto
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+219 340.5 moveto (Interface) show
+224 355.5 moveto (Output) show
+224 370.5 moveto (Queue) show
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+193 184 108 54 rectclip
+1 setlinewidth
+193.5 184.5 107 53 rectstroke
+grestore
+194 185 106 52 rectfill
+1 nxsetgray
+190 181 106 52 rectfill
+gsave
+189 180 108 54 rectclip
+0 nxsetgray
+1 setlinewidth
+189.5 180.5 107 53 rectstroke
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+220 204 moveto (Network) show
+228 219 moveto (Code) show
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+242.999969 234 243.000031 316.299988 setbbox
+243.000031 234 moveto
+242.999969 316.299988 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[0 1 -1 0 567 81.000031] concat
+gsave
+newpath
+systemdict
+begin
+233.799973 319.5 242.999969 328.5 setbbox
+242.999969 324 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+242.999985 378 243.000031 406.299988 setbbox
+243.000031 378 moveto
+242.999985 406.299988 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[0 1 -1 0 657 171.000031] concat
+gsave
+newpath
+systemdict
+begin
+233.799973 409.5 242.999969 418.5 setbbox
+242.999969 414 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+193 22 301 76 setbbox
+203.800003 22 moveto
+290.200012 32.799999 10.8 -90 0 arc
+290.200012 65.199997 10.8 0 90 arc
+203.800003 65.199997 10.8 90 180 arc
+203.800003 32.799999 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+193 22 301 76 setbbox
+204.300003 22.5 moveto
+289.700012 33.299999 10.8 -90 0 arc
+289.700012 64.699997 10.8 0 90 arc
+204.300003 64.699997 10.8 90 180 arc
+204.300003 33.299999 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+193 22 301 76 setbbox
+204.300003 23 moveto
+289.700012 33.299999 10.3 -90 0 arc
+289.700012 64.699997 10.3 0 90 arc
+204.300003 64.699997 10.3 90 180 arc
+204.300003 33.299999 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+189 18 297 72 setbbox
+200.300003 19 moveto
+285.700012 29.299999 10.3 -90 0 arc
+285.700012 60.699997 10.3 0 90 arc
+200.300003 60.699997 10.3 90 180 arc
+200.300003 29.299999 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+189 18 297 72 setbbox
+199.800003 18 moveto
+286.200012 28.799999 10.8 -90 0 arc
+286.200012 61.200001 10.8 0 90 arc
+199.800003 61.200001 10.8 90 180 arc
+199.800003 28.799999 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+189 18 297 72 setbbox
+200.300003 18.5 moveto
+285.700012 29.299999 10.8 -90 0 arc
+285.700012 60.699997 10.8 0 90 arc
+200.300003 60.699997 10.8 90 180 arc
+200.300003 29.299999 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+229 34 moveto (User) show
+213 49 moveto (Application) show
+229 64 moveto (Task) show
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+346 121 472 175 setbbox
+346 121 moveto
+100.800003 0 rlineto
+25.200001 54 rlineto
+-100.800003 0 rlineto
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+346.5 121.5 471.5 174.5 setbbox
+346.5 121.5 moveto
+100 0 rlineto
+25 53 rlineto
+-100 0 rlineto
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+347 122 471 174 setbbox
+347 122 moveto
+99.199997 0 rlineto
+24.799999 52 rlineto
+-99.199997 0 rlineto
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+343 118 467 170 setbbox
+343 118 moveto
+99.199997 0 rlineto
+24.799999 52 rlineto
+-99.199997 0 rlineto
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+342 117 468 171 setbbox
+342 117 moveto
+100.800003 0 rlineto
+25.200001 54 rlineto
+-100.800003 0 rlineto
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+342.5 117.5 467.5 170.5 setbbox
+342.5 117.5 moveto
+100 0 rlineto
+25 53 rlineto
+-100 0 rlineto
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+386 133.5 moveto (Socket) show
+382 148.5 moveto (Receive) show
+384 163.5 moveto ( Queue) show
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+373 418 481 472 setbbox
+383.799988 418 moveto
+470.199982 428.799988 10.8 -90 0 arc
+470.199982 461.199982 10.8 0 90 arc
+383.799988 461.199982 10.8 90 180 arc
+383.799988 428.799988 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+373 418 481 472 setbbox
+384.299988 418.5 moveto
+469.699982 429.299988 10.8 -90 0 arc
+469.699982 460.699982 10.8 0 90 arc
+384.299988 460.699982 10.8 90 180 arc
+384.299988 429.299988 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+373 418 481 472 setbbox
+384.299988 419 moveto
+469.699982 429.299988 10.3 -90 0 arc
+469.699982 460.699982 10.3 0 90 arc
+384.299988 460.699982 10.3 90 180 arc
+384.299988 429.299988 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+369 414 477 468 setbbox
+380.299988 415 moveto
+465.699982 425.299988 10.3 -90 0 arc
+465.699982 456.699982 10.3 0 90 arc
+380.299988 456.699982 10.3 90 180 arc
+380.299988 425.299988 10.3 180 270 arc
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+369 414 477 468 setbbox
+379.799988 414 moveto
+466.199982 424.799988 10.8 -90 0 arc
+466.199982 457.199982 10.8 0 90 arc
+379.799988 457.199982 10.8 90 180 arc
+379.799988 424.799988 10.8 180 270 arc
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+369 414 477 468 setbbox
+380.299988 414.5 moveto
+465.699982 425.299988 10.8 -90 0 arc
+465.699982 456.699982 10.8 0 90 arc
+380.299988 456.699982 10.8 90 180 arc
+380.299988 425.299988 10.8 180 270 arc
+closepath
+end
+stroke
+grestore
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+400 437.5 moveto (Network) show
+399 452.5 moveto (Daemon) show
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+67 499 90 45 rectclip
+1 setlinewidth
+67.5 499.5 89 44 rectstroke
+grestore
+68 500 88 43 rectfill
+1 nxsetgray
+64 496 88 43 rectfill
+gsave
+63 495 90 45 rectclip
+0 nxsetgray
+1 setlinewidth
+63.5 495.5 89 44 rectstroke
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+86 508 moveto (Receive) show
+85 523 moveto (Interrupt) show
+gsave
+66 496 84 43 rectclip
+86 538 moveto (Handler) show
+grestore
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+202 499 90 45 rectclip
+1 setlinewidth
+202.5 499.5 89 44 rectstroke
+grestore
+203 500 88 43 rectfill
+1 nxsetgray
+199 496 88 43 rectfill
+gsave
+198 495 90 45 rectclip
+0 nxsetgray
+1 setlinewidth
+198.5 495.5 89 44 rectstroke
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+219 508 moveto (Transmit) show
+220 523 moveto (Interrupt) show
+gsave
+201 496 84 43 rectclip
+221 538 moveto (Handler) show
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+[1 6] 1 setdash
+gsave
+newpath
+systemdict
+begin
+108.000023 475.700012 108.000031 495 setbbox
+108.000023 495 moveto
+108.000031 475.700012 lineto
+end
+stroke
+grestore
+[] 0 setdash
+0 setlinejoin
+gsave
+[0 -1 1 0 -359.999969 576] concat
+gsave
+newpath
+systemdict
+begin
+98.800034 463.5 108.000031 472.5 setbbox
+108.000031 468 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+[1 6] 1 setdash
+gsave
+newpath
+systemdict
+begin
+243.000015 475.700012 243.000031 495 setbbox
+243.000015 495 moveto
+243.000031 475.700012 lineto
+end
+stroke
+grestore
+[] 0 setdash
+0 setlinejoin
+gsave
+[0 -1 1 0 -224.999969 711] concat
+gsave
+newpath
+systemdict
+begin
+233.800034 463.5 243.000031 472.5 setbbox
+243.000031 468 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+[6] 1 setdash
+gsave
+newpath
+systemdict
+begin
+27 90 513 90 setbbox
+27 90 moveto
+513 90 lineto
+end
+stroke
+grestore
+[] 0 setdash
+0 setlinejoin
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+304.700012 45 405.000031 117 setbbox
+405.000031 117 moveto
+405 45 lineto
+304.700012 45 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[-1 0 0 -1 594 90] concat
+gsave
+newpath
+systemdict
+begin
+287.799988 40.5 297 49.5 setbbox
+297 45 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+297 178.699997 405.000031 207 setbbox
+297 207 moveto
+315 207 lineto
+405 207 lineto
+405.000031 178.699997 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[0 -1 1 0 234.000031 576] concat
+gsave
+newpath
+systemdict
+begin
+395.800018 166.5 405.000031 175.5 setbbox
+405.000031 171 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0.333338 nxsetgray
+gsave
+0.333338 nxsetgray
+newpath
+systemdict
+begin
+400 247 472 301 setbbox
+472 295.600006 moveto
+0 -43.200001 rlineto
+472 249.419205 455.872009 247 436 247 curveto
+416.127991 247 400 249.419205 400 252.399994 curveto
+0 43.200001 rlineto
+400 298.580811 416.127991 301 436 301 curveto
+455.872009 301 472 298.580811 472 295.600006 curveto
+closepath
+end
+clip
+newpath
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+400.5 247.5 471.5 300.5 setbbox
+471.5 295.200012 moveto
+0 -42.400002 rlineto
+471.5 249.874405 455.596008 247.5 436 247.5 curveto
+416.403992 247.5 400.5 249.874405 400.5 252.800003 curveto
+0 42.400002 rlineto
+400.5 298.12558 416.403992 300.5 436 300.5 curveto
+455.596008 300.5 471.5 298.12558 471.5 295.199982 curveto
+closepath
+end
+stroke
+grestore
+gsave
+newpath
+systemdict
+begin
+400.5 247.5 471.5 300.5 setbbox
+471.5 252.800003 moveto
+471.5 255.725601 455.596008 258.100006 436 258.100006 curveto
+416.403992 258.100006 400.5 255.725601 400.5 252.800003 curveto
+end
+stroke
+grestore
+grestore
+gsave
+newpath
+systemdict
+begin
+401 248 471 300 setbbox
+471 294.799988 moveto
+0 -41.599998 rlineto
+471 250.329605 455.320007 248 436 248 curveto
+416.679993 248 401 250.329605 401 253.199997 curveto
+0 41.599998 rlineto
+401 297.67041 416.679993 300 436 300 curveto
+455.320007 300 471 297.67041 471 294.800018 curveto
+closepath
+end
+fill
+grestore
+1 nxsetgray
+gsave
+newpath
+systemdict
+begin
+397 244 467 296 setbbox
+467 290.799988 moveto
+0 -41.599998 rlineto
+467 246.329605 451.320007 244 432 244 curveto
+412.679993 244 397 246.329605 397 249.199997 curveto
+0 41.599998 rlineto
+397 293.67041 412.679993 296 432 296 curveto
+451.320007 296 467 293.67041 467 290.800018 curveto
+closepath
+end
+fill
+grestore
+gsave
+newpath
+systemdict
+begin
+396 243 468 297 setbbox
+468 291.600006 moveto
+0 -43.200001 rlineto
+468 245.419205 451.872009 243 432 243 curveto
+412.127991 243 396 245.419205 396 248.399994 curveto
+0 43.200001 rlineto
+396 294.580811 412.127991 297 432 297 curveto
+451.872009 297 468 294.580811 468 291.600006 curveto
+closepath
+end
+clip
+newpath
+0 nxsetgray
+1 setlinewidth
+gsave
+newpath
+systemdict
+begin
+396.5 243.5 467.5 296.5 setbbox
+467.5 291.200012 moveto
+0 -42.400002 rlineto
+467.5 245.874405 451.596008 243.5 432 243.5 curveto
+412.403992 243.5 396.5 245.874405 396.5 248.800003 curveto
+0 42.400002 rlineto
+396.5 294.12558 412.403992 296.5 432 296.5 curveto
+451.596008 296.5 467.5 294.12558 467.5 291.199982 curveto
+closepath
+end
+stroke
+grestore
+gsave
+newpath
+systemdict
+begin
+396.5 243.5 467.5 296.5 setbbox
+467.5 248.800003 moveto
+467.5 251.725601 451.596008 254.100006 432 254.100006 curveto
+412.403992 254.100006 396.5 251.725601 396.5 248.800003 curveto
+end
+stroke
+grestore
+grestore
+gsave
+8 execuserobject setfont
+0 nxsetgray
+8 execuserobject setfont
+0 nxsetgray
+411 266 moveto (Routing) show
+416 281 moveto (Table) show
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+304.304871 227.434952 388.695129 255.565048 setbbox
+304.304871 227.434952 moveto
+388.695129 255.565048 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[-0.948683 -0.316228 0.316228 -0.948683 507.607697 532.373413] concat
+gsave
+newpath
+systemdict
+begin
+287.799988 220.5 297 229.5 setbbox
+297 225 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+gsave
+[0.948683 0.316228 -0.316228 0.948683 101.908165 -111.986488] concat
+gsave
+newpath
+systemdict
+begin
+386.799988 253.5 396 262.5 setbbox
+396 258 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+242.999969 72 243.000031 172.300003 setbbox
+243.000031 72 moveto
+242.999969 172.300003 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[0 1 -1 0 422.999969 -62.999969] concat
+gsave
+newpath
+systemdict
+begin
+233.799973 175.5 242.999969 184.5 setbbox
+242.999969 180 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+0 nxsetgray
+1 setlinewidth
+2 setlinejoin
+gsave
+newpath
+systemdict
+begin
+108 207 181.300003 414 setbbox
+108.000031 414 moveto
+108 207 lineto
+181.300003 207 lineto
+end
+stroke
+grestore
+0 setlinejoin
+gsave
+[1 0 0 1 0 0] concat
+gsave
+newpath
+systemdict
+begin
+179.800003 202.5 189 211.5 setbbox
+189 207 moveto
+-9.2 4.5 rlineto
+1.5 -4.5 rlineto
+-1.5 -4.5 rlineto
+closepath
+end
+fill
+grestore
+grestore
+grestore
+%%Trailer
+%%DocumentFonts: Helvetica
diff --git a/doc/networking/networking.gif b/doc/networking/networking.gif
new file mode 100644
index 0000000000..b2ede8048f
--- /dev/null
+++ b/doc/networking/networking.gif
Binary files differ
diff --git a/doc/networking/networktasks.t b/doc/networking/networktasks.t
new file mode 100644
index 0000000000..88b3af09b2
--- /dev/null
+++ b/doc/networking/networktasks.t
@@ -0,0 +1,60 @@
+@c
+@c Written by Eric Norum
+@c
+@c COPYRIGHT (c) 1988-1998.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Network Task Structure and Data Flow
+
+A schematic diagram of the tasks and message @b{mbuf} queues in a
+simple RTEMS networking application is shown in the following
+figure:
+
+@ifset use-ascii
+@example
+@group
+NO ASCII VERSION OF THE TASKING FIGURE IS AVAILABLE
+@end group
+@end example
+@end ifset
+
+@ifset use-tex
+@c for now use the ascii version
+@example
+@group
+NO TEX VERSION OF THE TASKING FIGURE IS AVAILABLE
+@end group
+@end example
+@end ifset
+
+@ifset use-html
+@html
+<IMG SRC="networking.gif" ALIGN=CENTER
+ ALT="Network Task Structure and Data Flow">
+@end html
+@end ifset
+
+
+The transmit task for each network interface is normally blocked waiting
+for a packet to arrive in the transmit queue. Once a packet arrives, the
+transmit task may block waiting for an event from the transmit interrupt
+handler. The transmit interrupt handler sends an RTEMS event to the transmit
+task to indicate that transmit hardware resources have become available.
+
+The receive task for each network interface is normally blocked waiting
+for an event from the receive interrupt handler. When this event is received
+the receive task reads the packet and forwards it to the network stack
+for subsequent processing by the network task.
+
+The network task processes incoming packets and takes care of
+timed operations such as handling TCP timeouts and
+aging and removing routing table entries.
+
+The `Network code' contains routines which may run in the context of
+the user application tasks, the interface receive task or the network task.
+A network semaphore ensures that
+the data structures manipulated by the network code remain consistent.
diff --git a/doc/networking/preface.t b/doc/networking/preface.t
new file mode 100644
index 0000000000..4f76f1f0fc
--- /dev/null
+++ b/doc/networking/preface.t
@@ -0,0 +1,23 @@
+@c
+@c COPYRIGHT (c) 1988-1998.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@ifinfo
+@node Preface, Network Task Structure and Data Flow, Top, Top
+@end ifinfo
+@unnumbered Preface
+
+This document describes the RTEMS specific parts of the FreeBSD TCP/IP
+stack. Much of this documentation was written by Eric Norum
+@ifset use-html
+(@href{eric@@skatter.usask.ca,,,mailto:eric@@skatter.usask.ca})
+@end ifset
+@ifclear use-html
+(eric@@skatter.usask.ca)
+@end ifclear
+of the Saskatchewan Accelerator Laboratory
+who also ported the FreeBSD TCP/IP stack to RTEMS.
diff --git a/doc/networking/testing.t b/doc/networking/testing.t
new file mode 100644
index 0000000000..af1460ad2d
--- /dev/null
+++ b/doc/networking/testing.t
@@ -0,0 +1,175 @@
+@c
+@c Written by Eric Norum
+@c
+@c COPYRIGHT (c) 1988-1998.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+
+@chapter Testing the Driver
+
+@section Preliminary Setup
+
+The network used to test the driver should include at least:
+
+@itemize @bullet
+
+@item The hardware on which the driver is to run.
+It makes testing much easier if you can run a debugger to control
+the operation of the target machine.
+
+@item An Ethernet network analyzer or a workstation with an
+`Ethernet snoop' program such as @code{ethersnoop} or
+@code{tcpdump}.
+
+@item A workstation.
+
+@end itemize
+
+During early debug, you should consider putting the target, workstation,
+and snooper on a small network by themselves. This offers a few
+advantages:
+
+@itemize @bullet
+
+@item There is less traffic to look at on the snooper and for the target
+to process while bringing the driver up.
+
+@item Any serious errors will impact only your small network not a building
+or campus network. You want to avoid causing any unnecessary problems.
+
+@item Test traffic is easier to repeatably generate.
+
+@item Performance measurements are not impacted by other systems on
+the network.
+
+@end itemize
+
+@section Driver basic operation
+
+The network demonstration program @code{netdemo} may be used for these tests.
+
+@itemize @bullet
+
+@item Edit @code{networkconfig.h} to reflect the values for your network.
+
+@item Start with @code{RTEMS_USE_BOOTP} not defined.
+
+@item Edit @code{networkconfig.h} to configure the driver
+with an
+explicit Ethernet and Internet address and with reception of
+broadcast packets disabled:
+
+Verify that the program continues to run once the driver has been attached.
+
+@item Issue a @samp{u} command to send UDP
+packets to the `discard' port.
+Verify that the packets appear on the network.
+
+@item Issue a @samp{s} command to print the network and driver statistics.
+
+@item On a workstation, add a static route to the target system.
+
+@item On that same workstation try to `ping' the target system.
+Verify that the ICMP echo request and reply packets appear on the net.
+
+@item Remove the static route to the target system.
+Modify @code{networkconfig.h} to attach the driver
+with reception of broadcast packets enabled.
+Try to `ping' the target system again.
+Verify that ARP request/reply and ICMP echo request/reply packets appear
+on the net.
+
+@item Issue a @samp{t} command to send TCP
+packets to the `discard' port.
+Verify that the packets appear on the network.
+
+@item Issue a @samp{s} command to print the network and driver statistics.
+
+@item Verify that you can telnet to ports 24742
+and 24743 on the target system from one or more
+workstations on your network.
+
+@end itemize
+
+@section BOOTP operation
+
+Set up a BOOTP server on the network.
+Set define @code{RTEMS USE_BOOT} in @code{networkconfig.h}.
+Run the @code{netdemo} test program.
+Verify that the target system configures itself from the BOOTP server and
+that all the above tests succeed.
+
+@section Stress Tests
+
+Once the driver passes the tests described in the previous section it should
+be subjected to conditions which exercise it more
+thoroughly and which test its error handling routines.
+
+@subsection Giant packets
+
+@itemize @bullet
+@item Recompile the driver with @code{MAXIMUM_FRAME_SIZE} set to
+a smaller value, say 514.
+
+@item `Ping' the driver from another workstation and verify
+that frames larger than 514 bytes are correctly rejected.
+
+@item Recompile the driver with @code{MAXIMUM_FRAME_SIZE} restored to 1518.
+@end itemize
+
+@subsection Resource Exhaustion
+
+@itemize @bullet
+@item Edit @code{networkconfig.h}
+so that the driver is configured with just two receive and transmit descriptors.
+
+@item Compile and run the @code{netdemo} program.
+
+@item Verify that the program operates properly and that you can
+still telnet to both the ports.
+
+@item Display the driver statistics (Console `@code{s}' command or telnet
+`control-G' character) and verify that:
+
+@enumerate
+
+@item The number of transmit interrupts is non-zero.
+This indicates that all transmit descriptors have been in use at some time.
+
+@item The number of missed packets is non-zero.
+This indicates that all receive descriptors have been in use at some time.
+
+@end enumerate
+
+@end itemize
+
+@subsection Cable Faults
+
+@itemize @bullet
+@item Run the @code{netdemo} program.
+
+@item Issue a `@code{u}' console command to make the target machine transmit
+a bunch of UDP packets.
+
+@item While the packets are being transmitted, disconnect and reconnect the
+network cable.
+
+@item Display the network statistics and verify that the driver has
+detected the loss of carrier.
+
+@item Verify that you can still telnet to both ports on the target machine.
+
+@end itemize
+
+@subsection Throughput
+
+Run the @code{ttcp} network benchmark program.
+Transfer large amounts of data (100's of megabytes) to and from the target
+system.
+
+
+