From ab0c6890bf4ab674877448a1a60e1e4ceeb38a3c Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 19 Aug 1998 20:29:35 +0000 Subject: Baseline --- doc/networking/Makefile | 82 +++ doc/networking/driver.t | 281 +++++++++ doc/networking/network.texi | 107 ++++ doc/networking/networkapp.t | 250 ++++++++ doc/networking/networking.eps | 1343 +++++++++++++++++++++++++++++++++++++++++ doc/networking/networking.gif | Bin 0 -> 6274 bytes doc/networking/networktasks.t | 60 ++ doc/networking/preface.t | 23 + doc/networking/testing.t | 175 ++++++ 9 files changed, 2321 insertions(+) create mode 100644 doc/networking/Makefile create mode 100644 doc/networking/driver.t create mode 100644 doc/networking/network.texi create mode 100644 doc/networking/networkapp.t create mode 100644 doc/networking/networking.eps create mode 100644 doc/networking/networking.gif create mode 100644 doc/networking/networktasks.t create mode 100644 doc/networking/preface.t create mode 100644 doc/networking/testing.t (limited to 'doc') 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 +@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 Binary files /dev/null and b/doc/networking/networking.gif 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 +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. + + + -- cgit v1.2.3