summaryrefslogtreecommitdiffstats
path: root/share/doc/iso
diff options
context:
space:
mode:
authorrgrimes <rgrimes@FreeBSD.org>1994-05-30 19:09:18 +0000
committerrgrimes <rgrimes@FreeBSD.org>1994-05-30 19:09:18 +0000
commitb0d61785cae024b1f44119446a940ee14c9ac959 (patch)
tree5a495a583b002ae9e57f09848ae697160708c220 /share/doc/iso
parentd43599f73ba5858e573c7ad8b284f6a0808c5c93 (diff)
downloadFreeBSD-src-b0d61785cae024b1f44119446a940ee14c9ac959.zip
FreeBSD-src-b0d61785cae024b1f44119446a940ee14c9ac959.tar.gz
BSD 4.4 Lite Share Sources
Diffstat (limited to 'share/doc/iso')
-rw-r--r--share/doc/iso/README3
-rw-r--r--share/doc/iso/ucb/addr.nr155
-rw-r--r--share/doc/iso/ucb/def.nr144
-rw-r--r--share/doc/iso/ucb/intro.nr72
-rw-r--r--share/doc/iso/ucb/ipc.nr331
-rw-r--r--share/doc/iso/ucb/macros.nr50
-rw-r--r--share/doc/iso/ucb/net_serv.nr163
-rw-r--r--share/doc/iso/ucb/program.nr42
-rw-r--r--share/doc/iso/ucb/trans_serv.nr697
-rw-r--r--share/doc/iso/wisc/Makefile73
-rw-r--r--share/doc/iso/wisc/Outline18
-rw-r--r--share/doc/iso/wisc/TODO2
-rw-r--r--share/doc/iso/wisc/addr.nr155
-rw-r--r--share/doc/iso/wisc/appendix_a.nr51
-rw-r--r--share/doc/iso/wisc/appendix_b.nr10
-rw-r--r--share/doc/iso/wisc/debug.nr1043
-rw-r--r--share/doc/iso/wisc/def.nr144
-rwxr-xr-xshare/doc/iso/wisc/dogrn6
-rw-r--r--share/doc/iso/wisc/eicon.nr729
-rw-r--r--share/doc/iso/wisc/eicon.table5.1.orig.nr126
-rw-r--r--share/doc/iso/wisc/errors.nr363
-rw-r--r--share/doc/iso/wisc/esis_design.nr114
-rw-r--r--share/doc/iso/wisc/figs/CONS_primitives.nr77
-rw-r--r--share/doc/iso/wisc/figs/Makefile18
-rw-r--r--share/doc/iso/wisc/figs/NS_primitives.nr69
-rw-r--r--share/doc/iso/wisc/figs/TS_primitives.nr60
-rw-r--r--share/doc/iso/wisc/figs/addrfmt.nr22
-rw-r--r--share/doc/iso/wisc/figs/clnp_input.grn18
-rw-r--r--share/doc/iso/wisc/figs/clnp_input.gsrc338
-rw-r--r--share/doc/iso/wisc/figs/clnp_input.nr188
-rw-r--r--share/doc/iso/wisc/figs/clnp_output.grn18
-rw-r--r--share/doc/iso/wisc/figs/clnp_output.gsrc376
-rw-r--r--share/doc/iso/wisc/figs/clnp_output.nr233
-rw-r--r--share/doc/iso/wisc/figs/ecn_network.grn19
-rw-r--r--share/doc/iso/wisc/figs/ecn_network.gsrc288
-rw-r--r--share/doc/iso/wisc/figs/ecn_network.nr0
-rw-r--r--share/doc/iso/wisc/figs/ecn_queue.grn19
-rw-r--r--share/doc/iso/wisc/figs/ecn_queue.gsrc371
-rw-r--r--share/doc/iso/wisc/figs/ecn_queue.nr262
-rw-r--r--share/doc/iso/wisc/figs/ecn_vc.grn19
-rw-r--r--share/doc/iso/wisc/figs/ecn_vc.gsrc273
-rw-r--r--share/doc/iso/wisc/figs/ecn_vc.nr205
-rw-r--r--share/doc/iso/wisc/figs/func_units.grn18
-rw-r--r--share/doc/iso/wisc/figs/func_units.gsrc603
-rw-r--r--share/doc/iso/wisc/figs/func_units.nr0
-rw-r--r--share/doc/iso/wisc/figs/link_to_CONS_primitives.NR.DONT_REMOVE77
-rw-r--r--share/doc/iso/wisc/figs/link_to_TS_primitives.NR.DONT_REMOVE60
-rw-r--r--share/doc/iso/wisc/figs/mbufrcv.grn13
-rw-r--r--share/doc/iso/wisc/figs/mbufrcv.gsrc1006
-rw-r--r--share/doc/iso/wisc/figs/mbufrcv.nr504
-rw-r--r--share/doc/iso/wisc/figs/mbufsnd.grn13
-rw-r--r--share/doc/iso/wisc/figs/mbufsnd.gsrc534
-rw-r--r--share/doc/iso/wisc/figs/mbufsnd.nr284
-rw-r--r--share/doc/iso/wisc/figs/osi_addr.grn18
-rw-r--r--share/doc/iso/wisc/figs/osi_addr.gsrc62
-rw-r--r--share/doc/iso/wisc/figs/osi_addr.nr59
-rw-r--r--share/doc/iso/wisc/figs/tppt.grn18
-rw-r--r--share/doc/iso/wisc/figs/tppt.gsrc411
-rw-r--r--share/doc/iso/wisc/figs/tppt.gsrc.save335
-rw-r--r--share/doc/iso/wisc/figs/tppt.nr296
-rw-r--r--share/doc/iso/wisc/figs/trans_flow.grn20
-rw-r--r--share/doc/iso/wisc/figs/trans_flow.gsrc567
-rw-r--r--share/doc/iso/wisc/figs/trans_flow.nr274
-rw-r--r--share/doc/iso/wisc/figs/unix_ipc.grn18
-rw-r--r--share/doc/iso/wisc/figs/unix_ipc.gsrc1041
-rw-r--r--share/doc/iso/wisc/figs/unix_ipc.nr499
-rw-r--r--share/doc/iso/wisc/intro.nr76
-rw-r--r--share/doc/iso/wisc/ipc.nr372
-rw-r--r--share/doc/iso/wisc/macros.nr50
-rw-r--r--share/doc/iso/wisc/net_design.nr1139
-rw-r--r--share/doc/iso/wisc/net_serv.nr163
-rw-r--r--share/doc/iso/wisc/parts.nr39
-rwxr-xr-xshare/doc/iso/wisc/preview7
-rw-r--r--share/doc/iso/wisc/program.nr51
-rw-r--r--share/doc/iso/wisc/trans_design.nr1466
-rw-r--r--share/doc/iso/wisc/trans_serv.nr692
-rw-r--r--share/doc/iso/wiscman/arp.4p118
-rw-r--r--share/doc/iso/wiscman/clnp.4p91
-rw-r--r--share/doc/iso/wiscman/cons.4241
-rw-r--r--share/doc/iso/wiscman/cons.4p196
-rw-r--r--share/doc/iso/wiscman/if.4n136
-rw-r--r--share/doc/iso/wiscman/iso.4f87
-rw-r--r--share/doc/iso/wiscman/rvd.4p90
-rw-r--r--share/doc/iso/wiscman/tp.4p609
84 files changed, 19717 insertions, 0 deletions
diff --git a/share/doc/iso/README b/share/doc/iso/README
new file mode 100644
index 0000000..7f3c679
--- /dev/null
+++ b/share/doc/iso/README
@@ -0,0 +1,3 @@
+The documentation contained here is horribly out of
+date and not to be trusted. However, it's probably
+better than nothing at all.
diff --git a/share/doc/iso/ucb/addr.nr b/share/doc/iso/ucb/addr.nr
new file mode 100644
index 0000000..57eff30
--- /dev/null
+++ b/share/doc/iso/ucb/addr.nr
@@ -0,0 +1,155 @@
+.NC "NSAP Addresses & Routing"
+.sh 1 "OSI Address Formats"
+.pp
+ARGO supports an ISO address family, AF_ISO, in addition to the
+DoD Internet address family, AF_INET.
+Addresses in the family AF_ISO
+take the form described by ISO 8348/DAD2, which is an addendum to the
+OSI network service standard that describes network layer addressing.
+.sh 2 "ISO 8348/DAD2 Tutorial"
+.pp
+.\" FIGURE
+.\".so figs/osi_addr.nr
+.so ../wisc/figs/addrfmt.nr
+.CF
+shows the
+format of an OSI NSAP-address.
+The address has two major parts: the initial domain part
+(IDP) and the domain specific part (DSP). The IDP is further divided into
+two parts: the authority and format identifier (AFI) and the
+initial domain identifier (IDI). The AFI specifies the format of the
+IDI, the authority responsible for allocating values of the IDI, and
+the syntax of the DSP. The IDI specifies the network addressing domain
+from which DSP values are allocated, and the authority responsible for
+allocating DSP values.
+.sh 2 "Supported Formats"
+.pp
+ARGO supports three types of ISO NSAP-addresses:
+one type with AFI 37(hex) and two types with AFI 47(hex).
+.sh 3 "AFI 37"
+.pp
+This value of the AFI defines the IDI to be an X.121 address or DTE
+address.
+The DTE address is encoded in binary coded decimal.
+The DSP syntax is binary.
+This form is intended to be used when communicating
+across a public data network (PDN).
+The ARGO software and documentation
+refer to this type of NSAP-address as a
+\*(lqtype 37.\*(rq
+address.
+.sh 3 "AFI 47"
+.pp
+The value of 47 for the AFI defines the IDI to be a 4 digit International
+Code Designator (ICD) allocated according to ISO 6523.
+ARGO support two
+ICD values.
+.sh 4 "ICD 0004"
+.pp
+The ICD value of 0004 is assigned to OSINET,
+an experimental OSI network overseen by
+National Institute of Science and Technology.\**
+.(f
+\** formerly the National Bureau of Standards
+.)f
+When this style of NSAP-address
+is used,
+the DSP is divided into four parts: an organization identifier (2 bytes),
+a subnet identifier (2 bytes),
+an SNPA-part (4-8 bytes), and
+an NSAP selector (1 byte).
+The use of these fields is defined by the OSINET steering committee.
+This type of address is known as an
+\*(lqOSINET\*(rq
+address.
+.sh 4 "ICD 0006"
+.pp
+The ICD value of 0006 is assigned to the Department of Defense (DoD).
+In ARGO, NSAP-addresses with an ICD value of 0006
+are of the format defined in RFC 986, a proposal for embedding DARPA Internet
+addresses within an OSI NSAP-address.
+In this case, the DSP takes the form:
+version (1 byte), DARPA Internet Address (4 bytes), upper layer protocol
+identifier (1 byte).
+This is called an
+\*(lqrfc986\*(rq
+address.
+.sh 1 "Internal Representation"
+.pp
+Internally, an NSAP address takes the form
+.(b
+\fC
+.TS
+tab(+);
+l s s s s.
+struct iso_addr {
+.T&
+l l l l l.
++u_char+isoa_afi;+/* authority &
++++format id */
++union+{+
+++struct addr_37+addr_37;+/* x.121 */
+++struct addr_osinet+addr_osinet;+/* OSINET */
+++struct addr_rfc986+addr_rfc986;+/* Internet*/
++}+isoa_u;
++u_char+isoa_len;+/* length */
+}
+.TE
+\fR
+.)b
+The field \fIisoa_afi\fR contains the AFI for the address.
+The union
+\fIisoa_u\fR contains the remainder of the address.
+The length of the entire address (the AFI, IDI, and DSP) is
+stored in \fIisoa_len\fR.
+.sh 1 "Network Layer Routing"
+.pp
+Routing at the network layer is performed by the
+routing procedure \fIrtalloc()\fR as described in Chapter 5.
+\fIRtalloc()\fR was designed for used in the DoD Internet
+domain.
+An unfortunate
+effect of this is that routing decisions are based upon either the
+entire NSAP address or the network portion of the address.
+The problem is defining the network portion of an NSAP address.
+The location and extent of the
+network portion of an NSAP address depends on the
+style of NSAP address.
+This decision is made by the function \fIiso_netof()\fR.
+.sh 2 "Network Portion of Type 37 Addresses"
+.pp
+There is no network portion of an X.121 address.
+In ARGO, the network portion of a type 37 address
+is defined to be just the AFI.
+The obvious consequence of this is that all type 37 addresses will
+match all other type 37 addresses
+in a network-portion comparison.
+.sh 2 "Network Portion of OSINET Addresses"
+.pp
+The network portion of an OSINET address is the organization identifier and
+the subnet identifier.
+.sh 2 "Network Portion of RFC986 Addresses"
+.pp
+The network portion of an RFC986 address is the network portion of the
+embedded DARPA Internet address.
+ARGO does not support subnetting, a method of subdividing Internet addresses.
+.sh 1 "NSAP Address / Subnetwork Point of Attachment Mapping"
+.pp
+In order to transmit a packet on a real subnetwork, the destination
+NSAP address
+must be mapped to an SNPA address.
+An SNPA address is the real, "hardware" address
+of a system on a network.
+This address corresponds to the 6 byte Ethernet or Token Ring
+Adapter address,
+or to the DTE address, which may be up to 7 bytes
+long (14 decimal digits).
+.pp
+A table, \fIsnpa_cache\fR is kept in the kernel which contains the
+translation between NSAP-addresses and SNPA-addresses.
+This table is used by \fIiso_snparesolve()\fR whenever a
+datagram must be dispatched.
+The table is maintained by the the ISO ES-IS protocol entity.
+Entries can be added and deleted
+by the user program \fIclnlutil(8)\fR and
+by the CONS entity.
diff --git a/share/doc/iso/ucb/def.nr b/share/doc/iso/ucb/def.nr
new file mode 100644
index 0000000..9d8e8b8
--- /dev/null
+++ b/share/doc/iso/ucb/def.nr
@@ -0,0 +1,144 @@
+.NC "Definitions"
+.sh 1 "General Terms"
+.ip "Kernel" 5
+The source code or binary module for the Acis Operating System
+(also know as AOS and IBM/4.3).
+.ip "User process" 5
+An instance of a program that is
+running in unprivileged mode, in the unprivileged address space
+commonly know as "user address space", in other words, not
+part of the kernel.
+.ip "IPC" 5
+Interprocess communication, the mechanism by which two different
+user processes send messages to each other.
+.ip "Unix, AOS" 5
+ACIS Operating System, the special testing release of Berkeley Unix 4.4BSD.
+.ip "PCB, pcb" 5
+Protocol control block. Each instance of a protocol machine
+keeps status information, addresses, and in some cases queues
+in a pcb for each connection or socket.
+.ip "Domain" 5
+In the Berkeley Unix environment, a domain is an abstract entity which
+comprises a network architecture, addressing scheme, address format,
+network protocols, and transport protocols.
+.sh 1 "Transport Layer Terms"
+.ip "ISO 8073"
+ISO Draft International Standard 8073, Transport Protocol Specification
+.ip "TP" 5
+The collection of transport
+classes that have been implemented in ARGO, classes 0 and 4.
+Also means the ARGO implementation of TP.
+.ip "TP 0" 5
+Transport class 0.
+.ip "TP 4" 5
+Transport class 4.
+.ip "Transport entity" 5
+Software or hardware that implements the elements of procedure
+described in ISO 8073.
+.ip "Transport user" 5
+User process that make use of the services
+provided by a transport entity.
+.ip "Transport service interface" 5
+The syntax and semantics of the set of procedures, functions, and system calls
+that are invoked by a transport user,
+through which the services of the transport entity are delivered.
+.ip "TPDU" 5
+Transport protocol data unit, a packet that is
+passed from one transport entity to another.
+.ip "TSDU" 5
+Transport service data unit, the logical unit of data that is
+passed from a transport entity to a transport user, or from
+a transport user to a transport entity.
+.ip "CR TPDU" 5
+Connection request TPDU.
+.ip "CC TPDU" 5
+Connection confirm TPDU.
+.ip "DR TPDU" 5
+Disconnect request TPDU.
+.ip "DC TPDU" 5
+Disconnect confirm TPDU.
+.ip "DT TPDU" 5
+Normal data TPDU.
+.ip "XPD TPDU" 5
+Expedited data TPDU.
+.ip "AK TPDU" 5
+Normal data acknowledgment TPDU.
+.ip "XAK TPDU" 5
+Expedited data acknowledgment TPDU.
+.ip "ER TPDU" 5
+Error TPDU.
+.sh 1 "Network Layer Terms"
+.ip "ISO 8473"
+ISO Draft International Standard 8473, connectionless network protocol.
+.ip "CONS"
+Connection Oriented Network Service.
+.ip "COSNS"
+Connection Oriented Sub-Network Service.
+.ip "CLNS"
+Connectionless Network Service.
+.ip "CLNP"
+Connectionless Network Protocol, or ISO 8473.
+.ip "Network Entity"
+Software or hardware that implements the elements of procedure described
+in ISO 8473.
+.ip "Network Service User"
+Software components that make use of the services provided by a network
+entity.
+.ip "Network Service Provider"
+Software components that provide the services of a network entity.
+.ip "NSAP"
+Network Service Access Point. The point at which the OSI network service
+is made available to the network service user by the network service
+provider.
+.ip "NSAP address"
+Information that the network service provider needs to identify an
+NSAP. The source and destination address fields of a CLNP packet
+are NSAP addresses.
+.ip "ES"
+End system. A system running the complete suite of OSI protocols which can
+act as an end point for communication.
+.ip "IS"
+Intermediate system. A system running the OSI layers 1, 2, and 3 which
+can act only a packet router.
+.ip "SNPA"
+The Subnetwork Point of Attachement is the point where a \fIreal\fR
+end or intermediate system is attached to a \fIreal\fR subnetwork.
+.ip "SNPA address"
+Information that a \fIreal\fR subnetwork need to identify a \fIreal\fR end
+or intermediate system. This is commonly referred to as the hardware address.
+.ip "NPDU"
+Network Protocol Data Unit. The unit of data which is exchanged between
+network entities.
+.ip "DT NPDU"
+Normal data NPDU.
+.ip "ER NPDU"
+Error report NPDU.
+.ip "Initial NPDU"
+A NPDU carrying the whole of the user data from an N-UNITDATA request.
+.ip "Derived NPDU"
+a NPDU whose field ar identical to those of an initial NPDU, except that it
+carries only a segment of the user data from an N-UNITDATA request.
+.ip "Segment"
+A distinct unit of data consisting of part or all of the user data provided
+in the N-UNITDATA request and delivered in the N-UNITDATA indication.
+.ip "Segmentation"
+The act of generation two or more derived NPDUs from an initial or derived
+NPDU.
+.ip "Fragment"
+A DoD Internet Protocol term with the same meaning as "segment". Used
+synonymously with "segment."
+.ip "Fragmentation"
+A DoD Internet Protocol term with the same meaning as "segmentation". Used
+synonymously with "segmentation."
+.ip "Reassembly"
+The act of regenerating an initial NPDU from two ore more derived NPDUs.
+.ip "MTU"
+Maximum transmission unit. The maximum size of a packet that can be
+transmitted on a medium or through a protocol.
+For example, the MTU of the TP protocol is 8192 bytes, the MTU
+of and Ethernet device is 1500 bytes, and the MTU of the OSI Network
+service is 512 bytes.
+.ip "Network interface"
+The device used to attach a computer to a network, for example,
+an Ethernet adapter, or a Token Ring adapter.
+This terminology is inherited from BSD Unix.
diff --git a/share/doc/iso/ucb/intro.nr b/share/doc/iso/ucb/intro.nr
new file mode 100644
index 0000000..196b7ae
--- /dev/null
+++ b/share/doc/iso/ucb/intro.nr
@@ -0,0 +1,72 @@
+.NC "Introduction"
+.sh 1 "Introduction"
+.pp
+This document describes the usage of the ISO
+transport and network layers written for the ACIS Operating System,
+the IBM ACIS port of Berkeley 4.3 Unix\**
+.(f
+\** Unix is a registered trademark of AT&T.
+.)f
+for the IBM RT PC,
+hereafter called AOS, as modified by UC Berkeley.
+This document describes work in progress and is an extremely
+hasty job of editing an earlier document written by colleagues
+at the university of Wisconsin.
+It is to be regarded as an emergency manual prepared for testers
+at NIST and should not be redistributed further.
+As such, there are philosophical
+statements that Berkeley fundamentally disagrees with, which
+we do not presently have the time to rip out.
+Collectively, this work is called the Wisconsin ARGO kernel.
+The ARGO kernel supports the
+the connection-oriented ISO transport service (COTS), the
+ISO connectionless network service (CLNS)
+and a
+connection-oriented network service (CONS).
+The COTS is provided by the ISO transport protocol TP,
+ISO 8073 Revised.
+The CLNS is provided by the connectionless network protocol,
+ISO 8473.
+The CONS is provided by the X.25 protocols.
+The ARGO implementation of the CONS is not a complete
+ISO CONS, but contains enough of the CONS to support
+the COTS and the CLNS (in the latter case, the CONS can be
+viewed as a subnetwork service).
+.pp
+The purposes of this document are
+.ip "1) "
+to describe the transport service and the software interface
+between the user and provider of this service,
+.ip "2) "
+to describe the network service and the software interface it
+provides.
+.pp
+It is assumed that the reader is familiar with the \fBC\fR
+programming language,
+with Unix conventions, and with the ISO specifications listed in Appendix A.
+.sh 1 "Organization"
+.pp
+This document is composed of several chapters.
+Chapter One contains this introduction. Chapter Two presents a
+definition of terms and phrases used throughout the document.
+Chapter Three describes the transport service interface, which is
+the interface between the transport protocol implementation software and the transport user software.
+Chapter Four describes the network service interface, and the interface
+above and below the network layer.
+Chapter Five explains the format of an OSI address.
+Chapter Six describes the
+the architecture of the interprocess communication support in the
+kernel, which to a large degree mandates
+the design of a protocol implementation for a 4.3 Unix kernel.
+.\" Appendix A is a list of the applicable ISO standards.
+.\" The manual pages relevant to the transport and network layers
+.\" are included as Appendix B.
+.pp
+Several conventions are followed in this document.
+All procedure names and system call names are followed
+by a pair of parentheses, for example,
+.i read ().
+References to manual pages consist of the name of the
+manual page, followed by the section in which
+the man page is found:
+.i read (2).
diff --git a/share/doc/iso/ucb/ipc.nr b/share/doc/iso/ucb/ipc.nr
new file mode 100644
index 0000000..6944970
--- /dev/null
+++ b/share/doc/iso/ucb/ipc.nr
@@ -0,0 +1,331 @@
+.NC "The Design of Unix IPC"
+.sh 1 "General"
+.pp
+The ARGO implementation of
+TP and CLNP was designed to fit into the AOS
+kernel
+as easily as possible.
+All the standard protocol hooks are used.
+To understand the design, it is useful to have
+read
+Leffler, Joy, and Fabry:
+\*(lq4.2 BSD Networking Implementation Notes\*(rq July 1983.
+This section describes the
+design of the IPC support in the AOS kernel.
+.sh 1 "Functional Unit Overview"
+.pp
+The
+AOS
+kernel
+is a monolithic program of considerable size and complexity.
+The code can be separated into parts of distinct function,
+but there are no kernel processes per se.
+The kernel code is either executed on behalf of a user
+process, in which case the kernel was entered by a system call,
+or it is executed on behalf of a hardware or software interrupt.
+The following sections describe briefly the major functional units
+of the kernel.
+.\" FIGURE
+.so ../wisc/figs/func_units.nr
+.CF
+shows the arrangement of these kernel units and
+their interactions.
+.sh 2 "The file system."
+.pp
+.sh 2 "Virtual memory support."
+.pp
+This includes protection, swapping, paging, and
+text sharing.
+.sh 2 "Blocked device drivers (disks, tapes)."
+.pp
+All these drivers share some minor functional units,
+such as buffer management and bus support
+for the various types of busses on the machine.
+.sh 2 "Interprocess communication (IPC)."
+.pp
+This includes
+support for various protocols,
+buffer management, and a standard interface for inter-protocol
+communication.
+.sh 2 "Network interface drivers."
+.pp
+These drivers are closely tied to the IPC support.
+They use the IPC's buffer management unit rather
+than the buffers used by the blocked device drivers.
+The interface between these drivers and the rest of the kernel
+differs from the interface used by the blocked devices.
+.sh 2 "Tty driver"
+.pp
+This is terminal support, including the user interface
+and the device drivers.
+.sh 2 "System call interface."
+.pp
+This handles signals, traps, and system calls.
+.sh 2 "Clock."
+.pp
+The clock is used in various forms by many
+other units.
+.sh 2 "User process support (the rest)."
+.pp
+This includes support for accounting, process creation,
+control, scheduling, and destruction.
+.pp
+.sh 2 "IPC"
+.pp
+The major functional unit that supports IPC
+can be divided into the following smaller functional
+units.
+.sh 3 "Buffer management."
+.pp
+All protocols share a pool of buffers called \fImbufs\fR.
+The internal structure has changed considerably since 4.3:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct mbuf {
+.T&
+l l l l.
++struct mbuf+*m_next;+/* next buffer in chain */
++struct mbuf+*m_act;+/* link in 2-d structure */
++u_long+m_len;+/* amount of data */
++char *+m_data;+/* location of data */
++short+m_type;+/* type of data */
++short+m_flags;+/* note if EOR, Packet HDR, Ext. stored */
++++/* If packet header add: */
+int+m_pkthdr.len;+/* total packet length */
+struct ifnet+*m_pkthdr.recvif;+/* rcv interface*/
++++/* If external storage add: */
++char +*m_ext.ext_buf;+/* start of buffer */
++void+(*m_ext.ext_free)();+/* free routine if not the usual */
++u_int+m_ext.ext_size;+/* size of buffer, for ext_free */
++++/* For non external */
++char+m_dat[depending];+/* done by unions, etc. */
+};
+.TE
+\fR
+.)b
+.pp
+There are two forms of mbufs - with and without external storage.
+Small ones are 128 octets in 4.4BSD.
+The data in these mbufs are located
+in the mbuf structure itself.
+Large mbufs, called \fIclusters\fR, are page-sized
+and page-aligned.
+They may be \*(lqcopied\*(rq by multiply mapping the pages they occupy.
+They consist of a page of memory plus a small mbuf structure
+whose fields are used
+to link clusters into chains, but whose \fIm_dat\fR array is
+not used.
+The \fIm_data\fR field of the structure
+is a pointer to the active data in all cases.
+The remainder of the description in the argo document
+is generally obsolete, and I am merely deleting the
+rest of it at this point.
+.sh 3 "Routing."
+.pp
+Routing decisions in the kernel are made by the procedure \fIrtalloc()\fR.
+This procedure will scan the kernel routing tables (stored in mbufs)
+looking for a route.
+The argo document here also is quite obsolete.
+We know keep a tree structure routing table,
+and do matching under masks.
+The structure for the routing entry contains tree related
+stuff pointers (parent, l-r child for internal nodes, mask and address
+for external nodes), and may be completely revised again
+to make use of patricia trees.
+.pp
+If a route is not found, then a default route is used (if present).
+.pp
+If a route is found, the entity which called \fIrtalloc()\fR can use information
+from the \fIrtentry\fR structure to dispatch the datagram. Specifically, the
+datagram is queued on the interface identified by the interface
+pointer \fIrt_ifp\fR.
+.sh 3 "Socket code."
+.pp
+This is the protocol-independent part of the IPC support.
+Each communication endpoint (which may or may not be associated
+with a connection) is represented by the following structure:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct socket {
+.T&
+l l l l.
++short+so_type;+/* type, e.g. SOCK_DGRAM */
++short+so_options;+/* from socket call */
++short+so_linger;+/* time to linger @ close */
++short+so_state;+/* internal state flags */
++caddr_t+so_pcb;+/* network layer pcb */
++struct protosw+*so_proto;+/* protocol handle */
++struct socket+*so_head;+/* ptr to accept socket */
++struct socket+*so_q0;+/* queue of partial connX */
++short+so_q0len;+/* # partials on so_q0 */
++struct socket+*so_q;+/* queue of incoming connX */
++short+so_qlen;+/* # connections on so_q */
++short+so_qlimit;+/* max # queued connX */
++struct sockbuf+{
+++short+sb_cc;+/* actual chars in buffer */
+++short+sb_hiwat;+/* max actual char count */
+++short+sb_mbcnt;+/* chars of mbufs used */
+++short+sb_mbmax;+/* max chars of mbufs to use */
+++short+sb_lowat;+/* low water mark (not used yet) */
+++short+sb_timeo;+/* timeout (not used ) */
+++struct mbuf+*sb_mb;+/* the mbuf chain */
+++struct proc+*sb_sel;+/* process selecting */
+++short+sb_flags;+/* flags, see below */
++} so_rcv, so_snd;
++short+so_timeo;+/* connection timeout */
++u_short+so_error;+/* error affecting connX */
++short+so_oobmark;+/* oob mark (TCP only) */
++short+so_pgrp;+/* pgrp for signals */
+}
+.TE
+\fR
+.)b
+.pp
+The socket code maintains a pair of queues for each socket,
+\fIso_rcv\fR and \fIso_snd\fR.
+Each queue is associated with a count of the number of characters
+in the queue, the maximum number of characters allowed to be put
+in the queue, some status information (\fIsb_flags\fR), and
+several unused fields.
+For a send operation, data are copied from the user's address space
+into chains of mbufs.
+This is done by the socket module, which then calls the underlying
+transport protocol module to place the data
+on the send queue.
+This is generally done by
+appending to the chain beginning at \fIsb_mb\fR.
+The socket module copies data from the \fIso_rcv\fR queue
+to the user's address space to effect a receive operation.
+The underlying transport layer is expected to have put incoming
+data into \fIso_rcv\fR by calling procedures in this module.
+.in -5
+.sh 3 "Transport protocol management."
+.pp
+All protocols and address types must be \*(lqregistered\*(rq in a
+common way in order to use the IPC user interface.
+Each protocol must have an entry in a protocol switch table.
+Each entry takes the form:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct protosw {
+.T&
+l l l l.
++short+pr_type;+/* socket type used for */
++short+pr_family;+/* protocol family */
++short+pr_protocol;+/* protocol # from the database */
++short+pr_flags;+/* status information */
++++/* protocol-protocol hooks */
++int+(*pr_input)();+/* input (from below) */
++int+(*pr_output)();+/* output (from above) */
++int+(*pr_ctlinput)();+/* control input */
++int+(*pr_ctloutput)();+/* control output */
++++/* user-protocol hook */
++int+(*pr_usrreq)();+/* user request: see list below */
++++/* utility hooks */
++int+(*pr_init)();+/* initialization hook */
++int+(*pr_fasttimo)();+/* fast timeout (200ms) */
++int+(*pr_slowtimo)();+/* slow timeout (500ms) */
++int+(*pr_drain)();+/* free some space (not used) */
+}
+.TE
+\fR
+.)b
+.pp
+Associated with each protocol are the types of socket
+abstractions supported by the protocol (\fIpr_type\fR), the
+format of the addresses used by the protocol (\fIpr_family\fR),
+the routines to be called to perform
+a standard set of protocol functions (\fIpr_input\fR,...,\fIpr_drain\fR),
+and some status information (\fIpr_flags\fR).
+The field pr_flags keeps such information as
+SS_ISCONNECTED (this socket has a peer),
+SS_ISCONNECTING (this socket is in the process of establishing
+a connection),
+SS_ISDISCONNECTING (this socket is in the process of being disconnected),
+SS_CANTSENDMORE (this socket is half-closed and cannot send),
+SS_CANTRCVMORE (this socket is half-closed and cannot receive).
+There are some flags that are specific to the TCP concept
+of out-of-band data.
+A flag SS_OOBAVAIL was added for the ARGO implementation, to support
+the TP concept of out-of-band data (expedited data).
+.sh 3 "Network Interface Drivers"
+.pp
+The drivers for the devices attaching a Unix machine to a network
+medium share a common interface to the protocol
+software.
+There is a common data structure for managing queues,
+not surprisingly, a chain of mbufs.
+There is a set of macros that are used to enqueue and
+dequeue mbuf chains at high priority.
+A driver
+delivers an indication to a protocol entity when
+an incoming packet has been placed on a queue by
+issuing a
+software
+interrupt.
+.sh 3 "Support for individual protocols."
+.pp
+Each protocol is written as a separate functional unit.
+Because all protocols share the clock and the mbuf pool, they
+are not entirely insulated from each other.
+The details of TP are described in a section that
+follows.
+.\"*****************************************************
+.\" FIGURE
+.so ../wisc/figs/unix_ipc.nr
+.pp
+.CF
+shows the arrangement of the IPC support.
+.pp
+The AOS
+IPC was designed for DoD Internet protocols, all of
+which run over DoD IP.
+The assumptions that DoD Internet is the domain
+and that DoD IP is the network layer
+appear in the code and data structures in numerous places.
+An example is that the transport protocols all directly call
+IP routines.
+There are no hooks in the data structures through
+which the transport layer can choose a network level protocol.
+Another example is that headers are assumed to
+fit in one small mbuf (112 bytes for data in AOS).
+Another example is this:
+It is assumed in many places that buffer space is managed
+in units of characters or octets.
+The user data are copied from user address space into the kernel mbufs
+amorphously
+by the socket code, a protocol-independent part of the kernel.
+This is fine for a stream protocol, but it means that a
+packet protocol, in order to \*(lqpacketize\*(rq the data,
+must perform a memory-to-memory copy
+that might have been avoided had the protocol layer done the original
+copy from user address space.
+Furthermore, protocols that count credit in terms of packets or
+buffers rather than characters do not work efficiently because
+the computation of buffer space is not in the protocol module,
+but rather it is in the socket code module.
+This list of examples is not complete.
+.pp
+To summarize, adding a new transport protocol to the kernel consists of
+adding entries to the tables in the protocol management
+unit,
+modifying the network interface driver(s) to recognize
+new network protocol identifiers,
+adding the
+new system calls to the kernel and to the user library,
+and
+adding code modules for each of the protocols,
+and correcting deficiencies in the socket code,
+where the assumptions made about the nature of
+transport protocols do not apply.
+.i
+(Touchy touchy, aren't we!?! -- Sklower)
diff --git a/share/doc/iso/ucb/macros.nr b/share/doc/iso/ucb/macros.nr
new file mode 100644
index 0000000..88ec2d3
--- /dev/null
+++ b/share/doc/iso/ucb/macros.nr
@@ -0,0 +1,50 @@
+.\"
+.\" Macro to initialize chapter macros
+.\"
+.de IC
+.nr CN 0 1
+..
+.\"
+.\" Macro to begin new chapter
+.\"
+.de NC
+.he 'ARGO user\'s Guide, Berkeley Hack Job''Chapter \\n+(CN'
+.bp
+.sh 0 "_" 1 1 1 1 1 1
+.sz +2
+.(l C
+CHAPTER \\n(CN
+
+\fB\\$1\fR
+.)l
+.sp 1
+.(x
+Chapter \\n(CN \\$1
+.)x
+.sz -2
+..
+.\"
+.\" Figure conventions:
+.\" 1) do .so of figure source - figure reg incremented here
+.\" 2) make references to figure via CF
+.\"
+.\"
+.\" Macro to initialize figure register
+.\"
+.de IF
+.nr FG 0 1
+..
+.\"
+.\" Macro for current figure number
+.\"
+.de CF
+Figure \\n(FG
+..
+.\"
+.\" Define this macro to include section headings in table of contents
+.\"
+.de $0
+.(x
+Section \\$2 \\$1
+.)x
+..
diff --git a/share/doc/iso/ucb/net_serv.nr b/share/doc/iso/ucb/net_serv.nr
new file mode 100644
index 0000000..c24eebd
--- /dev/null
+++ b/share/doc/iso/ucb/net_serv.nr
@@ -0,0 +1,163 @@
+.NC "Network Service Interface"
+.sh 1 "Connectionless Network Service"
+.pp
+This section describes the interface to the ISO connectionless network service.
+There are really two interfaces to the CLNS: the internal interface
+and the IPC interface.
+The internal interface is based on
+procedure calls. It is used only within the kernel. The IPC interface
+allows a user process to access the CLNS directly. This is used only
+for testing and debugging purposes.
+.sh 2 "Primitives"
+.pp
+The CLNS is, by definition, connectionless. Therefore, there are no
+primitives associated with connection establishment or connection release.
+There is one primitive associated with data transfer: N-UNITDATA.
+The parameters to a N-UNITDATA request are: source NSAP address,
+destination NSAP address, quality of service, and user data.
+The parameters of a N-UNITDATA indication are identical to those of the
+request.
+In this implementation, the quality of service parameter is not supported.
+.sh 2 "Internal Interface"
+.pp
+Within the kernel, an N-UNITDATA request is effected by the procedure
+\fIclnp_output()\fR:
+.(b
+\fC
+.TS
+tab(+);
+l s s.
+clnp_output(m0, isop, datalen, flags)
+.T&
+l l l.
+ +struct mbuf+*m0;+/* data */
+ +struct isopcb+*isop;+/* ISO protocol control block */
+ +int+datalen;+
+ +int+flags;+/* flags */
+.TE
+\fR
+.)b
+This procedure will construct a DT NPDU, route it, and transmit it on
+the appropriate subnetwork. \fIM0\fR is an mbuf chain containing the
+user data portion of the N-UNITDATA request. \fIIsopcb\fR is the iso protocol
+control block previously allocated. \fIClnp_output\fR will use the following
+fields: \fIisop_laddr\fR, isop_faddr, isop_route, isop_options,
+isop_optindex, \fI and \fRisop_clnpcache\fR.
+\fIDatalen\fR specifies the number of bytes of user data.
+The \fIflags\fR parameter will be discussed in a subsequent chapter.
+.pp
+A N-UNITDATA indication occurs when a DT NPDU arrives. The indication is
+generated by calling the appropriate upper layer protocol input routine.
+In the case of TP, the procedure \fItpclnp_input()\fR is called:
+.(b
+\fC
+.TS
+tab(+);
+l s s.
+tpclnp_input(m, src, dst, len)
+.T&
+l l l.
+ +struct mbuf+*m;+/* DT NPDU */
+ +struct iso_addr+*src;+/* source of packet */
+ +struct iso_addr+*dst;+/* destination of packet */
+ +int+len;+/* length of clnp header */
+.TE
+\fR
+.)b
+\fIM\fR contains the entire DT NPDU packet. \fILen\fR indicates the size
+of the CLNP header. In other words, the user data of the DT NPDU begins
+\fIlen\fR bytes into \fIm\fR. \fISrc\fR and \fIdst\fR indicate the
+source and destination NSAP addresses of the packet.
+.sh 3 "CLNP/Subnetwork Interface"
+.pp
+The design of the interface between the subnetwork and the CLNP is
+determined by the design of the Unix network interface drivers. CLNP
+follows the conventional mechanisms for exchanging packets with a network
+interface. See the section on Network Interface Drivers in Chapter Five
+for more information on these conventions.
+.sh 2 "IPC (\*(lqRaw\*(rq) Interface"
+.pp
+The IPC interface to the CLNS allows direct (called \*(lqraw\*(rq)
+access to CLNP.
+This interface is intended for testing and debugging only.
+Its use results in the
+transmission of CLNP datagrams with nonstandard identification fields.
+These raw packets may be rejected by a system not employing the same
+convention. See the section on network implementation for more information
+about the conventions.
+.pp
+In order to gain access to the raw interface
+a \fIsocket\fR, with address family AF_ISO and type SOCK_RAW must be created.
+With this socket in hand,
+the system calls \fIsendto()\fR and \fIrecvfrom()\fR can be used to
+transmit and receive raw CLNP datagrams.
+.sh 3 "Sending raw datagrams"
+.pp
+The format of the \fIsendto()\fR system call is:
+.(b
+\fC
+.TS
+tab(+);
+l s s.
+cc = sendto(s, msg, len, flags, to, tolen)
+.T&
+l l l.
+int+cc,s;
+char+*msg;
+int+len,flags;
+struct sockaddr+*to;
+int+to;
+.TE
+\fR
+.)b
+\f\fIS\fR is the socket previously created. \fIMsg\fR is a pointer to
+the data for the NPDU. CLNP will prepend a header to this data before
+transmission. \fILen\fR specifies the number of bytes of data. The
+\fIflags\fR parameter is unused and should be zero. \fITo\fR specifies the
+NSAP address to be used as the destination address. The size (in bytes)
+of \fIto\fR is given in \fItolen\fR. CLNP will automatically insert
+the source address based upon the route taken by the packet. The number of
+user data bytes transmitted is returned as \fIcc\fR. See \fIsendto(2)\fR
+for more information on this system call.
+.sh 3 "Receiving raw datagrams"
+.pp
+The format of the \fIrecvfrom()\fR system call is:
+.(b
+\fC
+.TS
+tab(+);
+l s s.
+cc = recvfrom(s, buf, len, flags, from, fromlen)
+.T&
+l l l.
+int+cc,s;
+char+*buf;
+int+len,flags;
+struct sockaddr+*from;
+int+*fromlen;
+.TE
+\fR
+.)b
+When used with a CLNP raw socket \fIs\fR, \fIrecvfrom()\fR will read a
+NPDU from the CLNS. If no packet is available, the call will block.
+\fIBuf\fR specifies a buffer of \fIlen\fR bytes into which the NPDU will
+be read. The entire packet, including the header, will be read into the
+buffer. The \fIflags\fR parameter is unused, and should be zero. If
+\fIfrom\fR is non-zero, the source address of the NPDU is filled in.
+\fIFromlen\fR is a value-result parameter, initialized to the size of
+the buffer associated with \fIfrom\fR, and modified on return to
+indicate the actual size of the address stored there. The total number
+of bytes received (header and data) is returned as \fIcc\fR.
+See \fIrecvfrom(2)\fR for more information about this system call.
+.sh 1 "Connection Oriented Network Service"
+.pp
+The ARGO Connection Oriented Network Service (CONS) is not a complete
+implementation of the
+OSI network service.
+It is that subset of the OSI network service that is used
+by ARGO Transport and by ARGO CLNP.
+.\" FIGURE
+.so ../wisc/figs/NS_primitives.nr
+.pp
+.CF
+shows which CONS service elements are provided.
diff --git a/share/doc/iso/ucb/program.nr b/share/doc/iso/ucb/program.nr
new file mode 100644
index 0000000..a431661
--- /dev/null
+++ b/share/doc/iso/ucb/program.nr
@@ -0,0 +1,42 @@
+.\"$Header: program.nr,v 1.1 88/12/05 18:10:57 nhall Exp $
+.\"$Source: /usr/argo/doc/kernel/RCS/program.nr,v $
+.\"
+.\"
+.\" FONT CONVENTIONS
+.\"
+.\" \fIprocedure()\fR
+.\" \fIsyscall()\fR
+.\" \fImanpage(3)\fR
+.\" \fIdata_structure_name\fR
+.\" \fC/file/or/directory/name\fR
+.\" \fC
+.\" section of code
+.\" \fR
+.\"
+.\"
+.\" LOOK FOR ALL CASES OF 'writing' (as in, "at this writing")
+.\" to be sure you've updated everything before distributing this!
+.\"
+.\"This file uses -me and tbl macros.
+.so macros.nr
+.\" .pn 1
+.IC
+.IF
+.\" .(l C
+.\" .sz 16
+.\" Berkeley's Hack at the first 6 chapters of
+.\" Wisconsin ARGO 1.0 Kernel Programmer's Guide for
+.\" Academic Operating Systems 4.3
+.\" .sz 8
+.\" .)l
+.he 'ARGO 1.0 Berkeley Revision User\'s Guide'''
+.fo '%''December 9, 1988'
+.\" .bp
+.so intro.nr
+.so def.nr
+.so trans_serv.nr
+.so net_serv.nr
+.so ipc.nr
+.so addr.nr
+.bp
+.xp
diff --git a/share/doc/iso/ucb/trans_serv.nr b/share/doc/iso/ucb/trans_serv.nr
new file mode 100644
index 0000000..2f6d156
--- /dev/null
+++ b/share/doc/iso/ucb/trans_serv.nr
@@ -0,0 +1,697 @@
+.NC "Transport Service Interface"
+.sh 1 "General"
+.pp
+It is assumed that the reader is acquainted with the
+set of system calls and library routines that
+compose the
+Berkeley
+Unix interprocess communication service (IPC).
+To every extent possible
+the ARGO transport service is provided by the same IPC mechanisms
+that support
+the transport-level services
+included in the
+AOS distribution.
+In some instances, the interface
+provided by AOS does not support
+the services required by ISO 8073,
+so system calls were added to support these services.
+It is felt that this is superior to modifying
+existing system calls, in order to avoid the
+recoding of existing Unix utilities.
+.pp
+What follows is a description of the system calls
+that are used to provide the transport service.
+According to Unix custom,
+the return value of a system call is 0
+if the call succeeds and -1 if
+the call fails for any reason.
+In the latter case,
+the global variable
+\fIerrno\fR contains more information
+about the error that caused the failure.
+In the descriptions of all the system calls for which
+this custom is followed,
+the return value is named
+\fIstatus\fR.
+.sh 1 "Connection establishment"
+.pp
+Establishing a TP connection is similar to
+establishing a connection using any other
+transport protocol supported by Unix.
+The same system calls are used, and the passive open
+is required.
+Some of the parameters to the system calls differ.
+.pp
+The following call creates a communication endpoint called a
+\fIsocket\fR.
+It returns
+a positive integer called a
+\fIsocket descriptor\fR,
+which
+will be a parameter in all communication primitives.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+s = socket( af, type, protocol )
+.T&
+l l l.
+ +int+s,af,type,protocol;
+.TE
+\fR
+.)b
+.pp
+The \fIaf\fR parameter describes the format of addresses
+used in this communication.
+Existing formats include AF_INET (DoD Internet addresses),
+AF_PUP (Xerox PUP-I Internet addresses), and AF_UNIX
+(addresses are Unix file names, for intra-machine IPC only).
+TP runs in either the Internet domain or the ISO domain (AF_ISO).
+When using the Internet domain, the network layer is the DoD Internet IP
+with Internet-style addresses. The ISO domain uses the ISO
+network service and ISO-style addresses\**.
+.(f
+\**ISO/DP 8348/DAD2 Addendum to the Network
+Service Definition Covering Network Layer Addressing.
+.)f
+Regardless of the address family used, an address takes the
+general form,
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct sockaddr {
+.T&
+l l l l.
+ +u_char+sa_len;+/* length of sockaddr */
+ +u_char+sa_family;+/* address family */
+ +char+sa_data[14];+/* space for an address */
+}+
+.TE
+\fR
+.)b
+.lp
+.i
+A sockaddr is no longer required to be precisely 16 bytes long.
+The allocation of 14 bytes for sa_data is intended for backwards
+compatibility.
+.r
+.sp 1
+When viewed as an Internet address, it takes the form
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct sockaddr_in {
+.T&
+l l l l.
+ +u_char+sin_len;+/* address length */
+ +u_char+sin_family;+/* address family */
+ +u_short+sin_port;+/* internet port */
+ +struct in_addr+sin_addr;+/* network addr A.B.C.D */
+ +char+sin_zero[8];+/* unused */
+}
+.TE
+\fR
+.)b
+.sp 1
+When viewed as an ISO address, as supplied by the
+university of wisconsin, it takes the form
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct sockaddr_iso {
+.T&
+l l l l.
+ +u_char+siso_len;+/* address length */
+ +u_char+siso_family;+/* address family */
+ +u_short+siso_tsuffix;+/* transport suffix */
+ +struct iso_addr+siso_addr;+/* ISO NSAP addr */
+ +char+siso_zero[2];+/* unused */
+}
+.TE
+\fR
+.)b
+The address described by a \fIsockaddr_iso\fR structure
+is a TSAP-address (transport service access point address).
+It is made of an NSAP-address (network service access point address)
+and a TSAP selector (also called a transport suffix or
+transport selector, hereafter called a TSEL).
+The structure \fIsockaddr_iso\fR contains a 2-byte TSEL.
+This is for compatibility with Internet addressing.
+ARGO supports
+TSELs of length 1-64 bytes.
+TSELs of any length other than 2
+are called \*(lqextended TSELs\*(rq.
+They are described in detail in the section \fB\*(lqExtended TSELs\*(rq\fR.
+If extended TSELs are not requested, 2-byte TSELs are used by default.
+.pp
+Refer to Chapter Five for more information about ISO NSAP-addresses.
+.pp
+.i
+It is our intent at Berkeley to revamp the sockaddr_iso
+to use a more natural and uniform model, for ISO addresses.
+We cannot guarantee this modification to be complete by the
+time we are ready to have something for NIST to test.
+We hope to remove this notion of extended TSEL's as soon as
+possible, certainly by formal beta testing of 4.4.
+.r
+Since sockaddr can be 108 bytes long without breaking anything
+in the current Berkeley kernel, we should be able to eliminate
+extended TSEL's entirely by
+providing a sockaddr_iso along the lines of:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct sockaddr_iso {
+.T&
+l l l l.
+ +u_char+siso_len;+/* address length */
+ +u_char+siso_family;+/* address family */
+ +u_char+siso_slen;+/* session suffix length */
+ +u_char+siso_tlen;+/* transport suffix length */
+ +u_char+siso_nlen;+/* nsap length */
+ +char+siso_data[22];+/* minimum nsap + tsel */
+}
+.TE
+\fR
+.)b
+.pp
+The \fItype\fR parameter in the \fIsocket()\fR call
+distinguishes
+datagram protocols, stream protocols, sequenced
+packet protocols, reliable datagram protocols, and
+"raw" protocols (in other words, the absence of a transport protocol).
+Unix provides manifest named constants for each of these types.
+TP supports the sequenced packet protocol abstraction, to which
+the manifest constant SOCK_SEQPACKET applies.
+.pp
+The \fIprotocol\fR
+parameter is an integer that identifies the protocol to be used.
+Unix provides a database of protocol names and their associated
+protocol numbers.
+Unix also provides user-level tools
+for searching the database.
+The tools take the form of library routines.
+A protocol number for TP has been chosen
+by the Internet NIC to allow TP to run in the Internet domain, and this
+has been added to the Unix network protocol database.
+The standard Internet database tools that serve TCP users
+can
+also serve user of TP
+in the Internet domain, if the TP protocol number is added to the
+proper Internet database file,
+\fC/etc/protocols\fR.
+This change must be made for TP to run in either the Internet or
+in the ISO domain.
+The ARGO package contains a set of tools and a database
+for use with TP in the ISO domain.
+This set of tools is described in the manual pages
+\fIisodir(5)\fR and
+\fIisodir(3)\fR.
+.pp
+When a socket is created, it is not given an address.
+Since a socket cannot be reached by a remote entity unless it has an address,
+the user must request that a socket be given an address by
+using the \fIbind()\fR system call:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = bind( s, addr, addrlen )
+.T&
+l l l.
+ +int+s;
+ +struct sockaddr+*addr;
+ +int+addrlen;
+.TE
+\fR
+.)b
+.pp
+The address is expected to be in the format specified by the
+\fIaf\fR parameter to the \fIsocket()\fR
+call that yielded the socket descriptor \fIs\fR.
+If the user
+passes an address parameter with a zero-valued transport suffix,
+the transport layer
+assigns an unused 2-byte transport selector.
+This is a 4.3 Unix convention; it is not part of any ISO standard.
+.pp
+The \fIconnect()\fR system call effects an active open.
+It is used to establish a connection with an entity that is
+passively waiting for connection requests, and whose
+transport address is known.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = connect( s, addr, addrlen )
+.T&
+l l l.
+ +int+s;
+ +struct sockaddr+*addr;
+ +int+addrlen;
+.TE
+\fR
+.)b
+.pp
+The first parameter is a socket descriptor.
+The \fIaddr\fR parameter is a transport address in the format
+specified by the \fIaf\fR parameter to the \fIsocket()\fR
+call that yielded the socket descriptor \fIs\fR.
+.pp
+A passive open is accomplished with two system calls,
+\fIlisten()\fR followed by \fIaccept()\fR.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = listen( s, queuelen )
+.T&
+l l l.
+ +int+s;
+ +int+queuelen;
+.TE
+\fR
+.)b
+.pp
+The \fIqueuelen\fR argument specifies the maximum
+number of pending connection
+requests that will be queued for acceptance by this user.
+Connections are then accepted by the
+system call \fIaccept()\fR.
+There is no way to refuse connections.
+The functional equivalent of connection
+refusal is accomplished by accepting a connection and immediately
+disconnecting.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+new_s = accept( s, addr, addrlen )
+.T&
+l l l.
+ +int+new_s, s;
+ +struct sockaddr+*addr;
+ +int+addrlen;
+.TE
+\fR
+.)b
+.pp
+The \fIaccept()\fR call completes the connection
+establishment. If a connection request from a prospective peer
+is pending on the socket described by \fIs\fR, it is removed and
+a new socket is created for use with this connection.
+A socket descriptor for the new socket is returned by the
+system call.
+If no connection requests are pending, this call blocks.
+If the \fIaccept()\fR call fails, -1 is returned.
+The transport address of the entity requesting the connection
+is returned in the \fIaddr\fR parameter, and the length
+of the address is returned in the \fIaddrlen\fR parameter.
+The address associated with the new socket is inherited
+from the socket on which the \fIlisten()\fR and \fIaccept()\fR were performed.
+.pp
+It is possible for the \fIaccept()\fR call to be interrupted
+by an asynchronous event such as the arrival of expedited
+data.
+When system calls are interrupted, Unix returns the value -1
+to the caller and puts the constant
+EINTR in the global variable \fIerrno\fR.
+This can create problems with the system call \fIaccept()\fR.
+In the case of incoming expedited data, the interruption does
+not indicate a problem, but the data may have arrived before
+the caller has received the new socket descriptor, which is the
+socket descriptor on which the expedited data are to be received.
+In order to prevent this problem from occurring, the caller must
+prevent the issuance of asynchronous indications until the
+\fIaccept()\fR
+call has returned.
+Asynchronous indications are discussed below, in
+the section titled
+"Indications from the transport layer to the transport user".
+.pp
+It is possible to discover the
+address bound to a
+socket with the
+\fIgetsockname()\fR system call.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = getsockname( s, addr, addrlen )
+.T&
+l l l.
+ +int+s;
+ +struct sockaddr+*addr;
+ +int+addrlen;
+.TE
+\fR
+.)b
+.pp
+If the socket has a peer, that is, it is connected,
+the system call
+\fIgetpeername()\fR
+is used to discover the peer's address.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = getpeername( s, addr, addrlen )
+.T&
+l l l.
+ +int+s;
+ +struct sockaddr+*addr;
+ +int+addrlen;
+.TE
+\fR
+.)b
+.lp
+The names returned by
+\fIgetsockname()\fR and \fIgetpeername()\fR
+do not contain extended TSELs.
+Extended TSELs can be retrieved with
+the \fIgetsockopt()\fR and
+\fIsetsockopt()\fR system calls, described below.
+.pp
+Unix supports several protocol-independent options
+and protocol-specific options
+associated with sockets.
+These options can be inspected and changed by using
+the \fIgetsockopt()\fR and
+\fIsetsockopt()\fR system calls.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = getsockopt( s, level, option, value, valuelen )
+.T&
+l l l.
+ +int+s, level, option;
+ +char+*value;
+ +int+*valuelen;
+.TE
+\fR
+.)b
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = setsockopt( s, level, option, value, valuelen )
+.T&
+l l l.
+ +int+s, level, option;
+ +char+*value;
+ +int+valuelen;
+.TE
+\fR
+.)b
+.pp
+The \fIlevel\fR argument may indicate
+either
+that this option applies to sockets or that it applies to
+a specific protocol.
+The constants SOL_SOCKET, SOL_TRANSPORT, and SOL_NETWORK
+are possible values for the \fIlevel\fR argument.
+The \fIoption\fR argument is an integer that identifies
+the option chosen.
+.\" LIST THE OPTIONS HERE
+The options available to TP users provide the
+user with the ability to control various TP protocol options
+including but not limited to
+TP class, TPDU size negotiated, TPDU format used,
+acknowledgment and retransmission strategies.
+For a detail list of the options, see the manual page \fItp(4p)\fR.
+.sh 1 "Extended TSELs"
+.pp
+ARGO supports TSELs
+of length 1 byte - 64 bytes for sockets bound to addresses in the
+AF_ISO address family.
+The ARGO user program uses the
+\fIgetsockopt()\fR
+and
+\fIsetsockopt()\fR
+system calls to
+discover and assign extended TSELs.
+.pp
+To create a socket with an extended TSEL,
+the process
+.ip \(bu 5
+opens a socket with \fCsocket(AF_ISO, SOCK_SEQPACKET, ISOPROTO_TP)\fR
+.ip \(bu 5
+binds an NSAP-address to the socket with \fIbind()\fR.
+The address bound may contain a 2-byte selector (\fIiso_tsuffix\fR).
+.ip \(bu 5
+uses \fIsetsockopt()\fR with the command TPOPT_MY_TSEL,
+to assign a TSEL to the socket.
+.ip \(bu 5
+calls \fIlisten(), connect()\fR, or any other appopriate system calls
+to use the socket as desired.
+.lp
+To connect to a transport entity that is bound to a TSAP-address with
+an extended TSEL, the
+process
+.ip \(bu 5
+opens a socket with \fCsocket(AF_ISO, SOCK_SEQPACKET, ISOPROTO_TP)\fR
+.ip \(bu 5
+uses \fIsetsockopt()\fR, with the command TPOPT_PEER_TSEL,
+to assign a PEER TSEL to the socket.
+This TSEL is used by the transport entity
+for all subsequent connect requests made on this socket,
+unless the peer TSEL is changed by another call to
+\fIsetsockopt()\fR employing the command TPOPT_PEER_TSEL.
+.lp
+To discover the TSEL of the peer of a connected socket,
+the process
+.ip \(bu 5
+uses \fIgetsockopt()\fR with the command TPOPT_PEER_TSEL.
+.lp
+To discover the TSEL of socket's own address,
+the process
+.ip \(bu 5
+uses \fIgetsockopt()\fR with the command TPOPT_MY_TSEL.
+.sh 1 "Data transfer"
+.pp
+Earlier BSD-based systems have provided system calls for data transfer
+having bugs and semantics that are problematic for TP.
+These should be correct as presented in the test system.
+The problem was in the manner in which the kernel
+handled interrupted system calls.
+The send and receive primitives
+may be interrupted by signals.
+A signal is the mechanism used to indicate
+the presence of expedited data or out-of-band data.
+If the send primitive as interrupted before completion,
+the user could not determine how many octets of data were sent.
+All forms of the existing interface
+(\fIsend()\fR,
+\fIrecv()\fR,
+\fIsendmsg()\fR,
+\fIrecvmsg()\fR,
+\fIsendto()\fR,
+\fIrecvfrom()\fR,
+\fIwrite()\fR,
+\fIread\fR,
+\fIwritev()\fR,
+and \fIreadv()\fR system calls)
+return an octet count
+when the system call completes, and to return a short count
+if the system call is interrupted.
+.pp
+The system calls sendmsg and recvmsg
+have been revised to make them more convenient for receipt of
+out of band data.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+cc = sendmsg( s, msg, flags )
+.T&
+l l l.
+ +int+s;
+ +istruct msghdr+msg;
+ +unsigned int+flags;
+.TE
+\fR
+.)b
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+cc = recvmsg( s, msg, flags )
+.T&
+l l l.
+ +int+s;
+ +istruct msghdr+msg;
+ +unsigned int+flags;
+.TE
+\fR
+.)b
+.pp
+The reader should now consult the manual page for recvmsg
+for an explanation of the elements of the msghdr structure,
+and how the calls may be used to glean user-connection-request data.
+.pp
+The \fIflags\fR parameter serves several purposes.
+The TP specification requires that TSDUs be unlimited in size.
+System calls cannot pass unlimited amounts of data between the user
+and the kernel, so
+there cannot be a one-to-one correspondence between TSDUs and
+system calls.
+The \fIflags\fR
+parameter is used to mark the end-of-TSDU on sending data.
+When receiving,
+TP sets this bit
+in the flags element of the msghdr structure
+when the end of a TSDU is consumed.
+This way one TSDU can span several system calls.
+It is possible for the peer to send an empty TPDU with the end-of-TSDU
+flag set, in which case the transport user
+may receive zero octets with the end-of-TSDU flag set.
+.pp
+The \fIflags\fR parameter also serves to distinguish data transfer primitives
+from expedited data transfer primitives.
+The flag bit MSG_OOB is provided for "out of band data" in the
+DoD Internet protocols. It is also used to provide the expedited data service
+of the ISO protocols.
+The transport layer will deliver one expedited datum (there will be a
+one-to-one correspondence between expedited TSDUs and XPD TPDUs)
+at a time.
+The user must receive the datum before the transport
+layer will accept more expedited data.
+Each expedited datum my contain up to 16 octets.
+.pp
+.sh 1 "Disconnection"
+.pp
+The \fIclose\fR system call will disconnect any association
+between two TP entities.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = close( s )
+.T&
+l l l.
+ +int+s;
+.TE
+\fR
+.)b
+.pp
+The argument \fIs\fR is a socket descriptor.
+If a Unix user process terminates, Unix will close all files and
+sockets associated with the process, which means all transport
+connections associated with the process will be disconnected.
+.sh 1 "Indications from the transport layer to the transport user"
+.pp
+The above set of system calls allows you to establish
+a connection, transfer data, and disconnect.
+The
+presence or reception of expedited data is indicated
+by TP setting the MSG_OOB bit in the flags element of the msg structure.
+A disconnection initiated by the peer or by one of the
+cooperating TP entities can be signalled by a control message,
+although we have not yet implemented this.
+.pp
+The Unix signal mechanism may be used to provide these
+service elements, as well.
+When an expedited data TSDU arrives, the TP may interrupt
+the user with a SIGURG signal ("urgent condition present on socket").
+The user must have previously registered a procedure to handle
+the signal by using the \fIsigvec()\fR system call or the
+\fIsignal()\fR library routine provided for that purpose.
+The signal handler takes the form
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+int sighandler( signal_number)
+.T&
+l l l.
+ +int+signal_number;
+.TE
+\fR
+.)b
+.pp
+The \fIsignal_number\fR argument will be the well-known constant SIGURG.
+There are two reasons for
+the transport layer to issue
+a SIGURG:
+expedited data
+are present or
+disconnection was initiated by a transport entity or by the peer.
+Should the user have more than one transport connection open,
+another system call is used to determine to which socket(s)
+the urgent condition applies.
+This is the \fIselect()\fR system call, described below.
+.pp
+When the SIGURG indicates a disconnection, there may be
+user data from the peer present.
+TP saves the disconnect data for the user to receive via the
+\fIgetsockopt()\fR system call, or through the
+.IR recvmsg ()
+ancillary data mechanism.
+.\"
+.\"If the user does not receive the disconnect data before the
+.\"reference timer expires, the data will be discarded and the
+.\"socket will be closed.
+.pp
+Transport service users may use more than one transport
+connection at a time.
+The \fIselect()\fR system call facilitates this.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+#include <sys/types.h>
++
+nfound = select( num_to_scan, recvmask, sendmask,
++exceptmask, timeout )
+.T&
+l l l.
+ +int+nfound, num_to_scan;
+ +fd_set+*recvmask, *sendmask, *exceptmask;
+ +time+timeout;
+.TE
+\fR
+.)b
+.pp
+This system call takes as parameters a set of masks
+that specify a subset of the socket descriptors that are in
+use by the user program.
+\fISelect()\fR inspects the sockets to see if they have data
+to be received, can service a send without blocking, or
+have an exceptional condition pending, respectively.
+The masks will be set upon return to indicate the socket descriptors
+for which the respective conditions exist.
+The \fInum_to_scan\fR argument limits the number of sockets that are
+inspected.
+The call will return within the amount of time given in the
+\fItimeout\fR parameter, or, if the parameter is zero, \fIselect()\fR
+will block indefinitely.
+.\" FIGURE
+.so ../wisc/figs/TS_primitives.nr
+.pp
+.CF
+summarizes the mapping of the transport service primitives
+to Unix facilities.
diff --git a/share/doc/iso/wisc/Makefile b/share/doc/iso/wisc/Makefile
new file mode 100644
index 0000000..7d9aa87
--- /dev/null
+++ b/share/doc/iso/wisc/Makefile
@@ -0,0 +1,73 @@
+#
+# Makefile for the tp documents:
+# design: TP design/source guide
+# appendix_a: index of tp kernel routines & macros by macro/routine name
+# appendix_b: index of tp kernel routines & macros by file name
+#
+PRINTER = 3a
+TAGS = ../../sys/tags
+SRCS = ../../sys/netargo/tp_*.c ../../sys/netargo/tp_*.h ../../sys/netargo/tp*.trans
+TROFF = /usr/local/lib/troff
+
+#
+# Print via speedy for cycles sake...
+# (assumes postscript printer...)
+#
+program:
+ @echo printer is $(PRINTER)
+ (cd figs; make)
+ format -P$(PRINTER) -t program.nr | rsh speedy psdit \| lpr -P$(PRINTER)
+
+parts:
+ @echo printer is $(PRINTER)
+ (cd figs; make)
+ format -P$(PRINTER) -t parts.nr | rsh speedy psdit \| lpr -P$(PRINTER)
+# format -P$(PRINTER) -t parts.nr > /dev/null
+# soelim parts.nr | grn -P$(PRINTER) |\
+# $(TROFF) -Tpsc | rsh speedy psdit \> /tmp/test
+# soelim parts.nr | tbl > /tmp/parts.nr
+
+clean:
+ /bin/rm -f core junk* a.out *.o spell_errs made
+ touch spell_errs
+
+spell:
+ (cd figs; make)
+ (cd ../icon; make)
+ /usr/ucb/soelim program.nr | /usr/bin/spell -d hlista > spell_errs
+
+newdict:
+ cat spell_errs | spellin /usr/dict/hlista > hlista
+
+all: program appendix_a appendix_b appendix_c
+
+
+appendix_c:
+ format -P$(PRINTER) appendix_c.nr
+ tbl ../man/man4/table1.src > ../man/man4/table1.nr
+ tbl ../man/man4/table2.src > ../man/man4/table2.nr
+ tbl ../man/man4/table3.src > ../man/man4/table3.nr
+ soelim ../man/man4/tp.4p.src > ../man/man4/tp.4p
+ ditroff -man -P$(PRINTER) ../man/man1/xebec.1
+ ditroff -man -P$(PRINTER) ../man/man2/sendv.2
+ ditroff -man -P$(PRINTER) ../man/man2/recvv.2
+ ditroff -man -P$(PRINTER) ../man/man3/libtp.3
+ ditroff -man -P$(PRINTER) ../man/man4/tp.4p
+ ditroff -man -P$(PRINTER) ../man/man8/tppt.8
+ ditroff -man -P$(PRINTER) ../man/man8/tpdebug.8
+ ditroff -man -P$(PRINTER) ../man/man8/tpstat.8
+
+appendix_a:
+ ctags -x $(SRCS) | awk '{printf("%s %s %s\n", $$1, $$3, $$2)}'\
+ | sed -e 's-../../sys/netargo/--' > index_by_func.nr
+ format -P$(PRINTER) appendix_a.nr
+
+appendix_b:
+ ctags -x $(SRCS) | awk '{printf("%s %s %s\n", $$3, $$1, $$2)}'\
+ | sed -e 's-../../sys/netargo/--' \
+ | sort \
+ | fmtxref -w 80 \
+ | sed -e 's/ / /' \
+ -e 's/ / /' \
+ > index_by_file.nr
+ format -P$(PRINTER) appendix_b.nr
diff --git a/share/doc/iso/wisc/Outline b/share/doc/iso/wisc/Outline
new file mode 100644
index 0000000..30ea7b8
--- /dev/null
+++ b/share/doc/iso/wisc/Outline
@@ -0,0 +1,18 @@
+Ch 1 Intro
+Ch 2 Definitions
+Ch 3 Transport Service Interface
+Ch 4 Network Service Interface
+ - user interface
+ - kernel interface
+Ch 5 Addressing
+Ch 6 Design of Transport
+Ch 7 Design of Network
+Ch 8 Error Handling
+ - transport
+ - network
+Ch 9 Guide to Transport Source Code
+Ch 10 Guide to Network Source Code
+Ch 11 Guide to Common Source Code
+Ch 12 Testing & Debugging
+ - transport
+ - network
diff --git a/share/doc/iso/wisc/TODO b/share/doc/iso/wisc/TODO
new file mode 100644
index 0000000..8e7bf64
--- /dev/null
+++ b/share/doc/iso/wisc/TODO
@@ -0,0 +1,2 @@
+update clnp echo doc
+add esis
diff --git a/share/doc/iso/wisc/addr.nr b/share/doc/iso/wisc/addr.nr
new file mode 100644
index 0000000..1133422
--- /dev/null
+++ b/share/doc/iso/wisc/addr.nr
@@ -0,0 +1,155 @@
+.NC "NSAP Addresses & Routing"
+.sh 1 "OSI Address Formats"
+.pp
+ARGO supports an ISO address family, AF_ISO, in addition to the
+DoD Internet address family, AF_INET.
+Addresses in the family AF_ISO
+take the form described by ISO 8348/DAD2, which is an addendum to the
+OSI network service standard that describes network layer addressing.
+.sh 2 "ISO 8348/DAD2 Tutorial"
+.pp
+.\" FIGURE
+.\".so figs/osi_addr.nr
+.so figs/addrfmt.nr
+.CF
+shows the
+format of an OSI NSAP-address.
+The address has two major parts: the initial domain part
+(IDP) and the domain specific part (DSP). The IDP is further divided into
+two parts: the authority and format identifier (AFI) and the
+initial domain identifier (IDI). The AFI specifies the format of the
+IDI, the authority responsible for allocating values of the IDI, and
+the syntax of the DSP. The IDI specifies the network addressing domain
+from which DSP values are allocated, and the authority responsible for
+allocating DSP values.
+.sh 2 "Supported Formats"
+.pp
+ARGO supports three types of ISO NSAP-addresses:
+one type with AFI 37(hex) and two types with AFI 47(hex).
+.sh 3 "AFI 37"
+.pp
+This value of the AFI defines the IDI to be an X.121 address or DTE
+address.
+The DTE address is encoded in binary coded decimal.
+The DSP syntax is binary.
+This form is intended to be used when communicating
+across a public data network (PDN).
+The ARGO software and documentation
+refer to this type of NSAP-address as a
+\*(lqtype 37.\*(rq
+address.
+.sh 3 "AFI 47"
+.pp
+The value of 47 for the AFI defines the IDI to be a 4 digit International
+Code Designator (ICD) allocated according to ISO 6523.
+ARGO support two
+ICD values.
+.sh 4 "ICD 0004"
+.pp
+The ICD value of 0004 is assigned to OSINET,
+an experimental OSI network overseen by
+National Institute of Science and Technology.\**
+.(f
+\** formerly the National Bureau of Standards
+.)f
+When this style of NSAP-address
+is used,
+the DSP is divided into four parts: an organization identifier (2 bytes),
+a subnet identifier (2 bytes),
+an SNPA-part (4-8 bytes), and
+an NSAP selector (1 byte).
+The use of these fields is defined by the OSINET steering committee.
+This type of address is known as an
+\*(lqOSINET\*(rq
+address.
+.sh 4 "ICD 0006"
+.pp
+The ICD value of 0006 is assigned to the Department of Defense (DoD).
+In ARGO, NSAP-addresses with an ICD value of 0006
+are of the format defined in RFC 986, a proposal for embedding DARPA Internet
+addresses within an OSI NSAP-address.
+In this case, the DSP takes the form:
+version (1 byte), DARPA Internet Address (4 bytes), upper layer protocol
+identifier (1 byte).
+This is called an
+\*(lqrfc986\*(rq
+address.
+.sh 1 "Internal Representation"
+.pp
+Internally, an NSAP address takes the form
+.(b
+\fC
+.TS
+tab(+);
+l s s s s.
+struct iso_addr {
+.T&
+l l l l l.
++u_char+isoa_afi;+/* authority &
++++format id */
++union+{+
+++struct addr_37+addr_37;+/* x.121 */
+++struct addr_osinet+addr_osinet;+/* OSINET */
+++struct addr_rfc986+addr_rfc986;+/* Internet*/
++}+isoa_u;
++u_char+isoa_len;+/* length */
+}
+.TE
+\fR
+.)b
+The field \fIisoa_afi\fR contains the AFI for the address.
+The union
+\fIisoa_u\fR contains the remainder of the address.
+The length of the entire address (the AFI, IDI, and DSP) is
+stored in \fIisoa_len\fR.
+.sh 1 "Network Layer Routing"
+.pp
+Routing at the network layer is performed by the
+routing procedure \fIrtalloc()\fR as described in Chapter 5.
+\fIRtalloc()\fR was designed for used in the DoD Internet
+domain.
+An unfortunate
+effect of this is that routing decisions are based upon either the
+entire NSAP address or the network portion of the address.
+The problem is defining the network portion of an NSAP address.
+The location and extent of the
+network portion of an NSAP address depends on the
+style of NSAP address.
+This decision is made by the function \fIiso_netof()\fR.
+.sh 2 "Network Portion of Type 37 Addresses"
+.pp
+There is no network portion of an X.121 address.
+In ARGO, the network portion of a type 37 address
+is defined to be just the AFI.
+The obvious consequence of this is that all type 37 addresses will
+match all other type 37 addresses
+in a network-portion comparison.
+.sh 2 "Network Portion of OSINET Addresses"
+.pp
+The network portion of an OSINET address is the organization identifier and
+the subnet identifier.
+.sh 2 "Network Portion of RFC986 Addresses"
+.pp
+The network portion of an RFC986 address is the network portion of the
+embedded DARPA Internet address.
+ARGO does not support subnetting, a method of subdividing Internet addresses.
+.sh 1 "NSAP Address / Subnetwork Point of Attachment Mapping"
+.pp
+In order to transmit a packet on a real subnetwork, the destination
+NSAP address
+must be mapped to an SNPA address.
+An SNPA address is the real, "hardware" address
+of a system on a network.
+This address corresponds to the 6 byte Ethernet or Token Ring
+Adapter address,
+or to the DTE address, which may be up to 7 bytes
+long (14 decimal digits).
+.pp
+A table, \fIsnpa_cache\fR is kept in the kernel which contains the
+translation between NSAP-addresses and SNPA-addresses.
+This table is used by \fIiso_snparesolve()\fR whenever a
+datagram must be dispatched.
+The table is maintained by the the ISO ES-IS protocol entity.
+Entries can be added and deleted
+by the user program \fIclnlutil(8)\fR and
+by the CONS entity.
diff --git a/share/doc/iso/wisc/appendix_a.nr b/share/doc/iso/wisc/appendix_a.nr
new file mode 100644
index 0000000..2522854
--- /dev/null
+++ b/share/doc/iso/wisc/appendix_a.nr
@@ -0,0 +1,51 @@
+.\" $Header: appendix_a.nr,v 1.3 88/12/07 10:42:12 nhall Exp $
+.(x
+Appendix A
+.)x
+.bp
+.sz +2
+.ce 3
+Appendix A
+
+\fBStandards Documents\fR
+.sz -2
+.lp
+The following appendix lists many of the standards documents which were
+consumed during development.
+.ip "\fBNetwork Layer\fR"
+.ip "ISO 8348" 15
+Network Service Definition
+.ip "ISO 8348/AD1" 15
+Connectionless-mode Transmission
+.ip "ISO 8348/AD2" 15
+Network Layer Addressing
+.ip "ISO 8648" 15
+Internal Organization of the Network layer
+.ip "ISO 8473" 15
+Protocol for Providing the Connectionless Network Service
+.ip "ISO 8473/DAD1" 15
+Provision of the Underlying Service Assumed by ISO 8473
+.ip "ISO 8473/DAD2" 15
+Formal Description of ISO 8473
+.ip "ISO 9542" 15
+End System to Intermediate System Routing Exchange Protocol
+for use in conjuction with the Protocol providing the Connectionless-mode
+Network Service
+.ip "ISO 8208" 15
+X.25 packet level protocol for data terminal equipment
+.ip "ISO 8878" 15
+Use of X.25 to Provide the Connection-mode Network Service
+.ip "\fBTransport Layer\fR"
+.ip "ISO 8072" 15
+Transport Service
+.ip "ISO 8073" 15
+Transport Protocol
+.ip "ISO 8073/PDAD2" 15
+Class 4 over Connectionless Network
+.ip "\fBFunctional Standards Profiles\fI"
+.ip "OSINET" 15
+Implementation Agreements Among Participants of OSINET, December 1987
+.ip "NBS" 15
+Implementors's Agreements
+.ip "GOSIP" 15
+Government OSI Profile
diff --git a/share/doc/iso/wisc/appendix_b.nr b/share/doc/iso/wisc/appendix_b.nr
new file mode 100644
index 0000000..01ade55
--- /dev/null
+++ b/share/doc/iso/wisc/appendix_b.nr
@@ -0,0 +1,10 @@
+.\" $Header: appendix_b.nr,v 1.1 88/12/05 18:08:02 nhall Exp $
+.(x
+Appendix B
+.)x
+.bp
+.sz +2
+.ce 3
+Appendix B
+
+\fBManual Pages\fR
diff --git a/share/doc/iso/wisc/debug.nr b/share/doc/iso/wisc/debug.nr
new file mode 100644
index 0000000..352eeee
--- /dev/null
+++ b/share/doc/iso/wisc/debug.nr
@@ -0,0 +1,1043 @@
+.\"$Header: debug.nr,v 1.4 88/12/06 16:05:36 nhall Exp $
+.\"$Source: /usr/argo/doc/kernel/RCS/debug.nr,v $
+.\"
+.\" Program names should be in italics
+.\"
+.NC "Debugging, Testing, and Statistics"
+.sh 1 "Introduction"
+.pp
+This section describes the methods used
+to test and debug the ARGO kernel.
+Three facilities are used in combination:
+debug options,
+simple statistics gathering,
+and
+protocol event tracing.
+Many of the debug options
+simply cause information to be printed on the console, but
+several of these options cause
+TP to behave pathologically
+so that errors are be introduced in desirable ways.
+.pp
+TP and CLNP keep simple statistics.
+These statistics include such things as the total
+number of PDUs that are sent and received,
+a count of various types of errors
+that can be encountered when parsing an incoming PDU,
+and the average and standard deviation of round trip times for
+transport PDUs.
+These statistics are useful for debugging.
+For example,
+if an incoming CC TPDU is rejected because one of the optional
+parameters is faulty, this are noted in the statistics.
+The statistics are kept on a system-wide basis rather than
+on a per-connection basis.
+They can be printed or cleared by user-level utility programs.
+.pp
+The tracing facility allows selective tracing of events.
+Events are grouped into categories relating to different
+functions of TP.
+For example, it is possible to
+trace only the events that pertain to acknowledgments.
+.pp
+At run time the debugging and tracing options can
+be set and cleared by privileged utility programs.
+Each of these facilities is described in more
+detail below.
+.sh 1 "Debugging"
+.pp
+Most of the debugging options
+print messages on the console.
+Kernel printing is done by busy-waiting at high priority,
+so debugging options should be used very sparingly.
+A sample of the code is:
+.(b
+.nf
+\fC
+IFDEBUG(D_TPINPUT)
+ printf("tp_input m 0x%x tpdu_len 0x%x\n", m, tpdu_len);
+ENDDEBUG
+\fR
+.fi
+.)b
+.sp 1
+.lp
+IFDEBUG and ENDDEBUG are macros that are defined in one of two ways.
+If the system is configured with the ARGO_DEBUG
+option, an array
+\fCargo_debug[128]\fR
+is declared, and
+IFDEBUG and ENDDEBUG are defined thus:
+.(b
+.nf
+\fC
+#define IFDEBUG(option) if(argo_debug[option]) {
+#define ENDDEBUG ; }
+\fR
+.fi
+.)b
+.lp
+If the system is configured without the ARGO_DEBUG option, these
+two macros resolve to the C comment delimiters, \fC/*\fR and \fC*/\fR,
+causing all the debugging code lying between the macros
+to be elided.
+.pp
+TP, CLNP, and CONS debugging can be enabled independently.
+All debugging requires that the code be compiled with the
+option ARGO_DEBUG.
+The \fIconfig(8)\fR option CLNP_DEBUG will include debugging printfs for CLNP.
+TP_DEBUG has the same effect for TP.
+.pp
+The array elements of \fCargo_debug[]\fR are set by
+the utility program
+\fIbark\fR,
+which reads and writes
+\fC/dev/kmem\fIN\fR.
+See the manual page \fIbark(8)\fR.
+.pp
+Several debugging options cause TP to behave pathologically,
+for the purpose of reproducing difficult-to-reproduce
+error conditions that the protocol must correct.
+For example, the
+\fID_DROP\fR, or \fIbark -on T.drop\fR
+option causes
+\fItp_input()\fR
+to discard TPDUs on a pseudo-random basis.
+These will be described below.
+.sh 1 "Statistics"
+.pp
+.sh 2 "CLNP Statistics"
+.pp
+CLNP keeps a set of statistics related to its operation.
+Statistics include such things as NPDUs sent, received, and dropped.
+These statistics are stored in the global structure \fIclnp_stat\fR.
+The utility program \fInetstat(8)\fR may be used to print these statistics.
+.sh 2 "TP Statistics"
+.pp
+TP keeps a set of running counts of certain events.
+The statistics include such things as the numbers
+of each type of TPDU sent and received, TPDUs dropped,
+and the numbers of occurrences of certain types of errors.
+The statistics are stored in the global structure \fItp_stat\fR.
+The utility programs
+\fItpstat\fR and
+\fItpmon\fR
+read \fC/dev/kmem\fIN\fR
+and prints the contents of the statistics structure
+in a human-readable form.
+\fITpstat\fR prints the statistics on any ascii screen or printer.
+\fITpmon\fR uses the \fIcurses\fR library and assumes that is has
+a screen or window of size 53(long) X 80(wide), and it updates the
+screen every 30 seconds.
+.pp
+\fITpstat\fR and \fItpmon\fR can be used to clear the statistics (set them
+all to zero); the \fB-c\fR option causes the statistics to be cleared.
+.pp
+Statistics are observed using \fItpstat(8)\fR
+to clear statistics before a test, and to print
+the statistics after the test.
+See the manual pages \fItpstat(8)\fR and \fItpmon(8)\fR.
+.sh 1 "Tracing"
+.pp
+.sh 2 "CLNP Tracing"
+.pp
+CLNP does not support event tracing.
+.sh 2 "TP Tracing"
+.pp
+The tracing facility consists of a circular buffer (an array)
+of structures that are written by the kernel at various times,
+and a utility program that reads \fC/dev/kmem\fIN\fR
+to interpret the contents of the buffer.
+The trace structure is a union of the structures that
+will be interpreted by the utility program.
+A trace event consists of a call to the trace routine \fItpTrace\fR
+with a set of arguments containing the information relevant to the
+event being traced.
+The procedure tpTrace is actually called through a macro \fItptrace\fR.
+For example,
+.(b
+.nf
+\fC
+IFTRACE(D_INPUT)
+ tptrace(TPPTtpduin, h->tpdu_type, h, h->tpdu_li+1, 0, 0);
+ENDTRACE
+\fR
+.fi
+.)b
+.pp
+The tracing macros are defined in the same manner as the
+debugging macros:
+.(b
+.nf
+\fC
+#define IFTRACE(option) if(tp_traceflags[option]) {
+#define ENDTRACE }
+\fR
+.fi
+.)b
+.lp
+If the kernel is configured with the option TPPT, these macros
+are defined as shown above, but if the TPPT option is not
+used, these macros become C-style comment delimiters.
+.pp
+The tracing procedure copies \fIh->tpdu_li + 1\fR bytes beginning at
+location \fIh\fR into a trace structure in the circular buffer.
+The utility program \fItppt\fR
+reads the trace structure,
+interprets the data as a TPDU header,
+and prints the header in hexadecimal form, with a banner identifying
+the event as an incoming TPDU:
+.(b
+.nf
+\fC
+1a: Ref 22 arg 14(0xe), @ 91990 : 0000.453125 tpdu
+INPUT total len 22
+HDRLEN: 21+1 CR_TPDU_type cdt 0(0x0) dref 0x0
+ + 0: 0x15 0xe0 0x00 0x00 4: 0x00 0x03 0x00 0xc1
+ + 8: 0x06 0x74 0x70 0x70 12: 0x69 0x6e 0x67 0xc2
+ +16: 0x02 0x00 0x07 0xc0 20: 0x01 0x08 0x00 0x00
+
+\fR
+.fi
+.)b
+.pp
+In addition to the data copied from the arguments to tpTrace(),
+each trace structure contains
+a time stamp and an event sequence number, and in many cases, the
+connection reference to which the traced event applies.
+The utility program \fItppt\fR is be used to turn on and off the
+tracing options.
+.pp
+This facility can be used for debugging the source
+code as well as for studying the behavior of the protocol.
+For example, by adding the appropriate trace events,
+it is possible to "see" the resequencing function of TP
+working when a debug option is used to cause
+TPDUs to be dropped occasionally.
+.pp
+See the manual page \fItppt(8)\fR.
+.sh 1 "Testing"
+.pp
+.sh 2 "CLNP Testing"
+.pp
+CLNP was tested in two rather different ways.
+The first method of testing used the
+raw CLNP interface with the program \fIclnptest\fR.
+\fIclnptest\fR allows a user to send or receive CLNP NSDUs.
+With \fIclnptest\fR, a user can send CLNP NSDUs with various
+combinations of options and observe the result.
+.pp
+The second method of testing CLNP was to have TP use CLNP as its network
+layer protocol.
+This method provides a good stress test for CLNP.
+Unfortunately, TP generally calls CLNP in the same manner, so that not all
+of the CLNP options are exercised.
+.sh 3 "Clnptest"
+.pp
+The program \fIclnptest\fR can be invoked as either
+a reader or as a writer:
+.(b
+\fC
+clnptest <options>
+\fR
+.)b
+The \fI-r\fR option invokes \fIclnptest\fR as a reader, the
+\fI-w\fR option invokes it as a writer.
+Other options allow the user to indicate the destination, number of NSDUs,
+size of NSDUs,
+and NSDUs options.
+See \fIclnptest(8)\fR for more information.
+.pp
+\fIclnptest\fR is normally used in the following manner.
+On one machine, invoke \fIclnptest\fR as a reader:
+.(b
+\fC
+clnptest -r
+\fR
+.)b
+On a different machine, transmit an NSDU.
+For example, to test the source route function, one invokes:
+.(b
+\fC
+clnptest -w -h a -oR "b, c, d"
+\fR
+.)b
+This sends an NSDU to host 'a', source routing it via
+hosts 'b', 'c', and 'd'.
+.sh 3 "The Troll"
+In order to test CLNP reassembly certain errors must be generated.
+The mechanism used has two parts,
+the user program \fIclnptroll\fR, which enables and disables
+the generation of these errors, and the
+kernel resident error-creation routines.
+.pp
+Troll options allow one to duplicate an NSDU with a specified frequency.
+The kernel must be compiled with the \fIconfig\fR option \fITROLL\fR
+in order to include troll code.
+See \fIclnptroll(8)\fR for more information.
+.sh 3 "Debugging CLNP"
+.pp
+The following sections describe the \fIbark\fR options
+appropriate for testing parts of CLNP.
+Refer to \fIbark(8)\fR for more information about debugging
+using \fIbark\fR..
+.sh 4 "Sending NSDUs"
+.pp
+Turning on the \fIbark\fR
+option \fIC.output\fR causes information to be
+printed whenever an NSDU is transmitted.
+Translation of NSAP addresses to SNPA can be monitored by turning on
+the \fIC.un\fR, or \fIC.lan\fR options.
+Parts of outgoing NSDUs can be dumped when the \fIC.dumpout\fR
+option is on.
+Routing activity can be watched by turning on \fIC.route\fR and \fIC.iso\fR.
+Information about CLNP option processing is available with \fIC.options\fR.
+.sh 4 "Forwarding NSDUs"
+.pp
+The \fIforward\fR switch will cause debugging information to be displayed
+whenever NSDUs are forwarded.
+.sh 4 "Receiving NSDUs"
+.pp
+Information is displayed about incoming NSDUs when the \fIC.input\fR
+option is enabled.
+A portion of incoming NSDUs can be dumped by turning on the
+\fIC.dumpin\fR option.
+.sh 4 "Fragmentation and Reassembly"
+.pp
+The options \fIC.frag\fR and \fIC.reass\fR turn on debugging for the
+CLNP fragmentation and reassembly functions.
+.sh 2 "TP Testing"
+.pp
+Five services were used for most of the testing:
+the \fIdiscard\fR service,
+the \fIecho\fR service,
+the \fIremote login\fR service,
+the \fIremote shell\fR service,
+and
+the \fIsimple file transfer\fR service.\**
+.(f
+\** In fact, ancestors of these services were used for testing the
+ARGO transport implementation during development.
+These programs in their original forms were very cumbersome to use;
+consequently they evolved to become the services described here.
+.)f
+Each service consists of a daemon process or server that listens
+on a well-known transport selector (which is listed in the
+ARGO directory service), and an active process that contacts the
+server.
+Four of these services,
+discard, echo, remote login, and remote shell,
+are supported by the
+\fIisod\fR suite of daemons, which is a
+version of the \fIinetd\fR programs that uses
+the ISO protocol suite.
+.sh 3 "The Discard Service"
+The discard server listens on the transport selector
+registered in the ARGO directory service for the application
+"discard".
+The server accepts incoming connection requests,
+receives TSDUs, and throws away the TSDUs.
+It never initiates a disconnect, but expects its peer
+to disconnect the transport connection.
+.PP
+The program \fItpdiscard\fR connects to the
+discard server.
+The transport service and protocol options it uses are those
+indicated in the ARGO directory service.
+By changing the directory service entry for the
+discard service, each of the transport service options and
+protocol options can be demonstrated.
+See the manual pages
+\fItpdiscard(8)\fR,
+\fItp(4p)\fR,
+and
+\fIisodir(5)\fR
+for more information.
+.sh 3 "The Echo Service"
+The echo server listens on the transport selector
+registered in the ARGO directory service for the application
+"echo".
+The server accepts incoming connection requests,
+receives TSDUs, and returns the TSDUs to the sender.
+It never initiates a disconnect, but expects its peer
+to disconnect the transport connection.
+.pp
+The
+program \fItpping\fR connects to the
+echo server.
+The transport service and protocol options it uses are those
+indicated in the ARGO directory service.
+By changing the directory service entry for the
+echo service, each of the transport service options and
+protocol options can be demonstrated.
+See the manual pages
+\fItpping(8)\fR,
+\fItp(4p)\fR,
+and
+\fIisodir(5)\fR
+for more information.
+.sh 3 "The Remote Login Service"
+The remote login server listens on the transport selector
+registered in the ARGO directory service for the application
+"login".
+The server accepts incoming connection requests,
+implements the BSD remote login protocol, checks permissions using
+the \fC~/.rhosts\fR, and \fC/etc/passwd\fR files, and
+uses the ARGO directory service to discover name-to-NSAP-address
+mappings.
+If the remote user is authorized to log in to the end system on which
+the server runs, a login is started.
+.pp
+The program \fIrlogin.iso\fR connects to the remote login server.
+The transport service and protocol options it uses are those
+indicated in the ARGO directory service.
+By changing the directory service entry for the
+login service, each of the transport service options and
+protocol options can be demonstrated.
+See the manual pages
+\fIrlogin.iso(8)\fR,
+\fItp(4p)\fR,
+and
+\fIisodir(5)\fR
+for more information.
+.sh 3 "The Remote Shell Service"
+The remote shell server listens on the transport selector
+registered in the ARGO directory service for the application
+"shell".
+The server accepts incoming connection requests,
+implements the BSD remote command authorization protocol,
+checks permissions using
+the \fC~/.rhosts\fR, and \fC/etc/passwd\fR files, and
+uses the ARGO directory service to discover name-to-NSAP-address
+mappings.
+If the remote user is authorized to execute a shell on
+the end system on which
+the server runs, a shell is started.
+.pp
+The program \fIrcp.iso\fR connects to the remote shell server to
+effect a remote copy.
+The transport service and protocol options it uses are those
+indicated in the ARGO directory service.
+By changing the directory service entry for the
+shell service, each of the transport service options and
+protocol options can be demonstrated.
+See the manual pages
+\fIrcp.iso(8)\fR,
+\fItp(4p)\fR,
+and
+\fIisodir(5)\fR
+for more information.
+.sh 3 "The Simple File Transfer Service"
+.pp
+The last service consists of a pair of programs,
+\fItpfileget\fR and
+\fItpfileput\fR,
+which cooperate to transfer one file.
+The passive program, \fItpfileget\fR,
+listens on the transport selector registered in the ARGO directory service
+to support the application named "tptestsel".
+The sending program, \fItpfileput\fR,
+connects to the passive program, transfers in one TSDU
+the file named on the \fItpfileput\fR command line, and waits for the
+passive end to close the connection.
+\fITpfileget\fR
+opens a file of the name given on its command line,
+accepts one connection request, receives
+one TSDU, writes the contents of that TSDU to the opened file,
+and when it receives the end-of-TSDU indication,
+\fItpfileget\fR closes the transport connection.
+The transport service options and protocol options used by
+\fItpfileput\fR are determined by the ARGO directory service
+record that describes the applicaition "tptestsel".
+See the manual pages
+\fItpfileget(8)\fR,
+\fItp(4p)\fR,
+and
+\fIisodir(5)\fR
+for more information.
+.sh 3 "Internal TP Testing"
+.pp
+The methods used to test each of the various functions
+of TP are described in this section.
+One or more of the services described above were used, while
+the TP activity was observed with tracing or debugging or both.
+The statistics were cleared before each test and inspected
+after each test.
+Each test can be run with different protocol and service options,
+by changing the transport parameters in records
+in the ARGO directory service file.
+See the manual pages
+\fItpstat(8)\fR,
+\fItpmon(8)\fR,
+\fItppt(8)\fR,
+\fIbark(8)\fR,
+\fItp(4p)\fR,
+and
+\fIisodir(5)\fR
+for more information.
+.sh 4 "Normal and Expedited Data Transfer:"
+.pp
+TSDUs are
+distinguished by the presence or absence of the
+EOTSDU bit in the \fIflags\fR parameter of the
+\fIsendv()\fR system call.
+The data of a TSDU are copied into chains of \fImbufs\fR
+in the kernel so that the end of a TSDU lies in an mbuf
+with the \fIm_act\fR field non-zero.
+The end of a TSDU never lies in the middle of an
+mbuf.
+This is true on the receiving side as well.
+On output, the segmenting function,
+the function that copies user data into mbuf chains
+reorganizes mbuf chains into TPDUs,
+is observed using several debug options
+and trace options
+in the routines \fIsosend()\fR
+and \fItp_sbsend()\fR.
+On input, the reassembling mechanism
+is observed in the routine \fItp_stash()\fR.
+The debug options
+\fBT.ndata\fR,
+\fBT.sb\fR, and
+\fBT.xpd\fR
+print information
+pertinent to this function.
+.pp
+Expedited data complicates the matter of segmenting
+because markers must be kept in the chains of outgoing
+TPDUs to indicate the precedence of expedited data TPDUs
+over normal data TPDUs.
+The pertinent trace options are \fBT.sb\fR and \fBT.ndata\fR.
+With the trace and (or) debugging options on,
+and with \fItpdiscard\fR running, one can observe the segmentation
+and reassembly of TPDUs.
+.pp
+Using the file transfer programs to transfer a file,
+then transferring it back with \fIrcp\fR (the TCP version) if necessary, and
+using
+\fIdiff\fR, one can see that data are transferred correctly.
+The \fBT.input\fR trace option creates a readable hexadecimal dump of incoming TPDUs.
+The
+\fBT.emit\fR
+trace option creates the same sort of dump for outgoing
+TPDUs in \fItp_emit()\fR.
+Sequencing
+can be observed by using the
+\fBT.ndata\fR
+and
+\fBT.input\fR
+or
+\fBT.emit\fR
+trace options
+to see the sequence numbers assigned to TPDUs.
+.pp
+The
+\fBT.drop\fR
+debug option causes \fItp_input()\fR
+to throw away occasional TPDUs.
+(The formula for determining when to discard a TPDU
+is ad hoc and simplistic. It causes TPDUs to be
+discarded frequently but not so frequently that the
+receiving side has no chance to recover.)
+With tracing on and the file transfer programs running,
+resequencing can be observed
+and the correctness of the transferred data
+can be verified with \fIdiff(1)\fR.
+.pp
+The use of both normal and extended formats
+can be observed with the \fBT.input\fR and \fBT.emit\fR trace options.
+.pp
+The following statistics are of interest:
+.(b
+.nf
+\fIn\fR connections used extended format
+\fIn\fR connections allowed transport expedited data
+\fIn\fR connections turned off checksumming
+\fIn\fR connections dropped due to retrans limit
+\fIn\fR EOT bits on incoming TPDUs
+\fIn\fR EOT bits on outgoing TPDUs
+\fIn\fR XPD marks discarded
+\fIn\fR XPD stopped data flow \fIm\fR times
+\fIn\fR DTs out of order
+\fIn\fR DTs not in window
+\fIn\fR duplicate DTs
+\fIn\fR XPDs not in window
+\fIn\fR XPDs w/o credit to stash
+\fIn\fR DT (sent)
+\fIn\fR DT (received)
+\fIn\fR DT (retransmitted)
+\fIn\fR XPD (sent)
+\fIn\fR XPD (received)
+\fIn\fR random DTs dropped
+.fi
+.)b
+.sh 4 "Checksumming, use and non-use:"
+.pp
+The checksum generation and checking
+routines were first written and debugged as user-level
+routines before they were modified for kernel use.
+The kernel routines may be observed with the
+\fBT.chksum\fR
+debug option.
+Various sizes of mbufs can be created by creative use of the
+ARGO directory service, particularly by changing the value of the
+attribute \fItp.tpdusize\fR.
+There is no trace option for checksumming.
+Checksumming has been used with transfers to and from at least
+one other TP implementation.
+.pp
+The statistics that are pertinent to checksumming are:
+.(b
+.nf
+\fIn\fR connections turned off checksumming
+\fIn\fR invalid checksums
+.fi
+.)b
+.sh 4 "Acknowledgment:"
+.pp
+Acknowledgment can be observed by using the
+debug and trace options
+\fBT.aks\fR,
+\fBT.akr\fR,
+\fBT.input\fR,
+\fBT.emit\fR,
+and
+\fBT.driver\fR.
+The transport driver (finite state machine) and the routine
+\fItp_goodack()\fR dump information appropriate to acknowledgments.
+If the \fBT.ndata\fR, and \fBT.emit\fR or \fBT.input\fR trace options are used
+along with the \fBT.aks\fR and \fBT.akr\fR trace options,
+a complete picture of the data transfer and acknowledgment
+activity can be created.
+The acknowledgments for expedited data are traced with
+the
+\fBT.xpd\fR
+trace option.
+The routine \fItp_goodXack()\fR and the finite state
+machine dump information when the
+\fBT.xpd\fR
+debug and trace options are used.
+To cause expedited data to be generated,
+the -e or -E option on the discard programs or the file
+transfer programs are used.
+To observe the different acknowledgment strategies,
+the protocol options were changed in the ARGO directory service.
+.pp
+The pertinent statistics are:
+.(b
+.nf
+\fIn\fR AK (received)
+\fIn\fR AK (sent)
+ACK reasons:
+\fIn\fR not acked immediately
+\fIn\fR strategy==each
+\fIn\fR strategy==fullwindow
+\fIn\fR duplicate DT
+\fIn\fR EOTSDU
+\fIn\fR reordered
+\fIn\fR user rcvd
+\fIn\fR fcc reqd
+.fi
+.)b
+.pp
+The smoothed average round trip time is kept
+for outgoing TPDUs for each transport connection
+and for the entire TP entity.
+The time each TPDU is transmitted is recorded, and when an acknowledgment
+arrives, the round trip time is computed for the lowest
+sequence number that this AK TPDU acknowledges.
+The computation of round trip times can be observed
+in a trace with the
+\fBT.rtt\fR
+option.
+.pp
+In addition to average round trip times, the kernel
+maintains the standard deviation of the round trip times.
+This statistic is kept for each connection and for the entire
+TP entity.
+In fact, four such sets of statistics are kept for the TP entity:
+.np
+for traffic not on a public data network (PDN) and on the same network as this end system,
+.np
+for traffic not on a public data network (PDN) and on not the same network as this end system,
+.np
+for traffic on a public data network (PDN) and on the same network as this end system,
+and
+.np
+for traffic on a public data network (PDN) and not on the same network as this end system.
+The determination of whether traffic is on the same network as this end system
+is based on the "network portion" of the peer's NSAP-address.
+For more information about this, see the section of this document titled
+\fB"Network Layer Routing"\fR.
+.pp
+The smoothed average round trip time statistics for a given
+can be observed with the -t option to
+\fItpstat(8)\fR.
+The global round trip statistics can be observed with the -s option to
+\fItpmon(8)\fR.
+.sh 4 "Flow Control:"
+.pp
+Flow control activity is the transfer of credit information
+from end to end and the proper use of that information.
+To see that it works properly, one must observe three
+things:
+the receiving window must shut down and reopen,
+the sender must transmit enough TPDUs to fill the receiver's window
+but no more, and the receiver must renege previously advertised credit.
+These three behaviors have been observed as follows.
+.pp
+Tracing with the
+\fBT.ndata\fR,
+\fBT.aks, \fR
+\fBT.akr, \fR
+\fBT.emit\fR
+and
+\fBT.input\fR
+trace options
+are used.
+The program \fItpdiscard\fR or a simple file transfer
+is run with various window
+and maximum TPDU sizes, various acknoledgment strategies, and
+various retransmission strategies,
+and the activity is observed with the trace.
+The debug option
+\fBT.reneg\fR
+must be used to fake a reneging of credit, since
+the ARGO transport entity does not renege its advertised credit
+under normal operation.
+At the beginning of a connection a closed window may almost always
+be observed.
+The receiving user process may be stopped
+to force a window to shut down.
+The interesting statistics are
+.(b
+.nf
+\fIn\fR times local cdt reneged (receiving)
+\fIn\fR foreign window closed (sending)
+\fIn\fR faked reneging of cdt
+\fIn\fR DT TPDUs (sent)
+\fIn\fR DT TPDUs (received)
+\fIn\fR AK TPDUs (sent)
+\fIn\fR AK TPDUs (received)
+ACK reasons:
+\fIn\fR not acked immediately
+\fIn\fR strategy==each
+\fIn\fR strategy==fullwindow
+\fIn\fR duplicate DT
+\fIn\fR EOTSDU
+\fIn\fR reordered
+\fIn\fR user rcvd
+\fIn\fR fcc reqd
+.fi
+.)b
+.sh 4 "Retransmission and retention until acknowledgment:"
+.pp
+To observe that the sender retains TPDUs until they are
+acknowledged, one needs only to use the
+\fBT.drop\fR
+debug option to cause TPDUs to be dropped by the receiving side.
+They are then retransmitted by the sender
+and finally dropped when the acknowledgment arrives.
+That the buffers used to hold retained TPDUs are freed
+can be observed by
+running \fInetstat(8)\fR with the -m option
+on a quiescent system to observe the number of mbufs in use,
+then
+running a test with the
+\fBT.drop\fR debug option on to cause retransmission,
+and
+finally
+running netstat -m again after the test is over,
+to see that all the mbufs have been freed by TP.
+The actual retransmission activity can be observed in a trace
+with the
+\fBT.ndata, \fR
+\fBT.emit\fR and
+\fBT.input\fR trace options.
+The retransmission strategy to be used is controlled by the
+ARGO directory service.
+The statistics
+.(b
+.nf
+\fIn\fR DT (retransmissions)
+\fIn\fR XPD (retransmissions)
+\fIn\fR CR (retransmissions)
+\fIn\fR CC (retransmissions)
+\fIn\fR DR (retransmissions)
+.fi
+.)b
+.lp
+indicate the number of retransmissions that actually occurred.
+.sh 4 "Timers:"
+.pp
+The debug and trace option
+\fBT.timer\fR
+dumps information about the timers as they are set,
+as they are cancelled, and as they expire.
+The statistics
+.(b
+.nf
+\fIn\fR ticks
+\fIn\fR timers set
+\fIn\fR timers expired
+\fIn\fR timers cancelled
+\fIn\fR inactive timers cancelled
+\fIn\fR connections dropped due to retrans limit
+\fIn\fR CCs sent to zero dref
+.fi
+.)b
+.lp
+are printed for both the E-type timers and for the C-type timers.
+The effect of timers can be seen by observing retransmissions.
+Two simple ways to force retransmissions are:
+.np
+to use the \fBT.zdref\fR debug option,
+which causes CCs to contain a zero destination reference,
+so that connection establishment will time out, and
+.np
+to attempt to open a connection to a transport selector on which
+no process is listening.
+Either of these actions, along with the
+\fBT.connect\fR
+trace or debug option will permit
+observation of the timeout facilities.
+.sh 4 "TPDU creation and parsing:"
+.pp
+TPDUs are created for output in
+\fItp_emit()\fR.
+The
+\fBT.emit\fR
+trace
+option dumps TPDUs as they are transmitted.
+\fITp_input()\fR parses TPDUs on input.
+The
+\fBT.input\fR
+trace
+option dumps TPDUs as they are received.
+The debug options \fBT.emit\fR and \fBT.input\fR dump a lot of excess information
+to the console, and are used primarily for debugging
+extremely pathological behavior.
+.pp
+By tracing the execution of
+\fItpdiscard\fR or a simple file transfer,
+with a variety protocol and service options,
+using the
+\fBT.connect,\fR
+\fBT.emit,\fR
+\fBT.input,\fR
+\fBT.ndata,\fR
+\fBT.aks,\fR
+\fBT.akr,\fR
+and
+\fBT.xpd\fR
+options,
+one can verify the correct placement of TPDU options
+on all types of TPDUs.
+The interesting statistics are
+.(b
+.nf
+\fIn\fR variable parameters ignored
+\fIn\fR invalid parameter codes
+\fIn\fR invalid parameter values
+\fIn\fR invalid dutypes
+\fIn\fR invalid negotiation failures
+\fIn\fR invalid destinagion referencess
+\fIn\fR invalid suffix parameters
+\fIn\fR invalid checksums
+\fIn\fR connections used extended format
+\fIn\fR connections allowed transport XPD
+\fIn\fR connections turned off checksumming
+\fIn\fR TP 4 connections
+\fIn\fR TP 0 connections
+.fi
+.)b
+.sh 4 "Separation and concatenation:"
+.pp
+Concatenation is not supported by this implementation.
+Separation is supported, however, and to test separation,
+some sort of concatenated TPDUs had to be created.
+The code for this is no longer supported.
+After testing locally with some temporary code to create concatenated
+TPDUs,
+the ARGO transport implementation was tested with another transport
+implementation that does generate concatenated TPDUs.
+The interesting statistics are:
+.(b
+.nf
+\fIn\fR concatenated TPDUs
+\fIn\fR TPDUs input
+.fi
+.)b
+.sh 4 "Length limits for TPDUs:"
+.pp
+Some TPDUs may take user data:
+the CR, CC, DR, DT, and XPD.
+All of these but the DT TPDU have limits to the amount
+of data they may carry.
+The limits are enforced for CR, CC, and DR TPDUs by
+\fItp_ctloutput()\fR,
+the routine that accepts data from the user.
+The limit for XPD TPDUs is enforced by
+\fItp_usrreq()\fR, which accepts expedited
+data from the user.
+To test the effectiveness of the checks on output, one may attempt
+to send expedited data with amounts larger than the limit (16 bytes).
+.pp
+On input the limits are checked in
+\fItp_input()\fR.
+To test the effectiveness of the checks on input, it was necessary
+to create an illegally large TPDU.
+The
+\fBT.badsize\fR
+debug option
+does this - it will turn a legitimate
+XPD TPDU into a XPD TPDU with 18 bytes
+of expedited data.
+The interesting statistics are:
+.(b
+.nf
+\fIn\fR illegally large XPD TPDU
+\fIn\fR invalid length
+.fi
+.)b
+.sh 4 "Frozen References:"
+.pp
+The key issue here is to see that references are not reassigned
+until the reference timer expires.
+This can be observed by watching the timer activity as described
+above and by observing the reference numbers chosen for sockets
+with the \fBT.emit\fR
+or \fBT.input\fR trace options, which trace the TPDU headers.
+.sh 4 "Inactivity Control:"
+.pp
+Inactivity control can be observed by turning on the trace options
+\fBT.aks\fR, \fBT.akr\fR and \fBT.emit\fR
+during a simple file transfer.
+In the middle of the transfer, if the sender process
+is stopped, both TP entities continue
+to send acknowledgments.
+This can be observed in the trace.
+If the file tranfer is between machines, taking down one of the machines
+will cause the inactivity timer on the other machine to expire.
+The TP entity will respond to this by sending a DR TPDU
+to close the connection, which can be observed in the trace.
+The expiration of the timer can be observed in a trace if the
+\fBT.driver\fR option is used.
+This option traces all events and state changes in the
+TP
+finite state machine.
+.sh 4 "Connection establishment:"
+.pp
+The process of connection establishment can be observed with the
+\fBT.connect\fR
+trace and debug options, and
+the
+\fBT.driver \fR
+trace option.
+Various states of the connection establishment state machine
+may be observed with the
+the debug option
+\fBT.zdref\fR.
+This option
+causes \fItp_input()\fR
+to change the foreign reference on an incoming CC TPDU to zero,
+eventually causing the CC TPDU to be dropped,
+retransmissions of the CC to occur,
+and the connection to time out before being established.
+The statistics of interest are:
+.(b
+.nf
+\fIn\fR CCs sent to zero dref
+\fIn\fR invalid dest refs
+\fIn\fR CC (received)
+\fIn\fR CC (sent)
+\fIn\fR CC (retransmitted)
+\fIn\fR (connections) timed out on retrans
+.fi
+.)b
+.sh 4 "Disconnection:"
+.pp
+Various states of the connection breakdown part of the state machine
+may be observed with the
+the trace options
+\fBT.input\fR
+or
+\fBT.emit\fR,
+\fBT.driver\fR
+and
+running the
+discard or file transfer programs.
+.sh 4 "Association of TPDUs with Transport Connection:"
+.pp
+The problem of locating a transport connection
+given a TPDU is handled in
+\fItp_input()\fR in one of two ways.
+For an incoming CR TPDU, the transport suffix
+is used to locate a transport protocol
+control block (PCB), to which a transport
+connection is made by creating a new socket and PCB.
+For all other TPDU types, the destination reference is used
+to locate the appropriate transport connection.
+This is done by scanning the list of reference blocks.
+Debug and trace options
+were used to debug these sections of code but have since been
+removed due to their effect on the readability
+and maintainability of this code.
+The trace options
+\fBT.connect\fR
+and
+\fBT.newsock\fR
+creates trace records that contain the address of the
+socket as well as that of the PCB
+when a socket is opened.
+When a TPDU arrives for a given socket,
+the trace records created by the
+\fBT.input \fR
+option will also contain the address of the PCB that is found
+in
+\fItp_input()\fR.
+These two addresses can be compared in the trace output to observe
+that the proper association is made.
+.sh 4 "Protocol Errors and the ER TPDU:"
+.pp
+Certain types of errors are intended to evoke the response
+from the TP entity of sending an ER or a DR TPDU.
+The routine
+\fItp_error_emit()\fR
+creates ER and DR TPDUs for this purpose.
+The debug and trace option
+\fBT.erroremit\fR
+dumps information about the activity of this routine.
+Since ER TPDUs are not generated under normal circumstances,
+the parsing of ER TPDUs was tested in this
+implementation by code that generated (illegitimate) ER TPDUs,
+This code was removed because it significantly complicated code maintenance.
+.sh 4 "User Interface:"
+.pp
+The debug and trace options
+\fBT.request\fR,
+\fBT.params,\fR
+\fBT.indication\fR
+and
+\fBT.syscall\fR and
+dump information about the user interface.
+Most of the debugging code added to the socket-layer
+routines for debugging has since been removed so that
+the source (which is functionally unchanged from the 4.3 release)
+would not unnecessarily be changed.
+\fIRlogin.iso\fR, the TP version of remote login,
+exercises some of the original BSD data transfer system calls
+(\fIread()\fR and \fIwrite()\fR)
+rather than \fIsendv()\fR and \fIrecv()\fR.
+The interesting statistics are
+.(b
+.nf
+\fIn\fR EOT indications
+\fIn\fR user rcvd
+\fIn\fR connections used extended format
+\fIn\fR connections allowed transport XPD
+\fIn\fR connections turned off checksumming
+\fIn\fR TP 4 connections
+\fIn\fR TP 0 connections
+.fi
+.)b
diff --git a/share/doc/iso/wisc/def.nr b/share/doc/iso/wisc/def.nr
new file mode 100644
index 0000000..1e691bf
--- /dev/null
+++ b/share/doc/iso/wisc/def.nr
@@ -0,0 +1,144 @@
+.NC "Definitions"
+.sh 1 "General Terms"
+.ip "Kernel" 5
+The source code or binary module for the Acis Operating System
+(also know as AOS and IBM/4.3).
+.ip "User process" 5
+An instance of a program that is
+running in unprivileged mode, in the unprivileged address space
+commonly know as "user address space", in other words, not
+part of the kernel.
+.ip "IPC" 5
+Interprocess communication, the mechanism by which two different
+user processes send messages to each other.
+.ip "Unix, AOS" 5
+ACIS Operating System, the IBM ACIS port of Berkeley Unix 4.3BSD.
+.ip "PCB, pcb" 5
+Protocol control block. Each instance of a protocol machine
+keeps status information, addresses, and in some cases queues
+in a pcb for each connection or socket.
+.ip "Domain" 5
+In the Berkeley Unix environment, a domain is an abstract entity which
+comprises a network architecture, addressing scheme, address format,
+network protocols, and transport protocols.
+.sh 1 "Transport Layer Terms"
+.ip "ISO 8073"
+ISO Draft International Standard 8073, Transport Protocol Specification
+.ip "TP" 5
+The collection of transport
+classes that have been implemented in ARGO, classes 0 and 4.
+Also means the ARGO implementation of TP.
+.ip "TP 0" 5
+Transport class 0.
+.ip "TP 4" 5
+Transport class 4.
+.ip "Transport entity" 5
+Software or hardware that implements the elements of procedure
+described in ISO 8073.
+.ip "Transport user" 5
+User process that make use of the services
+provided by a transport entity.
+.ip "Transport service interface" 5
+The syntax and semantics of the set of procedures, functions, and system calls
+that are invoked by a transport user,
+through which the services of the transport entity are delivered.
+.ip "TPDU" 5
+Transport protocol data unit, a packet that is
+passed from one transport entity to another.
+.ip "TSDU" 5
+Transport service data unit, the logical unit of data that is
+passed from a transport entity to a transport user, or from
+a transport user to a transport entity.
+.ip "CR TPDU" 5
+Connection request TPDU.
+.ip "CC TPDU" 5
+Connection confirm TPDU.
+.ip "DR TPDU" 5
+Disconnect request TPDU.
+.ip "DC TPDU" 5
+Disconnect confirm TPDU.
+.ip "DT TPDU" 5
+Normal data TPDU.
+.ip "XPD TPDU" 5
+Expedited data TPDU.
+.ip "AK TPDU" 5
+Normal data acknowledgment TPDU.
+.ip "XAK TPDU" 5
+Expedited data acknowledgment TPDU.
+.ip "ER TPDU" 5
+Error TPDU.
+.sh 1 "Network Layer Terms"
+.ip "ISO 8473"
+ISO Draft International Standard 8473, connectionless network protocol.
+.ip "CONS"
+Connection Oriented Network Service.
+.ip "COSNS"
+Connection Oriented Sub-Network Service.
+.ip "CLNS"
+Connectionless Network Service.
+.ip "CLNP"
+Connectionless Network Protocol, or ISO 8473.
+.ip "Network Entity"
+Software or hardware that implements the elements of procedure described
+in ISO 8473.
+.ip "Network Service User"
+Software components that make use of the services provided by a network
+entity.
+.ip "Network Service Provider"
+Software components that provide the services of a network entity.
+.ip "NSAP"
+Network Service Access Point. The point at which the OSI network service
+is made available to the network service user by the network service
+provider.
+.ip "NSAP address"
+Information that the network service provider needs to identify an
+NSAP. The source and destination address fields of a CLNP packet
+are NSAP addresses.
+.ip "ES"
+End system. A system running the complete suite of OSI protocols which can
+act as an end point for communication.
+.ip "IS"
+Intermediate system. A system running the OSI layers 1, 2, and 3 which
+can act only a packet router.
+.ip "SNPA"
+The Subnetwork Point of Attachement is the point where a \fIreal\fR
+end or intermediate system is attached to a \fIreal\fR subnetwork.
+.ip "SNPA address"
+Information that a \fIreal\fR subnetwork need to identify a \fIreal\fR end
+or intermediate system. This is commonly referred to as the hardware address.
+.ip "NPDU"
+Network Protocol Data Unit. The unit of data which is exchanged between
+network entities.
+.ip "DT NPDU"
+Normal data NPDU.
+.ip "ER NPDU"
+Error report NPDU.
+.ip "Initial NPDU"
+A NPDU carrying the whole of the user data from an N-UNITDATA request.
+.ip "Derived NPDU"
+a NPDU whose field ar identical to those of an initial NPDU, except that it
+carries only a segment of the user data from an N-UNITDATA request.
+.ip "Segment"
+A distinct unit of data consisting of part or all of the user data provided
+in the N-UNITDATA request and delivered in the N-UNITDATA indication.
+.ip "Segmentation"
+The act of generation two or more derived NPDUs from an initial or derived
+NPDU.
+.ip "Fragment"
+A DoD Internet Protocol term with the same meaning as "segment". Used
+synonymously with "segment."
+.ip "Fragmentation"
+A DoD Internet Protocol term with the same meaning as "segmentation". Used
+synonymously with "segmentation."
+.ip "Reassembly"
+The act of regenerating an initial NPDU from two ore more derived NPDUs.
+.ip "MTU"
+Maximum transmission unit. The maximum size of a packet that can be
+transmitted on a medium or through a protocol.
+For example, the MTU of the TP protocol is 8192 bytes, the MTU
+of and Ethernet device is 1500 bytes, and the MTU of the OSI Network
+service is 512 bytes.
+.ip "Network interface"
+The device used to attach a computer to a network, for example,
+an Ethernet adapter, or a Token Ring adapter.
+This unfortunate terminology is inherited from BSD Unix.
diff --git a/share/doc/iso/wisc/dogrn b/share/doc/iso/wisc/dogrn
new file mode 100755
index 0000000..83964ae
--- /dev/null
+++ b/share/doc/iso/wisc/dogrn
@@ -0,0 +1,6 @@
+#! /bin/csh -f
+set dev=fa
+foreach m ($argv)
+ echo grn -P$dev $m.grn ">" $m.nr
+ grn -P$dev $m.grn > $m.nr
+end
diff --git a/share/doc/iso/wisc/eicon.nr b/share/doc/iso/wisc/eicon.nr
new file mode 100644
index 0000000..64db4aa
--- /dev/null
+++ b/share/doc/iso/wisc/eicon.nr
@@ -0,0 +1,729 @@
+.sh 2 "X.25 Public Data Network Support"
+.pp
+This ARGO release includes support for an X.25 Public Data Network (PDN)
+in the form of a device driver for the Eicon Technology
+Network Adapter \**.
+.(f
+This adapter, its software, and its documentation are
+available from Eicon Technology Corporation, 3452 Ashby Street, Montreal,
+Quebec, Canada H4R 2C1.
+.)f
+The adapter and its software, together with
+the ARGO \fIecn(4)\fR driver, implement
+the X.25 packet layer protocol as required to support the OSI connection
+oriented network service.
+The remainder of this section of this manual
+destribes the ARGO device driver (hereinafter called "the driver")
+for the Eicon Technology Network Adapter (hereinafter called "the adapter"),
+the interface between the driver
+and the CONS software described above, and the interface
+between the driver and the software on the adapter.
+.sh 3 "Software Modules"
+.lp
+The modules relevant to the design of the driver are listed below.
+.ip "\fICONS -\fR"
+The Connection Oriented Network Service (CONS) provides the upper ISO layers
+with an interface to the PDN.
+In this release,
+the PDN is 1980 X.25, although support for 1984 X.25 is included.
+CONS can receive requests
+from the CLNP entity and
+from the OSI transport entity.
+In addition, the CONS module
+supports \fIioctl()\fR commands used by
+\fIifconfig(8)\fR to configure
+the X.25 network address and to
+declare the adapter to be up or down.
+See \fIcons(4p)\fR.
+.ip "\fIDriver -\fR"
+The driver accepts commands from CONS, formats these commands
+for the adapter, and interprets error indications delivered by the adapter.
+This driver supports all the UNIX configuration device structures.
+See \fIecn(4)\fR.
+.ip "\fIEcnconf -\fR"
+\fIEcnconf\fR is a program that allows the privileged user to
+reconfigure
+the options offered by the software on the adapter.
+\fIEcnconf\fR can be run at any time.
+See \fIecnconf(8)\fR.
+.ip "\fIEcnload -\fR"
+\fIEcnload\fR is a program that downloads Eicon Technology software
+to the adapter and passes the configuration changes made
+with the \fIecnconf\fR program to the driver.
+\fIEcnload must be run only when the X.25 link is considered down\fR.
+See \fIecnload(8)\fR.
+.ip "\fIEcnstat -\fR"
+\fIEcnstat\fR is a program that
+prints the connection state information and counters kept by
+the adapter and by the driver.
+The statistics include the number of sends and receives,
+active connections, and errors.
+For more information, see \fI ecnstat(8)\fR.
+.ip "\fIAdapter -\fR"
+The adapter's interface to the driver is the Network Control
+Block and Request Vector that exist within the adapter's shared memory (often
+called the "Common Data Area").
+This is described in detail below.
+.sh 3 "Interactions Among the Modules"
+.lp
+The commands
+passed between CONS and the driver can be any one of the \fIECN\fR
+commands outlined in the
+sections "ECN Requests" and "ECN Replies", below.
+CONS uses the \fCecnrestart()\fR procedure for restart requests,
+\fCecnshutdown()\fR procedure for shutdown requests, and
+\fCecnoutput()\fR procedure for all
+normal data transfer requests.
+CONS uses the \fCecnioctl()\fR procedure call for
+servicing adapter status requests from the X.25 statistics program \fIecnstat\fR.
+.lp
+Commands passed between the driver and the adapter can
+be any one of the network control block (\fINCB\fR)
+commands described in the section "NCB Commands", below.
+All commands to and from the adapter are
+communicated in the Network Control Block and Request Vector within
+the adapter's Common Data Area.
+.lp
+\fIEcnload\fR starts the
+Eicon Technology Network Adapter software on the adapter
+and downloads the validated configuration
+to the driver.
+.sh 3 "ECN Requests"
+.lp
+The \fIECN\fR request types that CONS can pass to the driver are listed below.
+.ip "\fIECN_STOP - (by calling ecnshutdown())\fR"
+This request instructs the driver to restart the network but not to listen for
+any incoming calls.
+CONS issues this request in response to an \fIioctl()\fR command
+issued by the utility program \fIifconfig\fR, when
+\fIifconfig\fR is used to bring down the adapter.
+.ip "\fIECN_RESTART - (by calling ecnrestart())\fR"
+This request instructs the driver to restart the network \fIand\fR to listen
+and accept any incoming calls.
+CONS issues this request in response to an \fIioctl()\fR command
+issued by the utility program \fIifconfig\fR, when
+\fIifconfig\fR is used to bring the adapter up.
+.ip "\fIECN_CALL - 0x90\fR"
+This request instructs the driver to place
+a call request
+to the specified DTE.
+.ip "\fIECN_CLEAR - 0x92\fR"
+This request instructs the driver to clear a given virtual circuit.
+All outbound data are acknowledged by the remote DTE
+before the circuit is cleared.
+.ip "\fIECN_SEND - 0x94\fR"
+This request instructs the driver to transmit a data buffer across a given
+virtual circuit.
+.ip "\fIECN_RESET - 0x04\fR"
+This request instructs the driver to reset the given virtual circuit and
+clear out all outstanding requests
+associated with that virtual circuit.
+.ip "\fIECN_STATUS - 0xb4 (exclusively through ecnioctl())\fR"
+This requests instructs the driver to
+solicit the adapter's current connection state information and
+counters.
+.sh 3 "ECN Replies"
+.lp
+The \fIECN\fR responses
+the driver can give
+to CONS are listed below.
+.ip "\fIECN_CONNECT - 0x01\fR"
+This reply notifies CONS that the driver has established a virtual circuit
+connection initiated by the remote DTE.
+.ip "\fIECN_ACCEPT - 0x03\fR"
+This reply notifies CONS that an ECN_CALL request has succeeded. The
+reply contains a pointer to a protocol control block.
+.ip "\fIECN_REFUSE - 0x02\fR"
+This reply notifies CONS that a previous \fIECN_CALL\fR request has failed.
+The reply contains a pointer to a protocol control block.
+.ip "\fIECN_CLEAR - 0x92\fR"
+This reply notifies CONS that a given virtual circuit has been cleared
+either by the DCE or by the remote DTE.
+.ip "\fIECN_RECEIVE - 0x95\fR"
+This reply notifies CONS that the driver has received a data packet from
+the remote DTE.
+.ip "\fIECN_RESET - 0x04\fR"
+This reply notifies CONS that the virtual circuit has been reset either
+by the DCE or by the remote DTE.
+.ip "\fIECN_ACK - 0x05\fR"
+This reply tells CONS that the associated ECN_SEND request has been been
+completed by the adapter.
+.sh 3 "NCB Commands"
+.lp
+The driver hides from the CONS module
+many of the idiosyncrasies of the adapter's
+software interface
+by mapping many of the above \fIECN\fR requests into corresponding
+\fINCB\fR commands. Below is a list of requests that the driver can place to
+the adapter. For each request that the driver places to the adapter, the adapter
+returns with a command completion.
+.ip "\fINCB_CALL - 0x90\fR"
+This command creates a virtual circuit.
+.ip "\fINCB_LISTEN - 0x91\fR"
+This command tells the adapter that our host is
+willing to accept incoming calls.
+.ip "\fINCB_CLEAR (and NCB_ABORT) - 0x92\fR"
+This command clears a virtual circuit. An option exists to clear the circuit
+immediately, without waiting first for outstanding acknowledgments.
+.ip "\fINCB_SEND (and NCB_RESET) - 0x94\fR"
+This command sends data to the remote DTE. An option is
+available for resetting the
+virtual circuit. This command can return a status indicating that the
+circuit has been cleared by the DCE or the remote DTE.
+.ip "\fINCB_RECEIVE - 0x95\fR"
+This command tells the adapter that our host is
+willing to receive data on a given virtual circuit. This command can return
+received data, a reset circuit, M-, D-, and Q-bits, interrupt packets,
+or a cleared circuit.
+.ip "\fINCB_STATUS - 0xb4\fR"
+This command queries the adapter about
+the status of a virtual circuit.
+The driver uses this command to support the ECN_STATUS request.
+.ip "\fINCB_RESTART - 0xb2\fR"
+This command restarts the network. This command requires that a corresponding
+configuration file be passed down to the adapter.
+.bp
+.sh 3 "ECN Request and Reply Structure"
+.lp
+Below is
+the data structure used in CONS-driver
+communications.
+This data structure is a parameter to the
+\fIecnoutput()\fR procedure.
+\fC
+.nf
+/* Eicon Driver Request Structure -- used between CONS and the driver */
+
+struct eicon_request {
+ struct ecn_ncb eicon_req_ncb; /* the network control block */
+ caddr_t eicon_req_pcb; /* CONS pcb used on CALL requests */
+ int eicon_req_state; /* used internally by the driver */
+ int eicon_retry_cnt; /* used internally by the driver */
+ int eicon_more; /* used internally by the driver */
+ u_char eicon_reason; /* source of CLEAR requests */
+};
+\fR
+.lp
+The \fCeicon_req_ncb\fR field in the eicon request structure is of
+type \fCecn_ncb\fR, defined in the following section. This structure stores
+the command block
+that the driver uses in communicating with the adapter.
+The command block contains a \fIlogical session number\fR (LSN),
+which identifies a virtual circuit.
+Requests such as ECN_CALL are made without an LSN to identify
+a circuit.
+When an LSN is not available, the request is identified by
+the field
+\fCeicon_req_pcb\fR, which is a pointer to a CONS protocol control block.
+The \fCeicon_req_state\fR field is used by the driver to keep track
+of the status of the given request.
+The following list defines the various values for this field:
+.ip "\fIREQ_NEW\fR"
+The driver recognizes a new request, has placed the request into the driver's
+own request queue, but has yet to interrupt the
+adapter. (The driver maintains a pointer \fCecn_pending_req\fR that indicates
+whether an interrupt to the adapter is outstanding. If one is outstanding, the
+driver places any new requests in this \fIREQ_NEW\fR state. If an interrupt
+is not
+outstanding, the driver places the request immediately in the
+\fIREQ_INTERRUPT\fR state defined below.)
+.ip "\fIREQ_INTERRUPT\fR"
+The driver has dequeued the CONS request, assigned \fCecn_pending_req\fR to
+point to the request, and
+interrupted the adapter for a chance to post this request.
+.ip "\fIREQ_POSTED\fR"
+The driver has sent the request to the adapter.
+.ip "\fIREQ_COMPLETE\fR"
+The driver has just completed the request, and if necessary, is now posting
+it to CONS.
+.lp
+The \fCeicon_retry_cnt\fR field in the eicon request structure keeps track
+of how many times the driver has tried posting this command to the adapter.
+After the second retry, the driver gives up and performs the appropriate
+error routine.
+The \fCeicon_more\fR field defines a \fIRECEIVE\fR request that
+has been re-posted to the adapter to take care of m-bit transfers.
+The \fCeicon_reason\fR field quantifies the reason for a connection being
+cleared. These reasons are defined in the include file \fCiso_errno.h\fR.
+.lp
+Any data associated with the request are linked to the request through the
+request mbuf's \fCm_next\fR field.
+This is done so that when
+the driver calls the \fIMFREE_M\fR deallocation routine, both the request
+and the data are freed together.
+.lp
+The following chart defines those fields within the eicon request structure
+that are relevant in any CONS request
+to the driver via the \fIecnoutput()\fR call.
+.sp
+.sz 8
+.TS
+center,box,tab(:);
+c s s s s
+c||c s s s
+c||c|c|c|c
+l||l|l|l|l.
+\fBField Definitions for CONS \(-> Driver Requests\fR
+_
+\fI:Request Types (CONS \(-> Driver)\fR
+\fIField:ECN_CALL:ECN_CLEAR:ECN_SEND:ECN_RESET\fR
+=
+\fIncb\(->command\fR:0x90:0x92:0x94:0x04
+_
+\fIncb\(->loc_ses_num\fR:T{
+.na
+leave as zero
+T}:VC #:VC #:VC #
+_
+\fIncb\(->info\fR:0x0:0x0:0x0:0x2
+_
+\fIeicon_req_pcb\fR:T{
+.na
+address of CONS' protocol control block
+T}:NULL:NULL:NULL
+_
+\fIeicon_req_data\fR:T{
+.na
+address of mbuf containing contents of Call Request packet (including DTE address, facilities, and call user data)
+T}:T{
+.na
+NULL or address of mbuf containing contents of Clear Request packet
+T}:T{
+.na
+address of mbuf containing contents of user data
+T}:T{
+.na
+NULL or the address of mbuf containing a one byte Reset Diagnostic code
+T}
+.TE
+.sz 10
+.sh 3 "Structure of the Network Control Block (NCB)"
+.lp
+The \fCecn_ncb\fR structure is used by the driver to
+make requests of the adapter.
+\fC
+.nf
+/* Network Control Block -- used between the driver and the Eicon adapter */
+
+struct ecn_ncb {
+ u_char command; /* command field */
+ u_char retcode; /* return code field */
+ u_char lsn; /* local session number */
+ u_char info; /* additional information */
+ caddr_t buffer; /* pointer to data buffer's mbuf */
+ u_short length; /* buffer length */
+ u_char callname[16]; /* module name on NA "X25" */
+ u_char appl_name[16]; /* application name */
+ u_char rxto; /* receive timeout in secs */
+ u_char txto; /* send(tx) timeout in secs */
+ caddr_t post; /* NULL */
+ u_char lana_num; /* specifies Eicon Tech NA */
+ u_char cmd_cplt; /* command status */
+ u_char reserve[14]; /* reserved area */
+};
+\fR
+.sp
+.lp
+The chart below defines those fields that are relevant in any
+reply passed by the driver back up to CONS.
+.sp
+.sz 7
+.TS
+center,box,tab(:);
+c s s s s s s
+c||c s s s s s
+c||c|c|c|c|c|c
+l||l|l|l|l|l|l.
+\fBField Definitions for Driver \(-> CONS Replies\fR
+_
+\fI:Reply Types (Driver \(-> CONS)\fR
+\fIField:ECN_CONNECT:ECN_ACCEPT:ECN_REFUSE:ECN_CLEAR:ECN_RECEIVE:ECN_RESET\fR
+=
+\fIncb\(->command\fR:0x01:0x03:0x02:0x92:0x95:0x04
+_
+\fIncb\(->loc_ses_num\fR:VC #:VC #:ignore:VC #:VC #:VC #
+_
+\fIncb\(->info\fR:ignore:ignore:ignore:ignore:T{
+.na
+Interrupt received (bit 0), D-bit set (bit 6), and/or Q-bit set (bit 7). Zero
+info field implies a normal receive.
+T}:ignore
+_
+\fIeicon_req_pcb\fR:NULL:T{
+.na
+address of CONS's protocol control block
+T}:T{
+.na
+address of CONS's protocol control block
+T}:ignore:ignore:ignore
+_
+\fIeicon_req_data\fR:T{
+.na
+NULL or address of mbuf containing contents of Call Indication packet
+T}:T{
+.na
+NULL or address of mbuf containing contents of Call Connected data
+T}:T{
+.na
+NULL or address of mbuf containing contents of Call Cleared data
+T}:T{
+.na
+NULL or address of mbuf containing contents of Call Cleared data
+T}:T{
+.na
+address of mbuf containing contents of user data
+T}:T{
+.na
+NULL or address of mbuf containing one byte Reset Diagnostic code
+T}
+_
+\fIeicon_reason\fR:ignore:ignore:T{
+.na
+reason for refusal
+T}:T{
+.na
+reason for clear
+.T}:ignore:T{
+.na
+reason for reset
+T}
+.TE
+.sz 10
+.bp
+.sh 3 "Internal Driver Data Sructures"
+.lp
+The main driver data structure
+is the \fIecn_softc\fR structure.
+This structure keeps track of the interface request queue
+(\fCecn_if\fR and \fCecn_pending_req\fR),
+magic addresses on the adapter (\fCecn_iom_base, ecn_mem_base,\fR and
+\fCecn_data_base\fR),
+error statistics (\fCecn_errors\fR), the state
+of each virtual circuit (\fCecn_vc_state\fR), the state of the \fILISTEN\fR
+request (\fCecn_listen_pending\fR), and the current caller (\fCecn_cause\fR).
+\fC
+.nf
+struct ecn_softc {
+ int ecn_errors[NCB_MAX][ST_MAX];
+ int ecn_cause[CAUSE_MAX]; /* ecn_work() causes */
+ struct mbuf *ecn_pending_req; /* waiting for command req */
+ char ecn_listen_pending; /* boolean = listen req pending? */
+ char ecn_vc_state[LSN_MAX]; /* the current state of each vc */
+ struct ecn_device
+ *ecn_iom_base; /* base address of io map */
+ struct ecn_request_vector
+ *ecn_mem_base; /* base address of memory map */
+ caddr_t ecn_data_base; /* base address for data area */
+ struct ifnet ecn_if; /* queue of new requests */
+}
+\fR
+.so figs/ecn_queue.nr
+.sh 2 "Queueing in the Driver"
+.lp
+.CF
+illustrates the queueing mechanism used by the driver.
+.lp
+CONS queues its data transfer requests at the end of the queue managed by
+\fCecn_if\fR field in the \fCecn_softc\fR structure.
+At this point, each request has the state value of
+\fIREQ_NEW\fR.
+Once the driver notifies the adapter that it has a command to post,
+the driver dequeues the first request from the \fCecn_if\fR queue
+and sets the pointer
+\fCecn_pending_req\fR to point to the request.
+At this point, the request is in the \fIREQ_INTERRUPT\fR state.
+.lp
+Once the driver posts the request to the adapter, it
+dequeues the next request in the \fCecn_if\fR queue, reassigns the
+\fCecn_pending_req\fR pointer, and then indicates to the adapter
+that it is ready to post another request.
+The driver no longer has to keep track of the previous request,
+because for every reply, the adapter includes the associated
+mbuf pointer.
+While the request is outstanding, the request is in the \fIREQ_POSTED\fR state.
+.so figs/ecn_vc.nr
+.lp
+After the adapter completes the command, the driver may want to reply to CONS.
+It does this by placing its reply in CONS's \fCconsintrq\fR queue, defined as
+an external \fCifqueue\fR in the driver code.
+.sh 2 "Virtual Circuit States"
+.lp
+The \fCecn_vc_state\fR array in the \fCecn_softc\fR structure above keeps track
+of the state of each virtual circuit (VC).
+This is necessary to avoid handing
+the adapter any commands that may not apply during a given state.
+This mechanism
+is especially useful in dealing with unexpected aborts or clears where there
+is the potential for all outstanding commands to complete with errors.
+By changing
+states, the driver can prevent redundant commands (like clears and aborts)
+from being passed either to the adapter or to CONS.
+.lp
+The driver only keeps track of four different states, as illustrated in
+.CF
+.
+These states are:
+.ip "\fIVC_NO_CONNECTION\fR"
+When a virtual circuit is in this state, the virtual circuit does not exits.
+Only \fICALL\fR and \fILISTEN\fR commands are valid.
+.ip "\fIVC_DATA_XFER\fR"
+All commands, except \fICALL\fR and \fILISTEN\fR commands are valid once the
+connection exists.
+.ip "\fIVC_RESET_IN_PROGRESS\fR"
+In this state, either the driver has issued an \fINCB_RESET\fR or it has
+received a reset error code on the completion of a command.
+Only reissued \fIRESET\fR commands and \fIRECEIVE\fRs are
+valid.
+\fIRECEIVE\fR is valid in this state because the adapter uses the
+completion of this command to hand back the cause of the reset (the RESET
+INDICATION packet).
+.ip "\fIVC_CLEAR_IN_PROGRESS\fR"
+The driver has either issued an \fINCB_CLEAR\fR command or has just
+received a clear error code on the completion of a command.
+Within this state, only reissued
+\fICLEAR\fR and \fIABORT\fR commands are valid.
+.sh 2 "Error Statistics"
+.lp
+With the \fCecn_errors\fR field in the \fCecn_softc\fR structure,
+the driver maintains a two dimensional array of counters
+if the frequencies of errors.
+In order to inspect this array easily with
+the kernel debugger, the first index to every command ( <command, 0> ) is
+reserved for a four character ASCII command identifier.
+.bp
+.sh 3 "The Driver State Machine"
+.sh 2 "Handling of Normal Command Completions"
+.lp
+The chart below lists
+all the available adapter request types, at what level each of
+these requests can be used, options, and the driver's action after a normal
+completion of the command.
+.sp
+.sz 7
+.TS
+center,box,tab(:);
+c s s s
+c|c s|c
+c|c|c|c
+l|l|l|l.
+\fBNormal Completion Handling\fR
+_
+\fINCB:Options:Action Based on Normal Competion of\fR
+\fICommand:To Adapter:From Adapter:Driver\(->Adapter Command\fR
+=
+\fINCB_RESTART\fR:none:none:T{
+.na
+dequeue the request, and issue an NCB_LISTEN request to the adapter.
+T}
+_
+\fINCB_CALL\fR:none:connected:T{
+.na
+dequeue the request, pass an ECN_ACCEPT reply to CONS, and issue a RECEIVE to
+the adapter.
+T}
+_
+\fINCB_LISTEN\fR:T{
+.na
+use zero-length Call User Data and a zero-length Calling DTE address
+T}:none:T{
+.na
+dequeue the request, pass an ECN_CONNECT to CONS, and issue a RECEIVE to the
+adapter. Re-issue another NCB_LISTEN
+for another possible virtual circuit connection.
+T}
+_
+\fINCB_CLEAR\fR:T{
+.na
+normal clearing with all outstanding ACKs returned
+T}:none:T{
+.na
+dequeue the request.
+T}
+:_:_:_
+:T{
+.na
+immediate clearing
+T}:none:T{
+.na
+dequeue the request.
+T}
+_
+\fINCB_SEND\fR:T{
+.na
+normal send
+T}:none:T{
+.na
+dequeue the request and reply to CONS with an ECN_ACK.
+T}
+:_:_:_
+:T{
+.na
+reset the virtual circuit
+T}:none:T{
+dequeue the request.
+T}
+_
+\fINCB_RECEIVE\fR:none:T{
+.na
+normal, uncomplicated receive
+T}:T{
+.na
+dequeue the request and bcopy the data into the request's associated mbuf. Ship to CONS. Re-issue another NCB_RECEIVE.
+T}
+:_:_:_
+:none:T{
+.na
+m-bit set
+T}:T{
+.na
+same as above (adapter does the resegmentation automatically).
+T}
+:_:_:_
+:none:T{
+.na
+d-bit set
+T}:T{
+.na
+same as above.
+T}
+:_:_:_
+:none:T{
+.na
+q-bit set
+T}:T{
+.na
+same as above.
+T}
+:_:_:_
+:none:T{
+.na
+interrupt received
+T}:T{
+.na
+same as above.
+T}
+:_:_:_
+:none:T{
+.na
+reset received
+T}:T{
+dequeue the request, send an ECN_RESET back up to CONS, and issue another
+receive.
+T}
+.TE
+.sz 10
+.sp
+.uh "CONS \(-> Driver"
+.lp
+All entries in this column indicate that the CONS module can send this request
+down to the driver. Command names in parenthesis define the mapping between
+the \fIECN\fR and \fINCB\fR commands.
+.uh "Driver \(-> Adapter"
+.lp
+All checks in this column indicate that the driver can send this request
+to the adapter. The last column in the above table defines what the driver must
+do upon normal completion of the command from the adapter.
+Note that not all driver-to-adapter
+commands have a CONS-to-driver equivalent.
+This shows that this
+command request is generated within the driver, rather than originating from
+the CONS driver.
+.uh "Driver \(-> CONS"
+.lp
+All entries in this column indicate that the driver can send this reply
+back to CONS. Command names in parenthesis define the mapping between
+the \fIECN\fR and \fINCB\fR commands.
+.bp
+.sh 3 "Handling of Errors upon Command Completion"
+.lp
+Below is listed all the driver request and pseudo request types, along with the
+actions the driver must perform given a command completion error delivered by
+the Eicon Network Adapter.
+.sp
+.sz 7
+.TS
+center,box,tab(:);
+c s s s s s s s
+c||c s s s s s s
+c||c|c|c|c|c|c|c
+c||c|c|c|c|c|c|c
+l||l|l|l|l|l|l|l.
+\fBError Completion Handling\fR
+_
+:\fIAction Based on Error Completion of Driver \(-> Adapter Command\fR
+\fIError Returned\fR:_:_:_:_:_:_:_
+\fI:NCB_CALL:NCB_LISTEN:NCB_CLEAR:NCB_ABORT:NCB_RESET:NCB_SEND:NCB_RECEIVE\fR
+=
+\fIST_BAD_LEN\fR:<soft-error>:<soft-error>:<soft-error>:<soft-error>:<soft-error>:<soft-error>:<soft-error>
+_
+\fIST_INVALID\fR:<soft-error>:<soft-error>:<dequeue>:<dequeue>:<dequeue>:<dequeue>:<dequeue>
+_
+\fIST_COMMAND_TO\fR:<retry>:<retry>:<retry>:<retry>:<abort>:<abort>:<retry>
+_
+\fIST_ISSUE_ANOTHER_RCV\fR:<refuse>:<retry>:<retry>:<retry>:<abort>:<abort>:T{
+.na
+requeue request and increment "more" count
+T}
+_
+\fIST_BAD_LSN\fR:<soft-error>:<soft-error>:<dequeue>:<dequeue>:<dequeue>:<dequeue>:<dequeue>
+_
+\fIST_NO_RESOURCES\fR:<retry>:<retry>:<retry>:<retry>:<abort>:<abort>:<retry>
+_
+\fIST_CALL_CLEARED\fR:<refuse>:<retry>:<retry>:<retry>:<clear>:<clear>:<clear>
+_
+\fIST_COMMAND_CANCELLED\fR:<refuse>:<retry>:<retry>:<retry>:<abort>:<abort>:<abort>:
+_
+\fIST_NO_CIRCUITS\fR:<refuse>:<retry>:<retry>:<retry>:<abort>:<abort>:<abort>
+_
+\fIST_CALL_UNSUCCESSFUL\fR:<refuse>:<retry>:<retry>:<retry>:<abort>:<abort>:<abort>
+_
+\fIST_INCORRECT_CALLNAME\fR:<soft-error>:<soft-error>:<soft-error>:<soft-error>:<soft-error>:<soft-error>:<soft-error>
+_
+\fIST_X25_RESET\fR:<refuse>:<retry>:<retry>:<retry>:<dequeue>:<dequeue>:<retry>
+_
+\fIST_TOO_MANY_COMMANDS\fR:<retry>:<retry>:<retry>:<retry>:<abort>:<abort>:<retry>
+_
+\fIST_L1_NO_DATA_SET_READY\fR:<refuse>:<retry>:<retry>:<retry>:<abort>:<abort>:<abort>
+_
+\fIST_L1_NO_CLEAR_TO_SEND\fR:<refuse>:<retry>:<retry>:<retry>:<abort>:<abort>:<abort>
+_
+\fIST_L1_NO_CLOCK\fR:<refuse>:<retry>:<retry>:<retry>:<abort>:<abort>:<abort>
+.TE
+.sz 10
+.sp
+.lp
+Each of the actions from the above chart are defined as follows.
+.ip "\fI<abort>\fR -"
+The driver should clear the connection by issuing an \fINCB_ABORT\fR
+to the adapter and sending an \fIECN_CLEAR\fR to CONS.
+.ip "\fI<refuse>\fR -"
+The driver should send an \fIECN_REFUSE\fR back to CONS.
+.ip "\fI<dequeue>\fR -"
+The driver should simply dequeue the request. Usually these errors occur when a
+reset or clear occurs on the adapter while the driver is in the midst of
+issuing the command which subsequently completes with an error status.
+.ip "\fI<clear>\fR -"
+The driver should send an \fIECN_CLEAR\fR back up to CONS.
+.ip "\fI<retry>\fR -"
+The driver should requeue the request if and only if the
+\fCecn_retry_cnt\fR field in the request structure does not exceed the
+retry maximum.
+.ip "\fI<soft-error>\fR -"
+This action only takes place when a software error has occurred. The driver
+should
+print the error to the console in big bold letters and then panic.
+.bp
+.sh 3 "The IFP Flags"
+.lp
+The IFP flags in the standard \fCifnet\fR structure
+should be used in the following way.
+.ip "\fIIFF_UP on -\fR"
+This flag is set by the driver only after the procedure \fIecnrestart()\fR
+successfully completes.
+.ip "\fIIFF_UP off -\fR"
+This flag is set immediately upon entry into the procedure \fIecnshutdown()\fR.
+.ip "\fIIFF_RUNNING on -\fR"
+This flag is set on whenever the \fIecnwork()\fR procedure is active, eg. the
+driver is actually doing something.
+.ip "\fIIFF_RUNNING off -\fR"
+This flag is turned off upon exit from the \fIecnwork()\fR procedure.
diff --git a/share/doc/iso/wisc/eicon.table5.1.orig.nr b/share/doc/iso/wisc/eicon.table5.1.orig.nr
new file mode 100644
index 0000000..78bda62
--- /dev/null
+++ b/share/doc/iso/wisc/eicon.table5.1.orig.nr
@@ -0,0 +1,126 @@
+.TS
+center,box,tab(:);
+c s s s s s s
+c|c s s|c s|c
+c|c|c|c|c|c|c
+l|c|c|c|l|l|l.
+\fBNormal Completion Handling\fR
+_
+\fINCB:Usage:Options:Action Based on Normal Competion of\fR
+\fICommand:CONS\(->Driver:Driver\(->Board:Driver\(->CONS:To Board:From Board:Driver\(->Board Command\fR
+=
+\fINCB_RESTART\fR:T{
+.na
+(ECN_RESTART)
+T}:\(sr::none:none:T{
+.na
+dequeue the request, and issue an NCB_LISTEN request to the board.
+T}
+_
+\fINCB_CALL\fR:(ECN_CALL):\(sr:T{
+.na
+(ECN_ACCEPT)
+T}:none:connected:T{
+.na
+dequeue the request, pass an ECN_ACCEPT reply to CONS, and issue a RECEIVE to
+the board.
+T}
+_
+\fINCB_LISTEN\fR::\(sr:T{
+.na
+(ECN_CONNECT)
+T}:T{
+.na
+use zero-length Call User Data and a zero-length Calling DTE address
+T}:none:T{
+.na
+dequeue the request, pass an ECN_CONNECT to CONS, and issue a RECEIVE to the
+board. Re-issue another NCB_LISTEN
+for another possible virtual circuit connection.
+T}
+_
+\fINCB_CLEAR\fR:(ECN_CLEAR):\(sr:(ECN_CLEAR):T{
+.na
+normal clearing with all outstanding ACKs returned
+T}:none:T{
+.na
+dequeue the request.
+T}
+:_:_:_:_:_:_
+::\(sr::T{
+.na
+immediate clearing
+T}:none:T{
+.na
+dequeue the request.
+T}
+_
+\fINCB_SEND\fR:(ECN_SEND):\(sr::T{
+.na
+normal send
+T}:none:T{
+.na
+dequeue the request and reply to CONS with an ECN_ACK.
+T}
+:_:_:_:_:_:_
+:T{
+.na
+(ECN_RESET)
+T}:\(sr::T{
+.na
+reset the virtual circuit
+T}:none:T{
+dequeue the request.
+T}
+_
+\fINCB_RECEIVE\fR::\(sr:(ECN_RECEIVE):none:T{
+.na
+normal, uncomplicated receive
+T}:T{
+.na
+dequeue the request and bcopy the data into the request's associated mbuf. Ship to CONS. Re-issue another NCB_RECEIVE.
+T}
+:_:_:_:_:_:_
+:::(ECN_RECEIVE):none:T{
+.na
+m-bit set
+T}:T{
+.na
+same as above (board does the resegmentation automatically).
+T}
+:_:_:_:_:_:_
+:::(ECN_RECEIVE):none:T{
+.na
+d-bit set
+T}:T{
+.na
+same as above.
+T}
+:_:_:_:_:_:_
+:::(ECN_RECEIVE):none:T{
+.na
+q-bit set
+T}:T{
+.na
+same as above.
+T}
+:_:_:_:_:_:_
+:::(ECN_RECEIVE):none:T{
+.na
+interrupt received
+T}:T{
+.na
+same as above.
+T}
+:_:_:_:_:_:_
+:::T{
+.na
+(ECN_RESET)
+T}:none:T{
+.na
+reset received
+T}:T{
+dequeue the request, send an ECN_RESET back up to CONS, and issue another
+receive.
+T}
+.TE
diff --git a/share/doc/iso/wisc/errors.nr b/share/doc/iso/wisc/errors.nr
new file mode 100644
index 0000000..51b5eb5
--- /dev/null
+++ b/share/doc/iso/wisc/errors.nr
@@ -0,0 +1,363 @@
+.\"$Header: errors.nr,v 1.2 88/12/06 16:06:07 nhall Exp $
+.\"$Source: /usr/argo/doc/kernel/RCS/errors.nr,v $
+.NC "Error Handling"
+This section describes the various ways that the ARGO kernel
+handles errors.
+For the purpose of this description,
+errors are divided into
+three classes : user errors, remote-end errors, and internal errors.
+These three classes of errors and the way
+the ARGO kernel handles them are described below.
+.sh 1 "Network Layer Errors"
+.pp
+The following section describes how errors are handled by CLNP.
+.sh 2 "User Errors"
+.pp
+User errors occur when attempting to send a CLNP packet. These errors
+are reflected back to the caller of \fIclnp_output()\fR as the return value
+of the function. The following table indicates the types of errors possible
+and their associated return codes:
+.(b L
+.TS
+tab(+), expand box;
+l l.
+Problem+Return Code
+=
+Unsupported option selected+EINVAL
+Incorrect address+ENAMETOOLONG
+Insufficient \fImbufs\fR+ENOBUFS
+Can't route packet+ENETUNREACH,EHOSTUNREACH
+Insufficient \fImbufs\fR+ENOBUFS
+.TE
+.)b
+.sh 2 "Remote-end Errors"
+.pp
+An error that occurs as the result of incoming NPDU
+is a remote-end error.
+.pp
+In the case of CONS,
+the majority of these are addressing problems,
+PDN-generated errors (network or gateway congestion, number busy),
+or higher layer negotiation problems.
+All ISO 8208 diagnostic codes that may appear in a call clearing packet
+are passed up to the higher layer.
+Some of the higher layer protocols pass this error indication to the
+user level program as well.
+The CONS statistics that are maintained by the "glue" module
+include counters for each of the possible
+ISO 8208 diagnostic codes seen on incoming packets.
+In addition to these error codes, there are some codes that may appear
+due to device driver problems when an NPDU arrives, for example,
+the driver may run out of buffers.
+All possible errors that may occur in the CONS module are listed
+in the file
+\fC<netargo/iso_errno.h>\fR,
+and the values listed in this file are passed to the user level
+program in the global integer variable \fIerrno\fR.
+The ARGO library
+\fClibisodir.a\fR
+includes an expanded version of
+\fIperror()\fR that interprets these extra values.
+.pp
+In the case of CLNP,
+the most remote-end errors are parsing errors.
+When a remote-end error is discovered, processing of the NPDU stops. The
+NPDU is discarded, and if error reporting is not disabled, and ER NPDU
+is sent back to the source of the offending packet. The following
+tables show the errors that may occur, and the error reason
+that will specified when the ER NPDU is returned.
+.pp
+The following general errors may occur while parsing an NPDU:
+.(b L
+.TS
+tab(+), box, expand;
+l l.
+Problem+Error Reason
+=
+NPDU arrives before interface is configured+ADDR_DESTUNREACH
+Packet too short or too big+GEN_INCOMPLETE
+Protocol identification wrong+GEN_HDRSYNTAX
+Version wrong+DISC_UNSUPPVERS
+Lifetime expired+TTL_EXPTRANSIT
+Incorrect checksum+GEN_BADCSUM
+Address section too short+GEN_INCOMPLETE
+Segment section too short+GEN_INCOMPLETE
+Options section too short+GEN_INCOMPLETE
+Unknown packet type+GEN_HDRSYNTAX
+Can't route packet (forwarding)+ADDR_DESTUNREACH
+.TE
+.)b
+The following errors are related to options processing:
+.(b L
+.TS
+tab(+), box, expand;
+l l.
+Problem+Error Reason
+=
+Duplicate option+GEN_DUPOPT
+Unknown option+DISC_UNSUPPTOPT
+Security format bad+GEN_HDRSYNTAX
+Security option present+DISC_UNSUPPSECURE
+Source route format bad+SRCRT_SYNTAX
+Record route too short+GEN_INCOMPLETE
+Record route format bad+GEN_HDRSYNTAX
+QOS format bad+GEN_HDRSYNTAX
+Priority format bad+GEN_HDRSYNTAX
+Error reason format bad+GEN_HDRSYNTAX
+Error reason on non-ER NPDU+DISC_UNSUPPOPT
+Error reason absent from ER NPDU+GEN_HDRSYNTAX
+.TE
+.)b
+.sh 2 "Internal Errors"
+.pp
+Internal errors occur as a result of a programmer error. These errors
+will result in a kernel \fIpanic()\fR. The following panics have been
+coded into CLNP:
+.(b L
+.TS
+tab(+), box, expand;
+l l.
+\fIPanic()\fR message+Reason
+=
+clnp_init: no raw clnp+The raw clnp protocol is not
++configured into the kernel.
+_
+clnp_srcaddr: ifp does not match interface+The ifp
++passed to \fIclnp_srcaddr()\fR is invalid.
+.TE
+.)b
+.sh 1 "Transport Layer Errors"
+.pp
+.sh 2 "User Errors"
+.pp
+TP handles these errors in the "standard"
+way for 4.3BSD:
+it causes an E\fIxxx\fR error constant (from the
+list in /sys/h/errno.h)
+to be put into the user program's
+global variable \fIerrno\fR.
+In most routines, in particular
+those routines called directly or indirectly
+the by system-call routines,
+this is done
+by simply returning
+this integer value.
+The errors that fall into this category are described
+in the following table:
+.(b L
+.TS
+expand box tab(+);
+l l.
+Error+Meaning
+=
+EAFNOSUPPORT+Attempting to use an address family
+ +other than AF_ISO and AF_INET.
+_
+ENOPROTOOPT+TP was not configured at boot time.
+_
+ESOCKTNOSUPPORT+The given socket type is not supported.
+_
+EPROTOTYPE+Attempting to use an inappropriate transport
+ +class for the network service. (e.g. class 0 over CLNS)
+ +or attempting to use an unknown network service.
+_
+EISCONN+Attempting to perform on a connected socket an action
+ +that is permitted only on unconnected sockets.
+_
+ENOTCONN+Attempting to perform on an unconnected socket an
+ +action that is permitted only on connected sockets.
+_
+EMSGSIZE+Trying to send more data than are permitted on
+ +connect, disconnect, or expedited data PDUs.
+_
+ENOTSOCK+The integer argument passed in the system
+ +call is not a socket descriptor or is a socket but
+ +has no transport pcb.
+_
+EINVAL+Some argument to the system call is invalid.
+_
+EOPNOTSUPP+Some command argument to the system call is invalid
+ +or the operation is not supported.
+_
+EACCES+An unprivileged user tried to use a privileged command.
+_
+ETOOMANYREFS+TP ran out of reference blocks.
+_
+ENOBUFS+TP ran out of memory (mbufs).
+.TE
+.)b
+Errors that should be reported to the user
+by \fIerrno\fR but which occur asynchronously
+are detected by the socket layer when the value
+of the field \fIso_error\fR in the socket
+structure is non-zero.
+This is used to report such errors as
+ECONNRESET,
+ECONNABORTED, and
+ECONNTIMEDOUT, which are really remote-end errors.
+.sh 2 "Remote-end Errors"
+.pp
+An error that occurs is the result of a timer
+or is a result of an
+incoming TPDU
+is a remote-end error.
+The majority of these errors are parsing errors.
+They also include some protocol errors.
+Some of these errors cause the connection to be
+closed locally.
+It is unfortunate that when a connection is closed,
+the kernel will not permit the user program to perform
+anything on the socket in question, so the user cannot
+inquire about the reason for disconnection.
+There is no clean way to pass this information to a
+signal handler either, since the process being signalled
+may be swapped out at the time.
+Some of these errors cause TP to return an ER TPDU
+or a DR TPDU to the sending site.
+Some have no effect on the connection locally.
+These errors and their effects are described below.
+.(b L
+.TS
+expand box tab(+);
+l l l.
+Error+Meaning+Return code or action taken
+=
+Retransmission+The remote end has not responded +ETIMEDOUT
+timeout+to repeated attempts to send.+
+ +This can occur during connection+
+ +or after connection establishment.+
+_
+Inactivity+The remote end has not sent anything +ETIMEDOUT
+timeout+within the last \fIx\fR time, where+
++\fIx\fR is a locally defined+
++large value.+
+_
+Unacceptable+An unacceptable TPDU has arrived, and the+TPDU dropped
+TPDU +remote end can be identified.+possibly DR/ER returned
+_
+DR TPDU+A DR TPDU arrived, with any+Disconnect indication,
+arrived+value in the reason field.+so_error == ECONNRESET
+_
+ER TPDU+An ER TPDU arrived, with any+Disconnect indication,
+arrived+anything in the reason field.+so_error == ECONNABORTED
+.TE
+.)b
+TPDUs may be unacceptable for a variety of reasons:
+.(b L
+.TS
+expand box tab(+);
+l l.
+Problem+Action taken by TP
+=
+No connection at destination+Respond with DR, reason: session entity
+reference or reference frozen+not attached to TSAP
+_
+Invalid destination reference+Respond with DR, reason: mismatched
++references
+_
+Invalid parameter code+Respond with ER, cause: inval. param. code
+_
+Invalid DU type+Respond with ER, cause: invalid TPDU type
+_
+Invalid version number+ Respond with ER, cause: inval. param. code
+_
+Invalid suffix value+Respond with ER, cause: inval. param. value
+_
+Suffix missing or is of+Respond with DR, reason:
+invalid length+header or parameter length invalid
+_
+Invalid checksum+packet discarded
+_
+Can't find a connection+Respond with DR, reason:
+for (dest ref, src ref) pair+mismatched references
+_
+Old ACK TPDU+packet discarded, possibly send ACK w/ FCC
+_
+Class requested isn't supported+Respond with DR, reason: +negotiation failed
+_
+Invalid TPDU size parameter+Respond with ER, cause: inval. param. value
+_
+Illegal amount of data+Respond with DR, reason:
+on CR, CC, DR, or XPD+header or parameter length invalid
+_
+Header length and length+Respond with DR, reason:
+indicator field of TPDU don't agree+header or parameter length invalid
+.TE
+.)b
+.lp
+The file \fC<argo/iso_errno.h>\fR is a list
+of the error codes and diagnostic that can be returned
+from the peer transport entity in a DR TPDU or an ER TPDU,
+and those that can be returned from the CONS, initiated by the DCE,
+the remote DTE, or by the local network adapter.
+These error values are too numerous to list here.
+Most of them are taken from the ISO 8208 standard and the ISO 8073 standard.
+The ARGO distribution contains an expanded form of the BSD library
+routine \fIperror()\fR that prints an error messages for a given
+\fIerrno\fR value.
+.sh 2 "Internal Errors"
+.pp
+Some internal errors are the result of
+a lack of resources such as buffers.
+These are reported to the user with the
+global variable
+\fIerrno\fR
+set to a value from
+\fC<errno.h>\fR.
+The errors that fall into this category are described
+in the following table:
+.(b L
+.TS
+expand box tab(+);
+l l.
+Return code+Problem
+=
+ENOBUFS+TP ran out of mbufs.
+_
+EPROTONOOPT+TP hasn't been configured.
+_
+ETOOMANYREFS+TP ran out of (unfrozen) reference numbers.
+.TE
+.)b
+.pp
+Other
+internal errors are coding errors
+or errors of misinterpretation of a specification.
+They result in the printing of a message on the
+console followed by a system panic.
+The following panics have been coded into TP:
+.(b L
+.TS
+expand box tab(+);
+l l.
+\fIPanic()\fR message+Problem
+=
+tp_emit CR/CC+The length indicator field of a TPDU is longer than the
+ +amount of space in an mbuf; TP is attempting to send a
+ +CR TPDU that is too large (perhaps legal but too large for
+ +this implementation to manage).
+_
+tp_rcvoob: unexpected cluster+An incoming XPD TPDU was put into a cluster
+ +mbuf by a lower layer.
+_
+tp timeout table overflow+The system ran out of structures for TP timers.
+_
+tp: T_DETACH+The connected socket that is being detached has
+ +no parent socket.
+_
+tp_soisdisconnected+The socket head queue is
+ +corrupted.
+_
+tp_soisdisconnecting+The socket head queue is
+ +corrupted.
+_
+tpclnp_input: bad clnp_len +The length parameter passed by clnp
+ +is bad.
+_
+iso_control: SIOCDIFADDR+ioctl() system call passed down
+iso_control: SIOCSIFADDR+a null interface pointer
+_
+sofree dq+The list of socket structures is
+ +is inconsistent.
+.TE
+.)b
diff --git a/share/doc/iso/wisc/esis_design.nr b/share/doc/iso/wisc/esis_design.nr
new file mode 100644
index 0000000..437f3ee
--- /dev/null
+++ b/share/doc/iso/wisc/esis_design.nr
@@ -0,0 +1,114 @@
+.NC "The Design of the ARGO Network Layer"
+.sh 1 "End System to Intermediate System Routing Protocol"
+.pp
+The following sections describe the design of the End System to Intermediate
+System (ES-IS) Routing Exchange Protocol.
+.sh 2 "Overview"
+.nf
+- protocol involves sending/receiving hello pdus.
+- timers determine
+ - when to send information
+ - when to discard information
+- want to keep as much of the work outside of kernel
+- only put functions and tables in kernel when necessary
+.sh 2 "Supported Features (brief overview of each)"
+- report configuration (both ES and IS)
+- record configuration (both ES and IS)
+- flush configuration (both ES and IS)
+- query configuration (ES only)
+- configuration response (ES only)
+- request redirect (IS only)
+- record redirect (ES only)
+- flush old redirect (ES only)
+- multicast vs. broadcast (using broadcast only)
+.sh 2 "Kernel Resident Features"
+.sh 3 "Support for PDU Transmission"
+- need mechanism to send/receive PDUs
+- utilize ES-IS socket (like raw socket)
+- socket(AF_ISO, SOCK_DGRAM, ISOPROTO_ESIS)
+.sh 4 "Sending PDUs"
+- sendmsg() used for transmitting PDUS
+- data will be pre-formed ES-IS PDU
+- no checks will be made on the pdu format
+- addr_snpa is the destination (to)
+- before sending, socket must be associated with a particular interface
+ this is done via setsockopt():
+ ESISOPT_SETIF - option
+ buffer is name of interface, ie. "un0"
+.sh 4 "Receiving PDUs"
+- recvmsg() used for receiving PDUs
+- data will be:
+ #define ESIS_PDU
+ #define ESIS_CONFIG_RESP
+ #define ESIS_REDIR_REQ
+ struct esis_indication {
+ short ei_type; /* type of indication */
+ union {
+ struct ? config_resp
+ struct ? redir_req
+ char pdu[0]
+ } ei_u;
+ }
+- no checks will be made on the pdu format
+- addr_snpa is the source (from)
+.sh 4 "Addressing"
+- ES-IS PDUs are sent to SNPA.
+- addresses used are SN addresses, not NSAP addresses
+- format of msg_name (part of msghdr) struct sockaddr_iso
+ afi = 0 /* means special snpa address */
+ isoa_u is struct addr_snpa
+ struct addr_snpa {
+ char sn_addr[7]; /* snpa addr */
+ }
+ isoa_len is number of bytes of sn_addr that are valid
+
+- sn_addr may be a unicast or multicast address
+- multicast addresses will be faked via broadcast addresses
+.sh 3 "NSAP to SNPA translation"
+- translation from NSAP to SNAP required for every CLNP PDU sent
+- function provided by iso_nsap_to_snpa
+
+ iso_nsap_to_snpa(ifp, m, nsap, snpa)
+ struct ifnet *ifp; /* outgoing interface */
+ struct mbuf *m; /* pkt */
+ struct sockaddr_iso *nsap; /* destination address */
+ char *snpa; /* RESULT: snpa address */
+ {
+ if (nsap.afi == AFI_SNPAADDR) {
+ copy snpa addr from nsap into snpa
+ return SUCCESS
+ } else {
+ scan RIB for (RIB.nsap == nsap)
+ if (found) {
+ copy RIB.snpa into snpa
+ return SUCCESS
+ }
+ scan RIB for (RIB.type == IS) && (RIB.ifp = ifp)
+ if (found) {
+ copy RIB.snpa into snpa
+ return SUCCESS
+ }
+ if (ifp allows multicast) {
+ /* invoke query configuration function */
+ copy ifp.ifaddr.ifa_all_es into snpa
+ return SUCCESS
+ }
+
+ return FAILURE
+ }
+ }
+
+- NSAP to SNPA table resides in kernel so CLNP has quick access
+- entries added/timed-out of table via user level ES-IS daemon
+.sh 3 "Query Configuration Functon"
+- invoked when iso_nsap_to_snpa
+ - requires snpa, but
+ - does not find a match for dest nsap, and
+ - does not find a match for Any IS.
+- clnp packet is sent to address "all ES" as specified in ifnet structure
+ (for now, this is just the broadcast address)
+.sh 3 "Configuration Response Function"
+- invoked by clnp_input(), after determining that the packet received is
+ destined for one of its NSAPs
+- checks if sn_dst == "all ES" (for now, this is all hex ffs)
+- if true, a copy of packet is made, and passed up to esis_input()
diff --git a/share/doc/iso/wisc/figs/CONS_primitives.nr b/share/doc/iso/wisc/figs/CONS_primitives.nr
new file mode 100644
index 0000000..16dc3e0
--- /dev/null
+++ b/share/doc/iso/wisc/figs/CONS_primitives.nr
@@ -0,0 +1,77 @@
+.(b
+.TS
+tab(+) center expand box;
+c c
+a | a .
+service primitive & arguments+provided by
+=
+N_CONNECT.request+cons_openvc(... faddr, ...)
+called address+argument faddr
+calling address+not implemented
+receipt confirmation+not implemented
+expedited data+not implemented
+quality of service+not implemented
+NS-user data+not implemented
+_
+N_CONNECT.indication+not implemented
+_
+N_CONNECT.response+cons_netcmd( CONN_REFUSE )
++ or cons_netcmd( CONN_CONFIRM )
++ however, net connection has already
++ been accepted. If REFUSE, it will
++ be cleared with E_CO_HLI_REJT
++ (higher layer rejects connection)
+responding address+not implemented
+receipt confirmation+not implemented
+expedited data+not implemented
+quality of service+not implemented
+NS-user data+not implemented
+_
+N_CONNECT.confirm+not implemented
+=
+N_DATA.request+cons_output(... m, ...)
++and cosns_output(... m, ...)
+confirmation+not implemented
+data+mbuf chain m
+_
+N_DATA.indication+pr_input( m, ... )
++or software interrupt
+confirmation+not implemented
+data+mbuf chain
+_
+N_DATA_ACKNOWLEDGE.request+not implemented
+_
+N_DATA_ACKNOWLEDGE.indication+not implemented
+_
+N_EXPEDITED_DATA.request+not implemented
+_
+N_EXPEDITED_DATA.indication+not implemented
+=
+N_RESET.request+not implemented
+N_RESET.indication+socket->so_error = reason
++or pr_ctlinput( PRC_ROUTEDEAD )
+originator+not implemented
+reason+from X.25 packet or ecn driver
+N_RESET.response+not implemented
+N_RESET.confirm+not implemented
+=
+N_DISCONNECT.request+cons_netcmd( CONN_CLOSE )
+reason+uses E_CO_HLI_DISCN (normal
++disconnect from higher layer)
+responding address+not implemented
+NS_user data+not implemented
+_
+N_DISCONNECT.indication+socket->so_error = reason
++or pr_ctlinput( PRC_ROUTEDEAD )
+originator+not implemented
+reason+from X.25 packet or ecn driver
+responding address+not implemented
+NS_user data+not implemented
+.TE
+.(c
+\fBFigure \n+(FG\fR: Transport Service Primitives
+.)c
+.)b
+.(f
+\** data on disconnect is not supported at this time.
+.)f
diff --git a/share/doc/iso/wisc/figs/Makefile b/share/doc/iso/wisc/figs/Makefile
new file mode 100644
index 0000000..72aa29a
--- /dev/null
+++ b/share/doc/iso/wisc/figs/Makefile
@@ -0,0 +1,18 @@
+#
+#
+.SUFFIXES: .nr .grn
+
+PRINTER = ba
+
+ALL = \
+ func_units.nr unix_ipc.nr osi_addr.nr trans_flow.nr clnp_output.nr\
+ clnp_input.nr mbufsnd.nr mbufrcv.nr\
+ ecn_vc.nr ecn_network.nr ecn_queue.nr tppt.nr
+
+all: $(ALL)
+
+clean:
+ rm $(ALL)
+
+.grn.nr:
+ grn -P$(PRINTER) $*.grn > $*.nr
diff --git a/share/doc/iso/wisc/figs/NS_primitives.nr b/share/doc/iso/wisc/figs/NS_primitives.nr
new file mode 100644
index 0000000..20dc226
--- /dev/null
+++ b/share/doc/iso/wisc/figs/NS_primitives.nr
@@ -0,0 +1,69 @@
+.(b
+.TS
+tab(+) center box;
+c c
+a | a .
+service primitive & arguments+kernel procedure call & arguments
+=
+N_CONNECT.request+\fIcons_openvc(copcb,dstaddr,so)\fR
+called address+argument \fIdstaddr\fR
+calling address, expedited data selection+not implemented
+receipt confirmation selection+not implemented
+quality of service, NS-user data+not implemented
+_
+N_CONNECT.indication+not implemented
+_
+N_CONNECT.response+not implemented
+_
+N_CONNECT.confirm+return from \fIcons_openvc()\fR
+responding address, quality of service+not implemented
+receipt confirmation selection+not implemented
+expedited data selection, NS-user data+not implemented
+=
+N_DATA.request+\fIcons_output(isop,m,len,isdgm)\fR, and
+ +\fIcosns_output(ifp,m,dstaddr)\fR
+NS-user data+argument m (mbuf chain)
+confirmation request+not implemented
+_
+N_DATA.indication+software interrupt (CLNP), procedure
++call to \fItp_input()\fR
+NS-user data+mbuf chain on \fIclnlintrq\fR or
++argument to \fItp_input()\fR
+confirmation request+not implemented
+=
+N_DATA_ACKNOWLEDGE.request+not implemented
+_
+N_DATA_ACKNOWLEDGE.indication+not implemented
+=
+N_EXPEDITED_DATA.request+not implemented
+_
+N_EXPEDITED_DATA.indication+not implemented
+=
+N_RESET.request+not implemented
+_
+N_RESET.response+not implemented
+_
+N_RESET.indication+higher layer \fIpr_ctlinput(
++PRC_ROUTEDEAD, faddr, copcb)\fR
+originator+argument \fIfaddr\fR
+reason+implemented with so->so_errno for sockets
++that are attached to CONS PCBs
+_
+N_RESET.confirm+not implemented
+=
+N_DISCONNECT.request+\fIcons_netcmd(CONN_CLOSE,
++isop, channel, isdgm)\fR
+reason, NS-user data, responding address+not implemented
+_
+N_DISCONNECT.indication+higher layer \fIpr_ctlinput(
++PRC_ROUTEDEAD, faddr, copcb)\fR
+originator+argument \fIfaddr\fR
+reason+implemented with so->so_errno for sockets
++that are attached to CONS PCBs
+NS-user data, responding address+not implemented
+.TE
+.(c
+\fBFigure \n+(FG\fR: Network Service Primitives
+.\")
+.)c
+.)b
diff --git a/share/doc/iso/wisc/figs/TS_primitives.nr b/share/doc/iso/wisc/figs/TS_primitives.nr
new file mode 100644
index 0000000..3d27df3
--- /dev/null
+++ b/share/doc/iso/wisc/figs/TS_primitives.nr
@@ -0,0 +1,60 @@
+.(b
+.TS
+center expand box;
+c c
+a | a .
+service primitive & arguments Unix system calls & arguments
+=
+T_CONNECT.request \fIsocket(), connect(), setsockopt()\fR
+called address \fIconnect()\fR argument
+calling address \fIconnect()\fR argument
+quality of service not implemented
+buffer management \fIsetsockopt()\fR argument
+security not implemented
+data \fIsetsockopt(), getsockopt()\fR
+_
+T_CONNECT.indication return from \fIaccept(); getsockopt()\fR
+called address \fIaccept()\fR argument
+calling address \fIaccept()\fR argument
+quality of service not implemented
+security not implemented
+data \fIsetsockopt(), getsockopt()\fR
+_
+T_CONNECT.response no applicable system calls
+_
+T_CONNECT.confirm return from \fIconnect()\fR
+quality of service \fIgetsockopt()\fR argument
+data \fIsetsocktopt, getsockopt()\fR
+=
+T_DATA.request \fIrecvv(), sendv()\fR
+_
+T_DATA.indication return from \fIrecvv()\fR, \fIsendv()\fR, or \fIselect()\fR;
+ or signal SIGIO
+ ioctl(FIONREAD) tells how much has been
+ queued to read
+=
+T_EXPEDITED_DATA.request \fIsendv()\fR with MSG_OOB flag
+_
+T_EXPEDITED_DATA.indication SIGURG, \fIgetsockopt()\fR with TPFLAG_XPD,
+ return from \fIselect()\fR with exceptional
+ conditions mask
+=
+T_DISCONNECT.request \fIclose()\fR
+data \fIsetsockopt()\fR
+_
+T_DISCONNECT.indication SIGURG,
+ error return on other primitives
+reason errno
+data \fIgetsockopt()\**\fR
+=
+T_STATUS.request \fIgetsockopt()\fR, \fItpstat\fR utility program
+_
+T_STATUS.indication \fIgetsockopt()\fR, \fIselect()\fR, \fItpstat\fR
+.TE
+.(c
+\fBFigure \n+(FG\fR: Transport Service Primitives
+.)c
+.)b
+.(f
+\** data on disconnect is not supported at this time.
+.)f
diff --git a/share/doc/iso/wisc/figs/addrfmt.nr b/share/doc/iso/wisc/figs/addrfmt.nr
new file mode 100644
index 0000000..195a46e
--- /dev/null
+++ b/share/doc/iso/wisc/figs/addrfmt.nr
@@ -0,0 +1,22 @@
+.TS
+center,expand,box,tab(+);
+c s|c
+c|c|c.
+T{
+.na
+IDP: initial domain part
+T}+T{
+.na
+DSP: domain spedific part
+T}
+_+_+
+T{
+.na
+AFI: authority and format identifier
+T}+T{
+.na
+IDI: initial domain identifier
+T}+
+.TE
+.ce
+\fB Figure \n+(FG\fR: Format of OSI addresses
diff --git a/share/doc/iso/wisc/figs/clnp_input.grn b/share/doc/iso/wisc/figs/clnp_input.grn
new file mode 100644
index 0000000..f217b94
--- /dev/null
+++ b/share/doc/iso/wisc/figs/clnp_input.grn
@@ -0,0 +1,18 @@
+.(z
+.GS C
+width 6.0
+high 7.0
+1 8
+2 10
+3 12
+4 14
+sc 0.4
+narrow 1
+medium 3
+thick 7
+pointscale off
+file clnp_input.gsrc
+.GE
+.ce
+\fB Figure \n+(FG:\fR Flow of control for processing CLNP NPDUs
+.)z
diff --git a/share/doc/iso/wisc/figs/clnp_input.gsrc b/share/doc/iso/wisc/figs/clnp_input.gsrc
new file mode 100644
index 0000000..0c0852e
--- /dev/null
+++ b/share/doc/iso/wisc/figs/clnp_input.gsrc
@@ -0,0 +1,338 @@
+gremlinfile
+0 424.00 24.00
+3
+424.00 696.00
+424.00 704.00
+-1.00 -1.00
+5 0
+0
+ 3
+312.00 416.00
+560.00 416.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 696.00
+125.00 701.00
+128.00 699.00
+131.00 701.00
+128.00 696.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 264.00
+560.00 264.00
+560.00 704.00
+128.00 704.00
+128.00 696.00
+-1.00 -1.00
+5 0
+0
+ 3
+424.00 648.00
+427.00 643.00
+424.00 645.00
+421.00 643.00
+424.00 648.00
+-1.00 -1.00
+4 0
+0
+ 3
+232.00 672.00
+288.00 672.00
+288.00 632.00
+424.00 632.00
+-1.00 -1.00
+4 0
+0
+ 3
+232.00 608.00
+424.00 608.00
+-1.00 -1.00
+4 0
+0
+ 3
+232.00 544.00
+424.00 544.00
+-1.00 -1.00
+4 0
+0
+ 3
+232.00 480.00
+424.00 480.00
+-1.00 -1.00
+4 0
+0
+ 3
+232.00 352.00
+424.00 352.00
+424.00 648.00
+-1.00 -1.00
+4 0
+0
+ 3
+351.00 689.00
+351.00 656.00
+528.00 656.00
+528.00 689.00
+351.00 689.00
+-1.00 -1.00
+5 0
+0
+ 0
+360.00 664.00
+360.00 679.00
+360.00 679.00
+360.00 679.00
+-1.00 -1.00
+1 2
+14 Discard Packet
+ 3
+136.00 320.00
+141.00 323.00
+139.00 320.00
+141.00 317.00
+136.00 320.00
+-1.00 -1.00
+5 0
+0
+ 3
+136.00 384.00
+240.00 384.00
+240.00 320.00
+136.00 320.00
+-1.00 -1.00
+5 0
+0
+ 0
+56.00 280.00
+56.00 295.00
+56.00 295.00
+56.00 295.00
+-1.00 -1.00
+1 2
+12 Process NPDU
+ 3
+48.00 304.00
+48.00 271.00
+225.00 271.00
+225.00 304.00
+48.00 304.00
+-1.00 -1.00
+5 0
+0
+ 0
+56.00 600.00
+56.00 615.00
+56.00 615.00
+56.00 615.00
+-1.00 -1.00
+1 2
+18 Consistency Checks
+ 3
+47.00 498.00
+47.00 465.00
+224.00 465.00
+224.00 498.00
+47.00 498.00
+-1.00 -1.00
+5 0
+0
+ 0
+56.00 344.00
+56.00 359.00
+56.00 359.00
+56.00 359.00
+-1.00 -1.00
+1 2
+20 Reassemble Fragments
+ 3
+168.00 432.00
+168.00 400.00
+-1.00 -1.00
+5 0
+0
+ 3
+48.00 432.00
+48.00 400.00
+304.00 400.00
+304.00 432.00
+48.00 432.00
+-1.00 -1.00
+5 0
+0
+ 0
+200.00 408.00
+200.00 423.00
+200.00 423.00
+200.00 423.00
+-1.00 -1.00
+1 2
+12 Forward NPDU
+ 0
+56.00 408.00
+56.00 423.00
+56.00 423.00
+56.00 423.00
+-1.00 -1.00
+1 2
+9 Keep NPDU
+ 0
+56.00 472.00
+56.00 487.00
+56.00 487.00
+56.00 487.00
+-1.00 -1.00
+1 2
+15 Process Options
+ 0
+56.00 536.00
+56.00 551.00
+56.00 551.00
+56.00 551.00
+-1.00 -1.00
+1 2
+19 Extract Information
+ 0
+56.00 664.00
+56.00 679.00
+56.00 679.00
+56.00 679.00
+-1.00 -1.00
+1 2
+14 Dequeue Packet
+ 3
+131.00 311.00
+128.00 316.00
+131.00 314.00
+134.00 316.00
+131.00 311.00
+-1.00 -1.00
+5 0
+0
+ 3
+131.00 329.00
+131.00 310.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 332.00
+130.00 332.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 373.00
+127.00 378.00
+130.00 376.00
+133.00 378.00
+130.00 373.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 394.00
+130.00 373.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 460.00
+130.00 439.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 439.00
+127.00 444.00
+130.00 442.00
+133.00 444.00
+130.00 439.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 501.00
+127.00 506.00
+130.00 504.00
+133.00 506.00
+130.00 501.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 522.00
+130.00 501.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 588.00
+128.00 567.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 567.00
+125.00 572.00
+128.00 570.00
+131.00 572.00
+128.00 567.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 631.00
+125.00 636.00
+128.00 634.00
+131.00 636.00
+128.00 631.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 652.00
+128.00 631.00
+-1.00 -1.00
+5 0
+0
+ 3
+48.00 368.00
+48.00 335.00
+225.00 335.00
+225.00 368.00
+48.00 368.00
+-1.00 -1.00
+5 0
+0
+ 3
+47.00 562.00
+47.00 529.00
+224.00 529.00
+224.00 562.00
+47.00 562.00
+-1.00 -1.00
+5 0
+0
+ 3
+47.00 626.00
+47.00 593.00
+224.00 593.00
+224.00 626.00
+47.00 626.00
+-1.00 -1.00
+5 0
+0
+ 3
+47.00 689.00
+47.00 656.00
+224.00 656.00
+224.00 689.00
+47.00 689.00
+-1.00 -1.00
+5 0
+0
+ -1
diff --git a/share/doc/iso/wisc/figs/clnp_input.nr b/share/doc/iso/wisc/figs/clnp_input.nr
new file mode 100644
index 0000000..01f6468
--- /dev/null
+++ b/share/doc/iso/wisc/figs/clnp_input.nr
@@ -0,0 +1,188 @@
+.(z
+.br
+.nr g1 3456u
+.nr g2 2964u
+.GS C
+.nr g3 \n(.f
+.nr g4 \n(.s
+\0
+.sp -1
+\D't 1u'
+.sp -1
+.sp 101u
+\D'l 0u 223u'\D'l 1193u 0u'\D'l 0u -223u'\D'l -1193u 0u'
+.sp -1
+.sp 425u
+\D'l 0u 222u'\D'l 1193u 0u'\D'l 0u -222u'\D'l -1193u 0u'
+.sp -1
+.sp 431u
+\D'l 0u 222u'\D'l 1193u 0u'\D'l 0u -222u'\D'l -1193u 0u'
+.sp -1
+.sp 1306u
+\h'7u'\D'l 0u 222u'\D'l 1192u 0u'\D'l 0u -222u'\D'l -1192u 0u'
+.sp -1
+.sp -1912u
+\h'546u'\D'l 0u 141u'
+.sp -1
+.sp 141u
+\h'546u'\D'l -20u -34u'\D'l 20u 14u'\D'l 20u -14u'\D'l -20u 34u'
+.sp -1
+.sp 431u
+\h'546u'\D'l -20u -33u'\D'l 20u 13u'\D'l 20u -13u'\D'l -20u 33u'
+.sp -1
+.sp -141u
+\h'546u'\D'l 0u 141u'
+.sp -1
+.sp 444u
+\h'559u'\D'l 0u 141u'
+.sp -1
+.sp 141u
+\h'559u'\D'l -20u -34u'\D'l 20u 14u'\D'l 21u -14u'\D'l -21u 34u'
+.sp -1
+.sp 418u
+\h'559u'\D'l -20u -34u'\D'l 20u 13u'\D'l 21u -13u'\D'l -21u 34u'
+.sp -1
+.sp -142u
+\h'559u'\D'l 0u 142u'
+.sp -1
+.sp 445u
+\h'559u'\D'l 0u 141u'
+.sp -1
+.sp 141u
+\h'559u'\D'l -20u -33u'\D'l 20u 13u'\D'l 21u -13u'\D'l -21u 33u'
+.sp -1
+.sp 276u
+\h'559u'\D'l 0u 0u'
+.sp -1
+.sp 21u
+\h'566u'\D'l 0u 128u'
+.sp -1
+.sp 121u
+\h'566u'\D'l -20u -34u'\D'l 20u 14u'\D'l 20u -14u'\D'l -20u 34u'
+.sp -1
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Dequeue Packet
+.sp -2377u
+\h'61u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Extract Information
+.sp -1515u
+\h'61u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Process Options
+.sp -1085u
+\h'61u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Keep NPDU
+.sp -654u
+\h'61u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Forward NPDU
+.sp -654u
+\h'1031u'\&\*(g9
+.sp |\n(g8u
+.sp -815u
+\h'7u'\D'l 0u 215u'\D'l 1725u 0u'\D'l 0u -215u'\D'l -1725u 0u'
+.sp -1
+\h'815u'\D'l 0u 215u'
+.sp -1
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Reassemble Fragments
+.sp 593u
+\h'61u'\&\*(g9
+.sp |\n(g8u
+.sp -445u
+\D'l 0u 222u'\D'l 1193u 0u'\D'l 0u -222u'\D'l -1193u 0u'
+.sp -1
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Consistency Checks
+.sp -686u
+\h'61u'\&\*(g9
+.sp |\n(g8u
+.sp 1307u
+\h'7u'\D'l 0u 222u'\D'l 1192u 0u'\D'l 0u -222u'\D'l -1192u 0u'
+.sp -1
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Process NPDU
+.sp 162u
+\h'61u'\&\*(g9
+.sp |\n(g8u
+.sp -539u
+\h'600u'\D'l 700u 0u'\D'l 0u 431u'\D'l -700u 0u'
+.sp -1
+.sp 431u
+\h'600u'\D'l 33u -20u'\D'l -13u 20u'\D'l 13u 20u'\D'l -33u -20u'
+.sp -1
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Discard Packet
+.sp -2316u
+\h'2109u'\&\*(g9
+.sp |\n(g8u
+.sp -2485u
+\h'2048u'\D'l 0u 223u'\D'l 1193u 0u'\D'l 0u -223u'\D'l -1193u 0u'
+.sp -1
+\D's 16u'
+.sp -1
+.sp 2270u
+\h'1246u'\D'l 1294u 0u'\D'l 0u -1993u'
+.sp -1
+.sp -863u
+\h'1246u'\D'l 1294u 0u'
+.sp -1
+.sp -430u
+\h'1246u'\D'l 1294u 0u'
+.sp -1
+.sp -431u
+\h'1246u'\D'l 1294u 0u'
+.sp -1
+.sp -431u
+\h'1246u'\D'l 378u 0u'\D'l 0u 269u'\D'l 916u 0u'
+.sp -1
+.sp 162u
+\h'2540u'\D'l 20u 33u'\D'l -20u -13u'\D'l -20u 13u'\D'l 20u -33u'
+.sp -1
+\D's -1u'
+.sp -1
+.sp 2586u
+\h'546u'\D'l 2910u 0u'\D'l 0u -2964u'\D'l -2910u 0u'\D'l 0u 54u'
+.sp -1
+.sp -2910u
+\h'546u'\D'l -20u -34u'\D'l 20u 14u'\D'l 20u -14u'\D'l -20u 34u'
+.sp -1
+.sp 1886u
+\h'1785u'\D'l 1671u 0u'
+.sp -1
+.sp -1886u
+\h'2540u'\D'l 0u -54u'
+.sp -1
+.sp 2910u
+\D't 3u'\D's -1u'
+.br
+.ft \n(g3
+.ps \n(g4
+.GE
+.ce
+\fB Figure \n+(FG:\fR Flow of control for processing CLNP NPDUs
+.)z
diff --git a/share/doc/iso/wisc/figs/clnp_output.grn b/share/doc/iso/wisc/figs/clnp_output.grn
new file mode 100644
index 0000000..5025eee
--- /dev/null
+++ b/share/doc/iso/wisc/figs/clnp_output.grn
@@ -0,0 +1,18 @@
+.(z
+.GS C
+width 6.0
+high 7.0
+1 8
+2 10
+3 12
+4 14
+sc 0.4
+narrow 1
+medium 3
+thick 7
+pointscale off
+file clnp_output.gsrc
+.GE
+.ce
+\fB Figure \n+(FG:\fR Flow of control for emitting CLNP NPDUs
+.)z
diff --git a/share/doc/iso/wisc/figs/clnp_output.gsrc b/share/doc/iso/wisc/figs/clnp_output.gsrc
new file mode 100644
index 0000000..49a0186
--- /dev/null
+++ b/share/doc/iso/wisc/figs/clnp_output.gsrc
@@ -0,0 +1,376 @@
+gremlinfile
+0 528.00 32.00
+3
+528.00 688.00
+531.00 683.00
+528.00 685.00
+525.00 683.00
+528.00 688.00
+-1.00 -1.00
+5 0
+0
+ 3
+176.00 160.00
+176.00 144.00
+528.00 144.00
+528.00 688.00
+-1.00 -1.00
+5 0
+0
+ 0
+272.00 672.00
+272.00 685.00
+272.00 685.00
+272.00 685.00
+-1.00 -1.00
+2 2
+6 EINVAL
+ 3
+240.00 672.00
+528.00 672.00
+-1.00 -1.00
+4 0
+0
+ 3
+128.00 652.00
+128.00 631.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 631.00
+125.00 636.00
+128.00 634.00
+131.00 636.00
+128.00 631.00
+-1.00 -1.00
+5 0
+0
+ 0
+64.00 672.00
+64.00 687.00
+64.00 687.00
+64.00 687.00
+-1.00 -1.00
+1 2
+15 Examine Options
+ 3
+47.00 689.00
+47.00 656.00
+224.00 656.00
+224.00 689.00
+47.00 689.00
+-1.00 -1.00
+5 0
+0
+ 0
+64.00 608.00
+64.00 623.00
+64.00 623.00
+64.00 623.00
+-1.00 -1.00
+1 2
+15 Check Addresses
+ 0
+64.00 546.00
+64.00 561.00
+64.00 561.00
+64.00 561.00
+-1.00 -1.00
+1 2
+20 Allocate Header mbuf
+ 0
+64.00 481.00
+64.00 496.00
+64.00 496.00
+64.00 496.00
+-1.00 -1.00
+1 2
+17 Create Fixed Part
+ 0
+64.00 417.00
+64.00 432.00
+64.00 432.00
+64.00 432.00
+-1.00 -1.00
+1 2
+12 Route Packet
+ 0
+64.00 352.00
+64.00 367.00
+64.00 367.00
+64.00 367.00
+-1.00 -1.00
+1 2
+19 Append Address Part
+ 0
+64.00 290.00
+64.00 305.00
+64.00 305.00
+64.00 305.00
+-1.00 -1.00
+1 2
+19 Append Options Part
+ 0
+64.00 225.00
+64.00 240.00
+64.00 240.00
+64.00 240.00
+-1.00 -1.00
+1 2
+13 Transmit NPDU
+ 0
+192.00 224.00
+192.00 239.00
+192.00 239.00
+192.00 239.00
+-1.00 -1.00
+1 2
+13 Fragment NPDU
+ 3
+47.00 625.00
+47.00 592.00
+224.00 592.00
+224.00 625.00
+47.00 625.00
+-1.00 -1.00
+5 0
+0
+ 3
+47.00 562.00
+47.00 529.00
+224.00 529.00
+224.00 562.00
+47.00 562.00
+-1.00 -1.00
+5 0
+0
+ 3
+47.00 498.00
+47.00 465.00
+224.00 465.00
+224.00 498.00
+47.00 498.00
+-1.00 -1.00
+5 0
+0
+ 3
+48.00 433.00
+48.00 400.00
+225.00 400.00
+225.00 433.00
+48.00 433.00
+-1.00 -1.00
+5 0
+0
+ 3
+47.00 368.00
+47.00 335.00
+224.00 335.00
+224.00 368.00
+47.00 368.00
+-1.00 -1.00
+5 0
+0
+ 3
+48.00 304.00
+48.00 271.00
+225.00 271.00
+225.00 304.00
+48.00 304.00
+-1.00 -1.00
+5 0
+0
+ 3
+49.00 240.00
+49.00 209.00
+306.00 209.00
+306.00 240.00
+49.00 240.00
+-1.00 -1.00
+5 0
+0
+ 3
+167.00 239.00
+167.00 209.00
+-1.00 -1.00
+1 0
+0
+ 3
+128.00 588.00
+128.00 567.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 567.00
+125.00 572.00
+128.00 570.00
+131.00 572.00
+128.00 567.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 503.00
+125.00 508.00
+128.00 506.00
+131.00 508.00
+128.00 503.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 524.00
+128.00 503.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 458.00
+130.00 437.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 437.00
+127.00 442.00
+130.00 440.00
+133.00 442.00
+130.00 437.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 375.00
+127.00 380.00
+130.00 378.00
+133.00 380.00
+130.00 375.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 396.00
+130.00 375.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 330.00
+130.00 309.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 309.00
+127.00 314.00
+130.00 312.00
+133.00 314.00
+130.00 309.00
+-1.00 -1.00
+5 0
+0
+ 3
+130.00 268.00
+130.00 268.00
+-1.00 -1.00
+5 0
+0
+ 3
+131.00 265.00
+131.00 246.00
+-1.00 -1.00
+5 0
+0
+ 3
+131.00 247.00
+128.00 252.00
+131.00 250.00
+134.00 252.00
+131.00 247.00
+-1.00 -1.00
+5 0
+0
+ 3
+146.00 320.00
+242.00 320.00
+242.00 255.00
+146.00 255.00
+-1.00 -1.00
+5 0
+0
+ 3
+146.00 255.00
+151.00 258.00
+149.00 255.00
+151.00 252.00
+146.00 255.00
+-1.00 -1.00
+5 0
+0
+ 0
+272.00 608.00
+272.00 621.00
+272.00 621.00
+272.00 621.00
+-1.00 -1.00
+2 2
+12 ENAMETOOLONG
+ 0
+273.00 545.00
+273.00 558.00
+273.00 558.00
+273.00 558.00
+-1.00 -1.00
+2 2
+7 ENOBUFS
+ 0
+272.00 417.00
+272.00 430.00
+272.00 430.00
+272.00 430.00
+-1.00 -1.00
+2 2
+25 ENETUNREACH, EHOSTUNREACH
+ 0
+272.00 289.00
+272.00 302.00
+272.00 302.00
+272.00 302.00
+-1.00 -1.00
+2 2
+7 ENOBUFS
+ 3
+241.00 601.00
+529.00 601.00
+-1.00 -1.00
+4 0
+0
+ 3
+240.00 536.00
+530.00 536.00
+-1.00 -1.00
+4 0
+0
+ 3
+241.00 413.00
+527.00 413.00
+-1.00 -1.00
+4 0
+0
+ 3
+233.00 288.00
+529.00 288.00
+-1.00 -1.00
+4 0
+0
+ 0
+152.00 175.00
+152.00 190.00
+152.00 190.00
+152.00 190.00
+-1.00 -1.00
+1 2
+7 SUCCESS
+ -1
diff --git a/share/doc/iso/wisc/figs/clnp_output.nr b/share/doc/iso/wisc/figs/clnp_output.nr
new file mode 100644
index 0000000..b11d465
--- /dev/null
+++ b/share/doc/iso/wisc/figs/clnp_output.nr
@@ -0,0 +1,233 @@
+.(z
+.br
+.nr g1 3456u
+.nr g2 3891u
+.GS C
+.nr g3 \n(.f
+.nr g4 \n(.s
+\0
+.sp -1
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "SUCCESS
+.sp 3670u
+\h'750u'\&\*(g9
+.sp |\n(g8u
+\D's 16u'\D't 1u'
+.sp -1
+.sp 2863u
+\h'1328u'\D'l 2114u 0u'
+.sp -1
+.sp -893u
+\h'1385u'\D'l 2043u 0u'
+.sp -1
+.sp -877u
+\h'1378u'\D'l 2071u 0u'
+.sp -1
+.sp -464u
+\h'1385u'\D'l 2057u 0u'
+.sp -1
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "ENOBUFS
+.sp 2227u
+\h'1607u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "ENETUNREACH, EHOSTUNREACH
+.sp 1313u
+\h'1607u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "ENOBUFS
+.sp 400u
+\h'1614u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "ENAMETOOLONG
+.sp -50u
+\h'1607u'\&\*(g9
+.sp |\n(g8u
+\D's -1u'
+.sp -1
+.sp 2469u
+\h'707u'\D'l 36u -21u'\D'l -15u 21u'\D'l 15u 22u'\D'l -36u -22u'
+.sp -1
+.sp -464u
+\h'707u'\D'l 686u 0u'\D'l 0u 464u'\D'l -686u 0u'
+.sp -1
+.sp 522u
+\h'600u'\D'l -22u -36u'\D'l 22u 14u'\D'l 21u -14u'\D'l -21u 36u'
+.sp -1
+.sp -129u
+\h'600u'\D'l 0u 136u'
+.sp -1
+.sp -21u
+\h'593u'\D'l 0u 0u'
+.sp -1
+.sp -293u
+\h'593u'\D'l -22u -36u'\D'l 22u 14u'\D'l 21u -14u'\D'l -21u 36u'
+.sp -1
+.sp -150u
+\h'593u'\D'l 0u 150u'
+.sp -1
+.sp -471u
+\h'593u'\D'l 0u 150u'
+.sp -1
+.sp 150u
+\h'593u'\D'l -22u -36u'\D'l 22u 14u'\D'l 21u -14u'\D'l -21u 36u'
+.sp -1
+.sp -443u
+\h'593u'\D'l -22u -36u'\D'l 22u 14u'\D'l 21u -14u'\D'l -21u 36u'
+.sp -1
+.sp -150u
+\h'593u'\D'l 0u 150u'
+.sp -1
+.sp -470u
+\h'578u'\D'l 0u 149u'
+.sp -1
+.sp 149u
+\h'578u'\D'l -21u -36u'\D'l 21u 14u'\D'l 22u -14u'\D'l -22u 36u'
+.sp -1
+.sp -456u
+\h'578u'\D'l -21u -36u'\D'l 21u 14u'\D'l 22u -14u'\D'l -22u 36u'
+.sp -1
+.sp -150u
+\h'578u'\D'l 0u 150u'
+.sp -1
+\D's 4u'
+.sp -1
+.sp 2491u
+\h'857u'\D'l 0u 214u'
+.sp -1
+\D's -1u'
+.sp -1
+.sp -7u
+\h'14u'\D'l 0u 221u'\D'l 1835u 0u'\D'l 0u -221u'\D'l -1835u 0u'
+.sp -1
+.sp -457u
+\h'7u'\D'l 0u 235u'\D'l 1264u 0u'\D'l 0u -235u'\D'l -1264u 0u'
+.sp -1
+.sp -457u
+\D'l 0u 235u'\D'l 1264u 0u'\D'l 0u -235u'\D'l -1264u 0u'
+.sp -1
+.sp -465u
+\h'7u'\D'l 0u 236u'\D'l 1264u 0u'\D'l 0u -236u'\D'l -1264u 0u'
+.sp -1
+.sp -464u
+\D'l 0u 236u'\D'l 1264u 0u'\D'l 0u -236u'\D'l -1264u 0u'
+.sp -1
+.sp -456u
+\D'l 0u 236u'\D'l 1264u 0u'\D'l 0u -236u'\D'l -1264u 0u'
+.sp -1
+.sp -450u
+\D'l 0u 236u'\D'l 1264u 0u'\D'l 0u -236u'\D'l -1264u 0u'
+.sp -1
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Fragment NPDU
+.sp 2863u
+\h'1035u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Transmit NPDU
+.sp 2856u
+\h'121u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Append Options Part
+.sp 2392u
+\h'121u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Append Address Part
+.sp 1949u
+\h'121u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Route Packet
+.sp 1485u
+\h'121u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Create Fixed Part
+.sp 1028u
+\h'121u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Allocate Header mbuf
+.sp 565u
+\h'121u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Check Addresses
+.sp 122u
+\h'121u'\&\*(g9
+.sp |\n(g8u
+.sp -457u
+\D'l 0u 236u'\D'l 1264u 0u'\D'l 0u -236u'\D'l -1264u 0u'
+.sp -1
+.ft R
+.ps 10
+.nr g8 \n(.d
+.ds g9 "Examine Options
+.sp 122u
+\h'121u'\&\*(g9
+.sp |\n(g8u
+.sp 415u
+\h'578u'\D'l -21u -36u'\D'l 21u 14u'\D'l 22u -14u'\D'l -22u 36u'
+.sp -1
+.sp -150u
+\h'578u'\D'l 0u 150u'
+.sp -1
+\D's 16u'
+.sp -1
+.sp -143u
+\h'1378u'\D'l 2057u 0u'
+.sp -1
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "EINVAL
+\h'1607u'\&\*(g9
+.sp |\n(g8u
+\D's -1u'
+.sp -1
+.sp 3655u
+\h'921u'\D'l 0u 114u'\D'l 2514u 0u'\D'l 0u -3883u'
+.sp -1
+.sp -3769u
+\h'3435u'\D'l 21u 35u'\D'l -21u -14u'\D'l -22u 14u'\D'l 22u -35u'
+.sp -1
+.sp 3883u
+\D't 3u'\D's -1u'
+.br
+.ft \n(g3
+.ps \n(g4
+.GE
+.ce
+\fB Figure \n+(FG:\fR Flow of control for emitting CLNP NPDUs
+.)z
diff --git a/share/doc/iso/wisc/figs/ecn_network.grn b/share/doc/iso/wisc/figs/ecn_network.grn
new file mode 100644
index 0000000..d58c5d8
--- /dev/null
+++ b/share/doc/iso/wisc/figs/ecn_network.grn
@@ -0,0 +1,19 @@
+.(z
+.hl
+.GS C
+width 6.0
+high 4.0
+1 6
+2 8
+3 10
+4 12
+sc 0.5
+narrow 1
+medium 3
+thick 7
+pointscale off
+file ecn_network.gsrc
+.GE
+.ce
+\fBFigure \n+(FG:\fR The X.25 Network Interface
+.)z
diff --git a/share/doc/iso/wisc/figs/ecn_network.gsrc b/share/doc/iso/wisc/figs/ecn_network.gsrc
new file mode 100644
index 0000000..1772b1d
--- /dev/null
+++ b/share/doc/iso/wisc/figs/ecn_network.gsrc
@@ -0,0 +1,288 @@
+gremlinfile
+0 370.00 354.00
+0
+370.00 346.00
+370.00 361.00
+370.00 361.00
+370.00 361.00
+-1.00 -1.00
+1 2
+10 (/dev/bus)
+ 0
+360.00 361.00
+360.00 376.00
+360.00 376.00
+360.00 376.00
+-1.00 -1.00
+1 2
+13 X.25 download
+ 0
+558.00 524.00
+558.00 539.00
+558.00 539.00
+558.00 539.00
+-1.00 -1.00
+1 2
+13 configuration
+ 0
+558.00 534.00
+558.00 549.00
+558.00 549.00
+558.00 549.00
+-1.00 -1.00
+1 2
+8 updated
+ 0
+358.00 459.00
+358.00 474.00
+358.00 474.00
+358.00 474.00
+-1.00 -1.00
+1 2
+12 (/dev/kmem1)
+ 0
+362.00 474.00
+362.00 489.00
+362.00 489.00
+362.00 489.00
+-1.00 -1.00
+1 2
+13 configuration
+ 0
+248.00 399.00
+248.00 414.00
+248.00 414.00
+248.00 414.00
+-1.00 -1.00
+1 2
+22 Data Area on the board
+ 0
+248.00 409.00
+248.00 424.00
+248.00 424.00
+248.00 424.00
+-1.00 -1.00
+1 2
+22 to and from the Common
+ 0
+245.00 507.00
+245.00 522.00
+245.00 522.00
+245.00 522.00
+-1.00 -1.00
+1 2
+10 ecnioctl()
+ 0
+245.00 516.00
+245.00 531.00
+245.00 531.00
+245.00 531.00
+-1.00 -1.00
+1 2
+12 ecnrestart()
+ 0
+245.00 524.00
+245.00 539.00
+245.00 539.00
+245.00 539.00
+-1.00 -1.00
+1 2
+13 ecnshutdown()
+ 0
+176.00 419.00
+176.00 434.00
+176.00 434.00
+176.00 434.00
+-1.00 -1.00
+1 2
+34 INTERFACES: the NCB command loaded
+ 0
+175.00 532.00
+175.00 547.00
+175.00 547.00
+175.00 547.00
+-1.00 -1.00
+1 2
+23 INTERFACES: ecnoutput()
+ 0
+42.00 415.00
+42.00 430.00
+42.00 430.00
+42.00 430.00
+-1.00 -1.00
+1 2
+15 COMMANDS: NCB_*
+ 0
+42.00 527.00
+42.00 542.00
+42.00 542.00
+42.00 542.00
+-1.00 -1.00
+1 2
+15 COMMANDS: ECN_*
+ 3
+546.00 511.00
+553.00 494.00
+560.00 511.00
+-1.00 -1.00
+5 0
+0
+ 3
+287.00 364.00
+270.00 357.00
+287.00 348.00
+-1.00 -1.00
+5 0
+0
+ 3
+287.00 477.00
+271.00 469.00
+287.00 461.00
+-1.00 -1.00
+5 0
+0
+ 3
+151.00 397.00
+159.00 382.00
+167.00 398.00
+-1.00 -1.00
+5 0
+0
+ 3
+151.00 431.00
+159.00 445.00
+167.00 431.00
+-1.00 -1.00
+5 0
+0
+ 3
+153.00 510.00
+160.00 494.00
+168.00 510.00
+-1.00 -1.00
+5 0
+0
+ 3
+152.00 540.00
+160.00 558.00
+167.00 540.00
+-1.00 -1.00
+5 0
+0
+ 3
+272.00 469.00
+492.00 469.00
+-1.00 -1.00
+5 0
+0
+ 3
+271.00 357.00
+552.00 357.00
+552.00 446.00
+-1.00 -1.00
+5 0
+0
+ 3
+553.00 557.00
+553.00 494.00
+-1.00 -1.00
+5 0
+0
+ 3
+159.00 445.00
+159.00 381.00
+-1.00 -1.00
+5 0
+0
+ 3
+160.00 557.00
+160.00 494.00
+-1.00 -1.00
+5 0
+0
+ 0
+517.00 458.00
+517.00 472.00
+517.00 472.00
+517.00 472.00
+-1.00 -1.00
+1 3
+8 %ecnload
+ 0
+514.00 570.00
+514.00 584.00
+514.00 584.00
+514.00 584.00
+-1.00 -1.00
+1 3
+8 %ecnconf
+ 0
+115.00 347.00
+115.00 366.00
+115.00 366.00
+115.00 366.00
+-1.00 -1.00
+1 4
+11 EICON Board
+ 0
+114.00 458.00
+114.00 477.00
+114.00 477.00
+114.00 477.00
+-1.00 -1.00
+1 4
+11 UNIX Driver
+ 0
+133.00 569.00
+133.00 588.00
+133.00 588.00
+133.00 588.00
+-1.00 -1.00
+1 4
+4 CONS
+ 3
+493.00 445.00
+493.00 493.00
+608.00 493.00
+608.00 445.00
+493.00 445.00
+-1.00 -1.00
+5 0
+0
+ 3
+493.00 557.00
+493.00 605.00
+608.00 605.00
+608.00 557.00
+493.00 557.00
+-1.00 -1.00
+5 0
+0
+ 3
+63.00 332.00
+63.00 381.00
+272.00 381.00
+272.00 332.00
+63.00 332.00
+-1.00 -1.00
+5 0
+0
+ 3
+63.00 445.00
+63.00 494.00
+272.00 494.00
+272.00 445.00
+63.00 445.00
+-1.00 -1.00
+5 0
+0
+ 3
+63.00 557.00
+63.00 606.00
+272.00 606.00
+272.00 557.00
+63.00 557.00
+-1.00 -1.00
+5 0
+0
+ -1
diff --git a/share/doc/iso/wisc/figs/ecn_network.nr b/share/doc/iso/wisc/figs/ecn_network.nr
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/share/doc/iso/wisc/figs/ecn_network.nr
diff --git a/share/doc/iso/wisc/figs/ecn_queue.grn b/share/doc/iso/wisc/figs/ecn_queue.grn
new file mode 100644
index 0000000..5a9824d
--- /dev/null
+++ b/share/doc/iso/wisc/figs/ecn_queue.grn
@@ -0,0 +1,19 @@
+.(z
+.hl
+.GS C
+width 6.0
+high 3.0
+1 5
+2 7
+3 9
+4 12
+sc 0.5
+narrow 1
+medium 3
+thick 7
+pointscale off
+file ecn_queue.gsrc
+.GE
+.ce
+\fBFigure \n+(FG:\fR Queue Placement Strategy
+.)z
diff --git a/share/doc/iso/wisc/figs/ecn_queue.gsrc b/share/doc/iso/wisc/figs/ecn_queue.gsrc
new file mode 100644
index 0000000..81e3e07
--- /dev/null
+++ b/share/doc/iso/wisc/figs/ecn_queue.gsrc
@@ -0,0 +1,371 @@
+gremlinfile
+0 98.00 422.00
+3
+98.00 278.00
+562.00 278.00
+-1.00 -1.00
+4 0
+0
+ 3
+425.00 557.00
+577.00 557.00
+-1.00 -1.00
+4 0
+0
+ 3
+341.00 528.00
+425.00 528.00
+-1.00 -1.00
+5 0
+0
+ 0
+457.00 536.00
+457.00 549.00
+457.00 549.00
+457.00 549.00
+-1.00 -1.00
+2 3
+10 ECN driver
+ 0
+321.00 419.00
+321.00 432.00
+321.00 432.00
+321.00 432.00
+-1.00 -1.00
+2 2
+20 Driver->CONS replies
+ 0
+356.00 584.00
+356.00 599.00
+356.00 599.00
+356.00 599.00
+-1.00 -1.00
+1 2
+8 x25intrq
+ 0
+457.00 253.00
+457.00 266.00
+457.00 266.00
+457.00 266.00
+-1.00 -1.00
+2 3
+16 EICON X.25 board
+ 0
+457.00 285.00
+457.00 298.00
+457.00 298.00
+457.00 298.00
+-1.00 -1.00
+2 3
+10 ECN driver
+ 0
+457.00 563.00
+457.00 576.00
+457.00 576.00
+457.00 576.00
+-1.00 -1.00
+2 3
+11 CONS module
+ 3
+217.00 557.00
+340.00 557.00
+-1.00 -1.00
+4 0
+0
+ 3
+90.00 556.00
+131.00 556.00
+-1.00 -1.00
+4 0
+0
+ 3
+375.00 222.00
+381.00 209.00
+389.00 222.00
+-1.00 -1.00
+5 0
+0
+ 3
+168.00 222.00
+174.00 209.00
+182.00 222.00
+-1.00 -1.00
+5 0
+0
+ 3
+165.00 615.00
+171.00 602.00
+179.00 615.00
+-1.00 -1.00
+5 0
+0
+ 3
+166.00 421.00
+172.00 408.00
+180.00 421.00
+-1.00 -1.00
+5 0
+0
+ 3
+173.00 392.00
+189.00 371.00
+-1.00 -1.00
+1 0
+0
+ 3
+173.00 348.00
+172.00 392.00
+273.00 360.00
+-1.00 -1.00
+1 0
+0
+ 3
+306.00 361.00
+382.00 414.00
+-1.00 -1.00
+1 0
+0
+ 3
+266.00 228.00
+273.00 243.00
+280.00 228.00
+-1.00 -1.00
+5 0
+0
+ 0
+201.00 197.00
+201.00 210.00
+201.00 210.00
+201.00 210.00
+-1.00 -1.00
+2 2
+23 Driver<->Board commands
+ 3
+273.00 246.00
+273.00 214.00
+-1.00 -1.00
+1 0
+0
+ 0
+223.00 295.00
+223.00 308.00
+223.00 308.00
+223.00 308.00
+-1.00 -1.00
+2 2
+15 posted commands
+ 3
+111.00 402.00
+131.00 402.00
+-1.00 -1.00
+5 0
+0
+ 3
+376.00 459.00
+383.00 474.00
+390.00 459.00
+-1.00 -1.00
+5 0
+0
+ 3
+364.00 363.00
+383.00 416.00
+387.00 357.00
+-1.00 -1.00
+1 0
+0
+ 3
+383.00 437.00
+383.00 473.00
+-1.00 -1.00
+1 0
+0
+ 3
+172.00 411.00
+172.00 474.00
+-1.00 -1.00
+1 0
+0
+ 0
+8.00 401.00
+8.00 416.00
+8.00 416.00
+8.00 416.00
+-1.00 -1.00
+1 2
+15 ecn_pending_req
+ 0
+109.00 653.00
+109.00 666.00
+109.00 666.00
+109.00 666.00
+-1.00 -1.00
+2 2
+20 CONS->Driver command
+ 0
+357.00 570.00
+357.00 585.00
+357.00 585.00
+357.00 585.00
+-1.00 -1.00
+1 2
+5 QUEUE
+ 0
+151.00 569.00
+151.00 584.00
+151.00 584.00
+151.00 584.00
+-1.00 -1.00
+1 2
+5 QUEUE
+ 3
+340.00 315.00
+340.00 298.00
+422.00 298.00
+422.00 315.00
+340.00 315.00
+-1.00 -1.00
+6 0
+0
+ 3
+235.00 347.00
+235.00 330.00
+317.00 330.00
+317.00 347.00
+235.00 347.00
+-1.00 -1.00
+6 0
+0
+ 3
+232.00 262.00
+232.00 245.00
+314.00 245.00
+314.00 262.00
+232.00 262.00
+-1.00 -1.00
+6 0
+0
+ 3
+133.00 329.00
+133.00 312.00
+215.00 312.00
+215.00 329.00
+133.00 329.00
+-1.00 -1.00
+6 0
+0
+ 3
+133.00 409.00
+133.00 392.00
+215.00 392.00
+215.00 409.00
+133.00 409.00
+-1.00 -1.00
+6 0
+0
+ 3
+340.00 547.00
+426.00 547.00
+-1.00 -1.00
+5 0
+0
+ 3
+340.00 509.00
+425.00 509.00
+-1.00 -1.00
+5 0
+0
+ 3
+340.00 491.00
+424.00 491.00
+-1.00 -1.00
+5 0
+0
+ 3
+340.00 602.00
+340.00 473.00
+425.00 473.00
+425.00 601.00
+-1.00 -1.00
+6 0
+0
+ 3
+132.00 547.00
+218.00 547.00
+-1.00 -1.00
+5 0
+0
+ 3
+133.00 528.00
+217.00 528.00
+-1.00 -1.00
+5 0
+0
+ 3
+132.00 509.00
+217.00 509.00
+-1.00 -1.00
+5 0
+0
+ 3
+132.00 491.00
+216.00 491.00
+-1.00 -1.00
+5 0
+0
+ 3
+132.00 602.00
+132.00 473.00
+217.00 473.00
+217.00 601.00
+-1.00 -1.00
+6 0
+0
+ 3
+125.00 410.00
+132.00 402.00
+125.00 395.00
+-1.00 -1.00
+5 0
+0
+ 3
+174.00 211.00
+174.00 312.00
+-1.00 -1.00
+1 0
+0
+ 3
+381.00 210.00
+381.00 298.00
+-1.00 -1.00
+1 0
+0
+ 3
+374.00 282.00
+381.00 297.00
+388.00 282.00
+-1.00 -1.00
+5 0
+0
+ 3
+167.00 297.00
+174.00 312.00
+181.00 297.00
+-1.00 -1.00
+5 0
+0
+ 0
+156.00 583.00
+156.00 598.00
+156.00 598.00
+156.00 598.00
+-1.00 -1.00
+1 2
+6 ecn_if
+ 3
+171.00 604.00
+171.00 648.00
+-1.00 -1.00
+1 0
+0
+ -1
diff --git a/share/doc/iso/wisc/figs/ecn_queue.nr b/share/doc/iso/wisc/figs/ecn_queue.nr
new file mode 100644
index 0000000..c6c0ce1
--- /dev/null
+++ b/share/doc/iso/wisc/figs/ecn_queue.nr
@@ -0,0 +1,262 @@
+.(z
+.hl
+.br
+.nr g1 2156u
+.nr g2 1727u
+.GS C
+.nr g3 \n(.f
+.nr g4 \n(.s
+\0
+.sp -1
+\D's 4u'\D't 1u'
+.sp -1
+.sp 186u
+\h'617u'\D'l 0u -167u'
+.sp -1
+.ft R
+.ps 7
+.nr g8 \n(.d
+.ds g9 "ecn_if
+.sp 80u
+\h'561u'\&\*(g9
+.sp |\n(g8u
+\D's -1u'
+.sp -1
+.sp 1162u
+\h'602u'\D'l 27u -56u'\D'l 26u 56u'
+.sp -1
+.sp 57u
+\h'1387u'\D'l 26u -57u'\D'l 27u 57u'
+.sp -1
+\D's 4u'
+.sp -1
+.sp 273u
+\h'1413u'\D'l 0u -333u'
+.sp -1
+.sp -4u
+\h'629u'\D'l 0u -382u'
+.sp -1
+\D's -1u'
+.sp -1
+.sp -754u
+\h'443u'\D'l 27u 31u'\D'l -27u 26u'
+.sp -1
+\D't 3u'
+.sp -1
+.sp -726u
+\h'470u'\D'l 0u 487u'\D'l 322u 0u'\D'l 0u -484u'
+.sp -1
+\D't 1u'
+.sp -1
+.sp 419u
+\h'470u'\D'l 318u 0u'
+.sp -1
+.sp -68u
+\h'470u'\D'l 322u 0u'
+.sp -1
+.sp -71u
+\h'473u'\D'l 319u 0u'
+.sp -1
+.sp -72u
+\h'470u'\D'l 326u 0u'
+.sp -1
+\D't 3u'
+.sp -1
+.sp -208u
+\h'1258u'\D'l 0u 487u'\D'l 322u 0u'\D'l 0u -484u'
+.sp -1
+\D't 1u'
+.sp -1
+.sp 419u
+\h'1258u'\D'l 318u 0u'
+.sp -1
+.sp -68u
+\h'1258u'\D'l 322u 0u'
+.sp -1
+.sp -143u
+\h'1258u'\D'l 326u 0u'
+.sp -1
+\D't 3u'
+.sp -1
+.sp 522u
+\h'473u'\D'l 0u 64u'\D'l 311u 0u'\D'l 0u -64u'\D'l -311u 0u'
+.sp -1
+.sp 303u
+\h'473u'\D'l 0u 65u'\D'l 311u 0u'\D'l 0u -65u'\D'l -311u 0u'
+.sp -1
+.sp 254u
+\h'849u'\D'l 0u 64u'\D'l 310u 0u'\D'l 0u -64u'\D'l -310u 0u'
+.sp -1
+.sp -322u
+\h'860u'\D'l 0u 64u'\D'l 311u 0u'\D'l 0u -64u'\D'l -311u 0u'
+.sp -1
+.sp 121u
+\h'1258u'\D'l 0u 65u'\D'l 311u 0u'\D'l 0u -65u'\D'l -311u 0u'
+.sp -1
+.ft R
+.ps 7
+.nr g8 \n(.d
+.ds g9 "QUEUE
+.sp -961u
+\h'542u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 7
+.nr g8 \n(.d
+.ds g9 "QUEUE
+.sp -965u
+\h'1322u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 7
+.nr g8 \n(.d
+.ds g9 "CONS->Driver command
+.sp -1280u
+\h'383u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 7
+.nr g8 \n(.d
+.ds g9 "ecn_pending_req
+.sp -326u
+\&\*(g9
+.sp |\n(g8u
+\D's 4u'\D't 1u'
+.sp -1
+.sp -364u
+\h'621u'\D'l 0u -238u'
+.sp -1
+.sp -98u
+\h'1421u'\D'l 0u -137u'
+.sp -1
+.sp 280u
+\h'1349u'\D'l 72u -201u'\D'l 15u 224u'
+.sp -1
+\D's -1u'
+.sp -1
+.sp -363u
+\h'1394u'\D'l 27u -57u'\D'l 26u 57u'
+.sp -1
+.sp 216u
+\h'390u'\D'l 76u 0u'
+.sp -1
+.ft I
+.ps 7
+.nr g8 \n(.d
+.ds g9 "posted commands
+.sp 405u
+\h'815u'\&\*(g9
+.sp |\n(g8u
+\D's 4u'
+.sp -1
+.sp 591u
+\h'1004u'\D'l 0u 121u'
+.sp -1
+.ft I
+.ps 7
+.nr g8 \n(.d
+.ds g9 "Driver<->Board commands
+.sp 185u
+\h'731u'\&\*(g9
+.sp |\n(g8u
+\D's -1u'
+.sp -1
+.sp 68u
+\h'977u'\D'l 27u -57u'\D'l 27u 57u'
+.sp -1
+\D's 4u'
+.sp -1
+.sp -504u
+\h'1129u'\D'l 288u -201u'
+.sp -1
+.sp 49u
+\h'625u'\D'l -4u -167u'\D'l 383u 122u'
+.sp -1
+.sp -167u
+\h'625u'\D'l 61u 80u'
+.sp -1
+\D's -1u'
+.sp -1
+.sp -109u
+\h'599u'\D'l 22u 49u'\D'l 31u -49u'
+.sp -1
+.sp -735u
+\h'595u'\D'l 22u 50u'\D'l 31u -50u'
+.sp -1
+.sp 1489u
+\h'606u'\D'l 23u 49u'\D'l 30u -49u'
+.sp -1
+\h'1391u'\D'l 22u 49u'\D'l 31u -49u'
+.sp -1
+\D's 16u'
+.sp -1
+.sp -1265u
+\h'311u'\D'l 155u 0u'
+.sp -1
+.sp -4u
+\h'792u'\D'l 466u 0u'
+.sp -1
+.ft I
+.ps 9
+.nr g8 \n(.d
+.ds g9 "CONS module
+.sp -23u
+\h'1701u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 9
+.nr g8 \n(.d
+.ds g9 "ECN driver
+.sp 1030u
+\h'1701u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 9
+.nr g8 \n(.d
+.ds g9 "EICON X.25 board
+.sp 1151u
+\h'1701u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 7
+.nr g8 \n(.d
+.ds g9 "x25intrq
+.sp -102u
+\h'1319u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 7
+.nr g8 \n(.d
+.ds g9 "Driver->CONS replies
+.sp 522u
+\h'1186u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 9
+.nr g8 \n(.d
+.ds g9 "ECN driver
+.sp 80u
+\h'1701u'\&\*(g9
+.sp |\n(g8u
+\D's -1u'
+.sp -1
+.sp 110u
+\h'1262u'\D'l 318u 0u'
+.sp -1
+\D's 16u'
+.sp -1
+.sp -110u
+\h'1580u'\D'l 576u 0u'
+.sp -1
+.sp 1056u
+\h'341u'\D'l 1758u 0u'
+.sp -1
+.sp 307u
+\D't 3u'\D's -1u'
+.br
+.ft \n(g3
+.ps \n(g4
+.GE
+.ce
+\fBFigure \n+(FG:\fR Queue Placement Strategy
+.)z
diff --git a/share/doc/iso/wisc/figs/ecn_vc.grn b/share/doc/iso/wisc/figs/ecn_vc.grn
new file mode 100644
index 0000000..b1c93ed
--- /dev/null
+++ b/share/doc/iso/wisc/figs/ecn_vc.grn
@@ -0,0 +1,19 @@
+.(z
+.hl
+.GS C
+width 6.0
+high 4.0
+1 8
+2 10
+3 12
+4 14
+sc 0.5
+narrow 1
+medium 3
+thick 7
+pointscale off
+file ecn_vc.gsrc
+.GE
+.ce
+\fBFigure \n+(FG:\fR Virtual Circuit State Diagram
+.)z
diff --git a/share/doc/iso/wisc/figs/ecn_vc.gsrc b/share/doc/iso/wisc/figs/ecn_vc.gsrc
new file mode 100644
index 0000000..9364ced
--- /dev/null
+++ b/share/doc/iso/wisc/figs/ecn_vc.gsrc
@@ -0,0 +1,273 @@
+gremlinfile
+0 184.00 269.00
+0
+184.00 431.00
+184.00 441.00
+184.00 441.00
+184.00 441.00
+-1.00 -1.00
+2 1
+23 SEND/RECEIVE completion
+ 0
+110.00 358.00
+110.00 368.00
+110.00 368.00
+110.00 368.00
+-1.00 -1.00
+2 1
+10 completion
+ 0
+99.00 368.00
+99.00 378.00
+99.00 378.00
+99.00 378.00
+-1.00 -1.00
+2 1
+11 CLEAR/ABORT
+ 0
+366.00 360.00
+366.00 370.00
+366.00 370.00
+366.00 370.00
+-1.00 -1.00
+2 1
+6 issued
+ 0
+359.00 373.00
+359.00 383.00
+359.00 383.00
+359.00 383.00
+-1.00 -1.00
+2 1
+11 CLEAR/ABORT
+ 0
+210.00 445.00
+210.00 455.00
+210.00 455.00
+210.00 455.00
+-1.00 -1.00
+2 1
+9 0x0a from
+ 0
+206.00 495.00
+206.00 505.00
+206.00 505.00
+206.00 505.00
+-1.00 -1.00
+2 1
+22 CALL/LISTEN completion
+ 0
+264.00 523.00
+264.00 533.00
+264.00 533.00
+264.00 533.00
+-1.00 -1.00
+2 1
+10 completion
+ 0
+240.00 533.00
+240.00 543.00
+240.00 543.00
+240.00 543.00
+-1.00 -1.00
+2 1
+13 RECEIVE/RESET
+ 0
+379.00 575.00
+379.00 585.00
+379.00 585.00
+379.00 585.00
+-1.00 -1.00
+2 1
+10 completion
+ 0
+345.00 589.00
+345.00 599.00
+345.00 599.00
+345.00 599.00
+-1.00 -1.00
+2 1
+22 0x18 from SEND/RECEIVE
+ 0
+394.00 602.00
+394.00 612.00
+394.00 612.00
+394.00 612.00
+-1.00 -1.00
+2 1
+6 - or -
+ 0
+367.00 613.00
+367.00 623.00
+367.00 623.00
+367.00 623.00
+-1.00 -1.00
+2 1
+12 RESET issued
+ 3
+319.00 359.00
+311.00 340.00
+329.00 349.00
+-1.00 -1.00
+5 0
+0
+ 3
+361.00 520.00
+367.00 503.00
+351.00 508.00
+-1.00 -1.00
+5 0
+0
+ 3
+143.00 391.00
+138.00 409.00
+154.00 401.00
+-1.00 -1.00
+5 0
+0
+ 3
+328.00 582.00
+323.00 600.00
+339.00 592.00
+-1.00 -1.00
+5 0
+0
+ 3
+163.00 420.00
+152.00 427.00
+163.00 435.00
+-1.00 -1.00
+5 0
+0
+ 3
+350.00 485.00
+361.00 492.00
+350.00 500.00
+-1.00 -1.00
+5 0
+0
+ 3
+312.00 341.00
+375.00 407.00
+-1.00 -1.00
+4 0
+0
+ 3
+135.00 410.00
+202.00 343.00
+-1.00 -1.00
+4 0
+0
+ 3
+320.00 601.00
+408.00 529.00
+-1.00 -1.00
+4 0
+0
+ 3
+293.00 563.00
+368.00 503.00
+-1.00 -1.00
+4 0
+0
+ 3
+150.00 428.00
+358.00 428.00
+-1.00 -1.00
+4 0
+0
+ 3
+148.00 492.00
+363.00 492.00
+-1.00 -1.00
+4 0
+0
+ 0
+226.00 309.00
+226.00 319.00
+226.00 319.00
+226.00 319.00
+-1.00 -1.00
+1 1
+8 VC_CLEAR
+ 0
+372.00 455.00
+372.00 465.00
+372.00 465.00
+372.00 465.00
+-1.00 -1.00
+1 1
+12 VC_DATA_XFER
+ 0
+25.00 458.00
+25.00 468.00
+25.00 468.00
+25.00 468.00
+-1.00 -1.00
+1 1
+16 VC_NO_CONNECTION
+ 0
+218.00 293.00
+218.00 303.00
+218.00 303.00
+218.00 303.00
+-1.00 -1.00
+1 1
+11 IN_PROGRESS
+ 0
+222.00 618.00
+222.00 628.00
+222.00 628.00
+222.00 628.00
+-1.00 -1.00
+1 1
+11 IN_PROGRESS
+ 0
+228.00 634.00
+228.00 644.00
+228.00 644.00
+228.00 644.00
+-1.00 -1.00
+1 1
+8 VC_RESET
+ 4
+423.00 459.00
+429.00 390.00
+423.00 528.26
+423.00 389.74
+353.74 459.00
+492.26 459.00
+-1.00 -1.00
+5 0
+0
+ 4
+89.00 459.00
+83.00 390.00
+89.00 528.26
+89.00 389.74
+158.26 459.00
+19.74 459.00
+-1.00 -1.00
+5 0
+0
+ 4
+256.00 299.00
+250.00 230.00
+256.00 368.26
+256.00 229.74
+325.26 299.00
+186.74 299.00
+-1.00 -1.00
+5 0
+0
+ 4
+256.00 621.00
+250.00 690.00
+256.00 551.74
+256.00 690.26
+325.26 621.00
+186.74 621.00
+-1.00 -1.00
+5 0
+0
+ -1
diff --git a/share/doc/iso/wisc/figs/ecn_vc.nr b/share/doc/iso/wisc/figs/ecn_vc.nr
new file mode 100644
index 0000000..ca2cec5
--- /dev/null
+++ b/share/doc/iso/wisc/figs/ecn_vc.nr
@@ -0,0 +1,205 @@
+.(z
+.hl
+.br
+.nr g1 2364u
+.nr g2 2303u
+.GS C
+.nr g3 \n(.f
+.nr g4 \n(.s
+\0
+.sp -1
+\D't 1u'
+.sp -1
+.sp 346u
+\h'836u'\D'c 693u'
+.sp -1
+.sp 1610u
+\h'836u'\D'c 693u'
+.sp -1
+.sp -800u
+\D'c 693u'
+.sp -1
+\h'1671u'\D'c 693u'
+.sp -1
+.ft R
+.ps 8
+.nr g8 \n(.d
+.ds g9 "VC_RESET
+.sp -875u
+\h'1042u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 8
+.nr g8 \n(.d
+.ds g9 "IN_PROGRESS
+.sp -795u
+\h'1012u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 8
+.nr g8 \n(.d
+.ds g9 "IN_PROGRESS
+.sp 830u
+\h'992u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 8
+.nr g8 \n(.d
+.ds g9 "VC_NO_CONNECTION
+.sp 5u
+\h'27u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 8
+.nr g8 \n(.d
+.ds g9 "VC_DATA_XFER
+.sp 20u
+\h'1763u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 8
+.nr g8 \n(.d
+.ds g9 "VC_CLEAR
+.sp 750u
+\h'1032u'\&\*(g9
+.sp |\n(g8u
+\D's 16u'
+.sp -1
+.sp -165u
+\h'642u'\D'l 1076u 0u'
+.sp -1
+.sp 320u
+\h'652u'\D'l 1041u 0u'
+.sp -1
+.sp -675u
+\h'1367u'\D'l 376u 300u'
+.sp -1
+.sp -190u
+\h'1502u'\D'l 441u 360u'
+.sp -1
+.sp 955u
+\h'577u'\D'l 335u 335u'
+.sp -1
+.sp 345u
+\h'1462u'\D'l 316u -330u'
+.sp -1
+\D's -1u'
+.sp -1
+.sp -720u
+\h'1653u'\D'l 55u -35u'\D'l -55u -40u'
+.sp -1
+.sp 325u
+\h'717u'\D'l -55u -35u'\D'l 55u -40u'
+.sp -1
+.sp -810u
+\h'1542u'\D'l -25u -90u'\D'l 81u 40u'
+.sp -1
+.sp 955u
+\h'617u'\D'l -25u -90u'\D'l 80u 40u'
+.sp -1
+.sp -645u
+\h'1708u'\D'l 30u 85u'\D'l -80u -25u'
+.sp -1
+.sp 805u
+\h'1497u'\D'l -40u 95u'\D'l 91u -45u'
+.sp -1
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "RESET issued
+.sp -1270u
+\h'1738u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "- or -
+.sp -1215u
+\h'1873u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "0x18 from SEND/RECEIVE
+.sp -1150u
+\h'1628u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "completion
+.sp -1080u
+\h'1798u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "RECEIVE/RESET
+.sp -870u
+\h'1102u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "completion
+.sp -820u
+\h'1222u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "CALL/LISTEN completion
+.sp -680u
+\h'932u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "0x0a from
+.sp -430u
+\h'952u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "CLEAR/ABORT
+.sp -70u
+\h'1698u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "issued
+.sp -5u
+\h'1733u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "CLEAR/ABORT
+.sp -45u
+\h'397u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "completion
+.sp 5u
+\h'452u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 8
+.nr g8 \n(.d
+.ds g9 "SEND/RECEIVE completion
+.sp -360u
+\h'822u'\&\*(g9
+.sp |\n(g8u
+.sp 647u
+\D't 3u'\D's -1u'
+.br
+.ft \n(g3
+.ps \n(g4
+.GE
+.ce
+\fBFigure \n+(FG:\fR Virtual Circuit State Diagram
+.)z
diff --git a/share/doc/iso/wisc/figs/func_units.grn b/share/doc/iso/wisc/figs/func_units.grn
new file mode 100644
index 0000000..3c98567
--- /dev/null
+++ b/share/doc/iso/wisc/figs/func_units.grn
@@ -0,0 +1,18 @@
+.(z L
+.GS C
+width 6.0
+high 7.0
+1 8
+2 10
+3 12
+4 14
+sc 0.3
+narrow 1
+medium 3
+thick 7
+pointscale off
+file func_units.gsrc
+.GE
+.ce
+\fBFigure \n+(FG:\fR The major functional units of Unix 4.2A
+.)z
diff --git a/share/doc/iso/wisc/figs/func_units.gsrc b/share/doc/iso/wisc/figs/func_units.gsrc
new file mode 100644
index 0000000..29edd83
--- /dev/null
+++ b/share/doc/iso/wisc/figs/func_units.gsrc
@@ -0,0 +1,603 @@
+gremlinfile
+0 80.00 208.00
+0
+80.00 580.00
+80.00 596.00
+80.00 596.00
+80.00 596.00
+-1.00 -1.00
+2 3
+6 kernel
+ 0
+80.00 628.00
+80.00 644.00
+80.00 644.00
+80.00 644.00
+-1.00 -1.00
+2 3
+4 user
+ 3
+144.00 212.00
+141.00 217.00
+144.00 215.00
+147.00 217.00
+144.00 212.00
+-1.00 -1.00
+6 0
+0
+ 3
+184.00 340.00
+189.66 338.59
+186.12 337.88
+185.41 334.34
+184.00 340.00
+-1.00 -1.00
+6 0
+0
+ 3
+264.00 284.00
+258.34 285.41
+261.88 286.12
+262.59 289.66
+264.00 284.00
+-1.00 -1.00
+6 0
+0
+ 3
+320.00 324.00
+317.00 329.00
+320.00 327.00
+323.00 329.00
+320.00 324.00
+-1.00 -1.00
+6 0
+0
+ 3
+312.00 356.00
+315.00 351.00
+312.00 353.00
+309.00 351.00
+312.00 356.00
+-1.00 -1.00
+6 0
+0
+ 3
+536.00 548.00
+540.43 544.21
+536.95 545.15
+534.74 542.31
+536.00 548.00
+-1.00 -1.00
+6 0
+0
+ 3
+576.00 388.00
+573.00 393.00
+576.00 391.00
+579.00 393.00
+576.00 388.00
+-1.00 -1.00
+6 0
+0
+ 3
+544.00 380.00
+538.34 381.41
+541.88 382.12
+542.59 385.66
+544.00 380.00
+-1.00 -1.00
+6 0
+0
+ 3
+544.00 380.00
+541.00 385.00
+544.00 383.00
+547.00 385.00
+544.00 380.00
+-1.00 -1.00
+6 0
+0
+ 3
+560.00 292.00
+563.00 287.00
+560.00 289.00
+557.00 287.00
+560.00 292.00
+-1.00 -1.00
+6 0
+0
+ 3
+488.00 156.00
+487.55 161.81
+489.34 158.68
+492.92 159.13
+488.00 156.00
+-1.00 -1.00
+6 0
+0
+ 3
+456.00 164.00
+453.00 169.00
+456.00 167.00
+459.00 169.00
+456.00 164.00
+-1.00 -1.00
+6 0
+0
+ 3
+384.00 308.00
+385.41 313.66
+386.12 310.12
+389.66 309.41
+384.00 308.00
+-1.00 -1.00
+6 0
+0
+ 3
+360.00 420.00
+365.00 423.00
+363.00 420.00
+365.00 417.00
+360.00 420.00
+-1.00 -1.00
+6 0
+0
+ 3
+344.00 444.00
+345.41 449.66
+346.12 446.12
+349.66 445.41
+344.00 444.00
+-1.00 -1.00
+6 0
+0
+ 3
+456.00 556.00
+456.45 550.19
+454.66 553.32
+451.08 552.87
+456.00 556.00
+-1.00 -1.00
+6 0
+0
+ 3
+272.00 436.00
+266.34 437.41
+269.88 438.12
+270.59 441.66
+272.00 436.00
+-1.00 -1.00
+6 0
+0
+ 3
+184.00 404.00
+185.41 409.66
+186.12 406.12
+189.66 405.41
+184.00 404.00
+-1.00 -1.00
+6 0
+0
+ 3
+432.00 652.00
+427.00 649.00
+429.00 652.00
+427.00 655.00
+432.00 652.00
+-1.00 -1.00
+6 0
+0
+ 3
+352.00 676.00
+357.81 676.45
+354.68 674.66
+355.13 671.08
+352.00 676.00
+-1.00 -1.00
+6 0
+0
+ 3
+200.00 500.00
+205.66 498.59
+202.12 497.88
+201.41 494.34
+200.00 500.00
+-1.00 -1.00
+6 0
+0
+ 3
+208.00 548.00
+213.00 551.00
+211.00 548.00
+213.00 545.00
+208.00 548.00
+-1.00 -1.00
+6 0
+0
+ 3
+192.00 572.00
+193.41 577.66
+194.12 574.12
+197.66 573.41
+192.00 572.00
+-1.00 -1.00
+6 0
+0
+ 3
+272.00 660.00
+272.45 654.19
+270.66 657.32
+267.08 656.87
+272.00 660.00
+-1.00 -1.00
+6 0
+0
+ 3
+456.00 556.00
+344.00 444.00
+-1.00 -1.00
+6 0
+0
+ 3
+544.00 380.00
+520.00 412.00
+-1.00 -1.00
+6 0
+0
+ 3
+576.00 388.00
+536.00 548.00
+-1.00 -1.00
+6 0
+0
+ 3
+560.00 292.00
+488.00 156.00
+-1.00 -1.00
+6 0
+0
+ 3
+424.00 612.00
+568.00 612.00
+-1.00 -1.00
+2 0
+0
+ 0
+424.00 68.00
+424.00 84.00
+424.00 84.00
+424.00 84.00
+-1.00 -1.00
+3 3
+7 drivers
+ 0
+424.00 92.00
+424.00 108.00
+424.00 108.00
+424.00 108.00
+-1.00 -1.00
+3 3
+9 interface
+ 3
+480.00 404.00
+456.00 164.00
+-1.00 -1.00
+6 0
+0
+ 3
+464.00 412.00
+384.00 308.00
+-1.00 -1.00
+6 0
+0
+ 3
+448.00 436.00
+360.00 420.00
+-1.00 -1.00
+6 0
+0
+ 3
+312.00 356.00
+320.00 324.00
+-1.00 -1.00
+6 0
+0
+ 3
+200.00 500.00
+272.00 436.00
+-1.00 -1.00
+6 0
+0
+ 3
+184.00 340.00
+264.00 284.00
+-1.00 -1.00
+6 0
+0
+ 3
+144.00 324.00
+144.00 212.00
+-1.00 -1.00
+6 0
+0
+ 3
+440.00 564.00
+176.00 404.00
+-1.00 -1.00
+6 0
+0
+ 3
+424.00 588.00
+208.00 548.00
+-1.00 -1.00
+6 0
+0
+ 3
+352.00 676.00
+432.00 652.00
+-1.00 -1.00
+6 0
+0
+ 3
+272.00 660.00
+192.00 572.00
+-1.00 -1.00
+6 0
+0
+ 0
+120.00 132.00
+120.00 148.00
+120.00 148.00
+120.00 148.00
+-1.00 -1.00
+3 3
+7 drivers
+ 0
+120.00 156.00
+120.00 172.00
+120.00 172.00
+120.00 172.00
+-1.00 -1.00
+3 3
+6 device
+ 0
+120.00 180.00
+120.00 196.00
+120.00 196.00
+120.00 196.00
+-1.00 -1.00
+3 3
+7 blocked
+ 0
+424.00 116.00
+424.00 132.00
+424.00 132.00
+424.00 132.00
+-1.00 -1.00
+3 3
+8 network
+ 0
+560.00 332.00
+560.00 348.00
+560.00 348.00
+560.00 348.00
+-1.00 -1.00
+3 3
+3 IPC
+ 0
+304.00 212.00
+304.00 228.00
+304.00 228.00
+304.00 228.00
+-1.00 -1.00
+3 3
+7 support
+ 0
+304.00 236.00
+304.00 252.00
+304.00 252.00
+304.00 252.00
+-1.00 -1.00
+3 3
+6 memory
+ 0
+304.00 260.00
+304.00 276.00
+304.00 276.00
+304.00 276.00
+-1.00 -1.00
+3 3
+7 virtual
+ 0
+128.00 356.00
+128.00 372.00
+128.00 372.00
+128.00 372.00
+-1.00 -1.00
+3 3
+6 system
+ 0
+128.00 380.00
+128.00 396.00
+128.00 396.00
+128.00 396.00
+-1.00 -1.00
+3 3
+4 file
+ 0
+480.00 452.00
+480.00 468.00
+480.00 468.00
+480.00 468.00
+-1.00 -1.00
+3 3
+5 clock
+ 0
+288.00 380.00
+288.00 396.00
+288.00 396.00
+288.00 396.00
+-1.00 -1.00
+3 3
+7 support
+ 0
+288.00 404.00
+288.00 420.00
+288.00 420.00
+288.00 420.00
+-1.00 -1.00
+3 3
+7 process
+ 0
+448.00 572.00
+448.00 588.00
+448.00 588.00
+448.00 588.00
+-1.00 -1.00
+3 3
+12 system calls
+ 0
+456.00 628.00
+456.00 644.00
+456.00 644.00
+456.00 644.00
+-1.00 -1.00
+3 3
+9 C library
+ 0
+288.00 692.00
+288.00 708.00
+288.00 708.00
+288.00 708.00
+-1.00 -1.00
+3 3
+4 user
+ 0
+272.00 676.00
+272.00 692.00
+272.00 692.00
+272.00 692.00
+-1.00 -1.00
+3 3
+7 program
+ 0
+144.00 516.00
+144.00 532.00
+144.00 532.00
+144.00 532.00
+-1.00 -1.00
+3 3
+3 tty
+ 3
+568.00 612.00
+640.00 612.00
+-1.00 -1.00
+6 0
+0
+ 3
+424.00 612.00
+64.00 612.00
+-1.00 -1.00
+6 0
+0
+ 4
+496.00 612.00
+496.00 684.00
+496.00 540.00
+496.00 684.00
+568.00 612.00
+424.00 612.00
+-1.00 -1.00
+6 0
+0
+ 4
+456.00 100.00
+456.00 164.00
+456.00 36.00
+456.00 164.00
+520.00 100.00
+392.00 100.00
+-1.00 -1.00
+6 0
+0
+ 4
+336.00 244.00
+336.00 324.00
+336.00 164.00
+336.00 324.00
+416.00 244.00
+256.00 244.00
+-1.00 -1.00
+6 0
+0
+ 4
+144.00 164.00
+144.00 212.00
+144.00 116.00
+144.00 212.00
+192.00 164.00
+96.00 164.00
+-1.00 -1.00
+6 0
+0
+ 4
+144.00 372.00
+144.00 420.00
+144.00 324.00
+144.00 420.00
+192.00 372.00
+96.00 372.00
+-1.00 -1.00
+6 0
+0
+ 4
+576.00 340.00
+576.00 388.00
+576.00 292.00
+576.00 388.00
+624.00 340.00
+528.00 340.00
+-1.00 -1.00
+6 0
+0
+ 4
+496.00 452.00
+496.00 500.00
+496.00 404.00
+496.00 500.00
+544.00 452.00
+448.00 452.00
+-1.00 -1.00
+6 0
+0
+ 4
+312.00 404.00
+312.00 452.00
+312.00 356.00
+312.00 452.00
+360.00 404.00
+264.00 404.00
+-1.00 -1.00
+6 0
+0
+ 4
+160.00 532.00
+160.00 580.00
+160.00 484.00
+160.00 580.00
+208.00 532.00
+112.00 532.00
+-1.00 -1.00
+6 0
+0
+ 4
+304.00 692.00
+304.00 740.00
+304.00 644.00
+304.00 740.00
+352.00 692.00
+256.00 692.00
+-1.00 -1.00
+6 0
+0
+ -1
diff --git a/share/doc/iso/wisc/figs/func_units.nr b/share/doc/iso/wisc/figs/func_units.nr
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/share/doc/iso/wisc/figs/func_units.nr
diff --git a/share/doc/iso/wisc/figs/link_to_CONS_primitives.NR.DONT_REMOVE b/share/doc/iso/wisc/figs/link_to_CONS_primitives.NR.DONT_REMOVE
new file mode 100644
index 0000000..16dc3e0
--- /dev/null
+++ b/share/doc/iso/wisc/figs/link_to_CONS_primitives.NR.DONT_REMOVE
@@ -0,0 +1,77 @@
+.(b
+.TS
+tab(+) center expand box;
+c c
+a | a .
+service primitive & arguments+provided by
+=
+N_CONNECT.request+cons_openvc(... faddr, ...)
+called address+argument faddr
+calling address+not implemented
+receipt confirmation+not implemented
+expedited data+not implemented
+quality of service+not implemented
+NS-user data+not implemented
+_
+N_CONNECT.indication+not implemented
+_
+N_CONNECT.response+cons_netcmd( CONN_REFUSE )
++ or cons_netcmd( CONN_CONFIRM )
++ however, net connection has already
++ been accepted. If REFUSE, it will
++ be cleared with E_CO_HLI_REJT
++ (higher layer rejects connection)
+responding address+not implemented
+receipt confirmation+not implemented
+expedited data+not implemented
+quality of service+not implemented
+NS-user data+not implemented
+_
+N_CONNECT.confirm+not implemented
+=
+N_DATA.request+cons_output(... m, ...)
++and cosns_output(... m, ...)
+confirmation+not implemented
+data+mbuf chain m
+_
+N_DATA.indication+pr_input( m, ... )
++or software interrupt
+confirmation+not implemented
+data+mbuf chain
+_
+N_DATA_ACKNOWLEDGE.request+not implemented
+_
+N_DATA_ACKNOWLEDGE.indication+not implemented
+_
+N_EXPEDITED_DATA.request+not implemented
+_
+N_EXPEDITED_DATA.indication+not implemented
+=
+N_RESET.request+not implemented
+N_RESET.indication+socket->so_error = reason
++or pr_ctlinput( PRC_ROUTEDEAD )
+originator+not implemented
+reason+from X.25 packet or ecn driver
+N_RESET.response+not implemented
+N_RESET.confirm+not implemented
+=
+N_DISCONNECT.request+cons_netcmd( CONN_CLOSE )
+reason+uses E_CO_HLI_DISCN (normal
++disconnect from higher layer)
+responding address+not implemented
+NS_user data+not implemented
+_
+N_DISCONNECT.indication+socket->so_error = reason
++or pr_ctlinput( PRC_ROUTEDEAD )
+originator+not implemented
+reason+from X.25 packet or ecn driver
+responding address+not implemented
+NS_user data+not implemented
+.TE
+.(c
+\fBFigure \n+(FG\fR: Transport Service Primitives
+.)c
+.)b
+.(f
+\** data on disconnect is not supported at this time.
+.)f
diff --git a/share/doc/iso/wisc/figs/link_to_TS_primitives.NR.DONT_REMOVE b/share/doc/iso/wisc/figs/link_to_TS_primitives.NR.DONT_REMOVE
new file mode 100644
index 0000000..3d27df3
--- /dev/null
+++ b/share/doc/iso/wisc/figs/link_to_TS_primitives.NR.DONT_REMOVE
@@ -0,0 +1,60 @@
+.(b
+.TS
+center expand box;
+c c
+a | a .
+service primitive & arguments Unix system calls & arguments
+=
+T_CONNECT.request \fIsocket(), connect(), setsockopt()\fR
+called address \fIconnect()\fR argument
+calling address \fIconnect()\fR argument
+quality of service not implemented
+buffer management \fIsetsockopt()\fR argument
+security not implemented
+data \fIsetsockopt(), getsockopt()\fR
+_
+T_CONNECT.indication return from \fIaccept(); getsockopt()\fR
+called address \fIaccept()\fR argument
+calling address \fIaccept()\fR argument
+quality of service not implemented
+security not implemented
+data \fIsetsockopt(), getsockopt()\fR
+_
+T_CONNECT.response no applicable system calls
+_
+T_CONNECT.confirm return from \fIconnect()\fR
+quality of service \fIgetsockopt()\fR argument
+data \fIsetsocktopt, getsockopt()\fR
+=
+T_DATA.request \fIrecvv(), sendv()\fR
+_
+T_DATA.indication return from \fIrecvv()\fR, \fIsendv()\fR, or \fIselect()\fR;
+ or signal SIGIO
+ ioctl(FIONREAD) tells how much has been
+ queued to read
+=
+T_EXPEDITED_DATA.request \fIsendv()\fR with MSG_OOB flag
+_
+T_EXPEDITED_DATA.indication SIGURG, \fIgetsockopt()\fR with TPFLAG_XPD,
+ return from \fIselect()\fR with exceptional
+ conditions mask
+=
+T_DISCONNECT.request \fIclose()\fR
+data \fIsetsockopt()\fR
+_
+T_DISCONNECT.indication SIGURG,
+ error return on other primitives
+reason errno
+data \fIgetsockopt()\**\fR
+=
+T_STATUS.request \fIgetsockopt()\fR, \fItpstat\fR utility program
+_
+T_STATUS.indication \fIgetsockopt()\fR, \fIselect()\fR, \fItpstat\fR
+.TE
+.(c
+\fBFigure \n+(FG\fR: Transport Service Primitives
+.)c
+.)b
+.(f
+\** data on disconnect is not supported at this time.
+.)f
diff --git a/share/doc/iso/wisc/figs/mbufrcv.grn b/share/doc/iso/wisc/figs/mbufrcv.grn
new file mode 100644
index 0000000..0f3fa52
--- /dev/null
+++ b/share/doc/iso/wisc/figs/mbufrcv.grn
@@ -0,0 +1,13 @@
+.(z
+.GS C
+width 5.0
+high 6.0
+narrow 1
+medium 3
+thick 7
+pointscale on
+file mbufrcv.gsrc
+.GE
+.ce
+\fB Figure \n+(FG\fR: \fImbuf\fR chains on socket receive buffer
+.)z
diff --git a/share/doc/iso/wisc/figs/mbufrcv.gsrc b/share/doc/iso/wisc/figs/mbufrcv.gsrc
new file mode 100644
index 0000000..1577804
--- /dev/null
+++ b/share/doc/iso/wisc/figs/mbufrcv.gsrc
@@ -0,0 +1,1006 @@
+gremlinfile
+0 328.00 496.00
+0
+328.00 224.00
+328.00 234.00
+328.00 234.00
+328.00 234.00
+-1.00 -1.00
+1 1
+7 MT_DATA
+ 0
+328.00 400.00
+328.00 410.00
+328.00 410.00
+328.00 410.00
+-1.00 -1.00
+1 1
+7 MT_DATA
+ 0
+328.00 576.00
+328.00 586.00
+328.00 586.00
+328.00 586.00
+-1.00 -1.00
+1 1
+7 MT_DATA
+ 0
+72.00 576.00
+72.00 586.00
+72.00 586.00
+72.00 586.00
+-1.00 -1.00
+1 1
+7 MT_DATA
+ 3
+384.00 256.00
+416.00 256.00
+-1.00 -1.00
+5 0
+0
+ 3
+416.00 272.00
+416.00 240.00
+-1.00 -1.00
+5 0
+0
+ 3
+432.00 272.00
+432.00 240.00
+-1.00 -1.00
+5 0
+0
+ 3
+416.00 240.00
+432.00 272.00
+-1.00 -1.00
+5 0
+0
+ 3
+416.00 416.00
+432.00 448.00
+-1.00 -1.00
+5 0
+0
+ 3
+432.00 448.00
+432.00 416.00
+-1.00 -1.00
+5 0
+0
+ 3
+416.00 448.00
+416.00 416.00
+-1.00 -1.00
+5 0
+0
+ 3
+384.00 432.00
+416.00 432.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 432.00
+160.00 432.00
+-1.00 -1.00
+5 0
+0
+ 3
+160.00 448.00
+160.00 416.00
+-1.00 -1.00
+5 0
+0
+ 3
+176.00 448.00
+176.00 416.00
+-1.00 -1.00
+5 0
+0
+ 3
+160.00 416.00
+176.00 448.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 512.00
+288.00 512.00
+-1.00 -1.00
+5 0
+0
+ 3
+512.00 528.00
+512.00 496.00
+528.00 528.00
+528.00 496.00
+-1.00 -1.00
+5 0
+0
+ 3
+496.00 512.00
+512.00 512.00
+-1.00 -1.00
+5 0
+0
+ 3
+160.00 320.00
+176.00 352.00
+-1.00 -1.00
+5 0
+0
+ 3
+176.00 352.00
+176.00 320.00
+-1.00 -1.00
+5 0
+0
+ 3
+160.00 352.00
+160.00 320.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 336.00
+160.00 336.00
+-1.00 -1.00
+5 0
+0
+ 3
+416.00 144.00
+432.00 176.00
+-1.00 -1.00
+5 0
+0
+ 3
+512.00 592.00
+528.00 624.00
+-1.00 -1.00
+5 0
+0
+ 3
+288.00 496.00
+304.00 528.00
+-1.00 -1.00
+5 0
+0
+ 3
+432.00 176.00
+432.00 144.00
+-1.00 -1.00
+5 0
+0
+ 3
+416.00 176.00
+416.00 144.00
+-1.00 -1.00
+5 0
+0
+ 3
+384.00 160.00
+416.00 160.00
+-1.00 -1.00
+5 0
+0
+ 3
+304.00 528.00
+304.00 496.00
+-1.00 -1.00
+5 0
+0
+ 3
+288.00 528.00
+288.00 496.00
+-1.00 -1.00
+5 0
+0
+ 3
+528.00 624.00
+528.00 592.00
+-1.00 -1.00
+5 0
+0
+ 3
+512.00 624.00
+512.00 592.00
+-1.00 -1.00
+5 0
+0
+ 3
+496.00 608.00
+512.00 608.00
+-1.00 -1.00
+5 0
+0
+ 3
+352.00 272.00
+349.00 277.00
+352.00 275.00
+355.00 277.00
+352.00 272.00
+-1.00 -1.00
+5 0
+0
+ 3
+352.00 288.00
+352.00 272.00
+-1.00 -1.00
+5 0
+0
+ 3
+416.00 288.00
+352.00 288.00
+-1.00 -1.00
+5 0
+0
+ 3
+416.00 336.00
+416.00 288.00
+-1.00 -1.00
+5 0
+0
+ 3
+384.00 336.00
+416.00 336.00
+-1.00 -1.00
+5 0
+0
+ 3
+352.00 448.00
+349.00 453.00
+352.00 451.00
+355.00 453.00
+352.00 448.00
+-1.00 -1.00
+5 0
+0
+ 3
+352.00 464.00
+352.00 448.00
+-1.00 -1.00
+5 0
+0
+ 3
+416.00 464.00
+352.00 464.00
+-1.00 -1.00
+5 0
+0
+ 3
+416.00 512.00
+416.00 464.00
+-1.00 -1.00
+5 0
+0
+ 3
+96.00 448.00
+93.00 453.00
+96.00 451.00
+99.00 453.00
+96.00 448.00
+-1.00 -1.00
+5 0
+0
+ 3
+96.00 464.00
+96.00 448.00
+-1.00 -1.00
+5 0
+0
+ 3
+160.00 464.00
+96.00 464.00
+-1.00 -1.00
+5 0
+0
+ 3
+160.00 512.00
+160.00 464.00
+-1.00 -1.00
+5 0
+0
+ 3
+384.00 512.00
+416.00 512.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 512.00
+160.00 512.00
+-1.00 -1.00
+5 0
+0
+ 3
+432.00 608.00
+427.00 605.00
+429.00 608.00
+427.00 611.00
+432.00 608.00
+-1.00 -1.00
+5 0
+0
+ 3
+384.00 608.00
+432.00 608.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 608.00
+315.00 605.00
+317.00 608.00
+315.00 611.00
+320.00 608.00
+-1.00 -1.00
+5 0
+0
+ 3
+192.00 608.00
+187.00 605.00
+189.00 608.00
+187.00 611.00
+192.00 608.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 608.00
+320.00 608.00
+-1.00 -1.00
+5 0
+0
+ 3
+128.00 608.00
+192.00 608.00
+-1.00 -1.00
+5 0
+0
+ 3
+432.00 624.00
+432.00 496.00
+496.00 496.00
+496.00 624.00
+432.00 624.00
+-1.00 -1.00
+5 0
+0
+ 3
+432.00 592.00
+496.00 592.00
+-1.00 -1.00
+5 0
+0
+ 3
+432.00 528.00
+432.00 528.00
+496.00 528.00
+496.00 528.00
+432.00 528.00
+-1.00 -1.00
+5 0
+0
+ 0
+448.00 512.00
+448.00 522.00
+448.00 522.00
+448.00 522.00
+-1.00 -1.00
+1 1
+6 m_next
+ 0
+448.00 608.00
+448.00 618.00
+448.00 618.00
+448.00 618.00
+-1.00 -1.00
+1 1
+5 m_act
+ 3
+432.00 576.00
+432.00 576.00
+496.00 576.00
+496.00 576.00
+432.00 576.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 224.00
+320.00 224.00
+384.00 224.00
+384.00 224.00
+320.00 224.00
+-1.00 -1.00
+5 0
+0
+ 0
+336.00 256.00
+336.00 266.00
+336.00 266.00
+336.00 266.00
+-1.00 -1.00
+1 1
+5 m_act
+ 0
+336.00 160.00
+336.00 170.00
+336.00 170.00
+336.00 170.00
+-1.00 -1.00
+1 1
+6 m_next
+ 3
+320.00 176.00
+320.00 176.00
+384.00 176.00
+384.00 176.00
+320.00 176.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 240.00
+384.00 240.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 272.00
+320.00 144.00
+384.00 144.00
+384.00 272.00
+320.00 272.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 448.00
+320.00 320.00
+384.00 320.00
+384.00 448.00
+320.00 448.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 416.00
+384.00 416.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 352.00
+320.00 352.00
+384.00 352.00
+384.00 352.00
+320.00 352.00
+-1.00 -1.00
+5 0
+0
+ 0
+336.00 336.00
+336.00 346.00
+336.00 346.00
+336.00 346.00
+-1.00 -1.00
+1 1
+6 m_next
+ 0
+336.00 432.00
+336.00 442.00
+336.00 442.00
+336.00 442.00
+-1.00 -1.00
+1 1
+5 m_act
+ 3
+320.00 400.00
+320.00 400.00
+384.00 400.00
+384.00 400.00
+320.00 400.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 576.00
+320.00 576.00
+384.00 576.00
+384.00 576.00
+320.00 576.00
+-1.00 -1.00
+5 0
+0
+ 0
+336.00 608.00
+336.00 618.00
+336.00 618.00
+336.00 618.00
+-1.00 -1.00
+1 1
+5 m_act
+ 0
+336.00 512.00
+336.00 522.00
+336.00 522.00
+336.00 522.00
+-1.00 -1.00
+1 1
+6 m_next
+ 3
+320.00 528.00
+320.00 528.00
+384.00 528.00
+384.00 528.00
+320.00 528.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 592.00
+384.00 592.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 624.00
+320.00 496.00
+384.00 496.00
+384.00 624.00
+320.00 624.00
+-1.00 -1.00
+5 0
+0
+ 3
+192.00 624.00
+192.00 496.00
+256.00 496.00
+256.00 624.00
+192.00 624.00
+-1.00 -1.00
+5 0
+0
+ 3
+192.00 592.00
+256.00 592.00
+-1.00 -1.00
+5 0
+0
+ 3
+192.00 528.00
+192.00 528.00
+256.00 528.00
+256.00 528.00
+192.00 528.00
+-1.00 -1.00
+5 0
+0
+ 0
+208.00 512.00
+208.00 522.00
+208.00 522.00
+208.00 522.00
+-1.00 -1.00
+1 1
+6 m_next
+ 0
+208.00 608.00
+208.00 618.00
+208.00 618.00
+208.00 618.00
+-1.00 -1.00
+1 1
+5 m_act
+ 3
+192.00 576.00
+192.00 576.00
+256.00 576.00
+256.00 576.00
+192.00 576.00
+-1.00 -1.00
+5 0
+0
+ 3
+64.00 400.00
+64.00 400.00
+128.00 400.00
+128.00 400.00
+64.00 400.00
+-1.00 -1.00
+5 0
+0
+ 0
+80.00 432.00
+80.00 442.00
+80.00 442.00
+80.00 442.00
+-1.00 -1.00
+1 1
+5 m_act
+ 0
+80.00 336.00
+80.00 346.00
+80.00 346.00
+80.00 346.00
+-1.00 -1.00
+1 1
+6 m_next
+ 3
+64.00 352.00
+64.00 352.00
+128.00 352.00
+128.00 352.00
+64.00 352.00
+-1.00 -1.00
+5 0
+0
+ 3
+64.00 416.00
+128.00 416.00
+-1.00 -1.00
+5 0
+0
+ 3
+64.00 448.00
+64.00 320.00
+128.00 320.00
+128.00 448.00
+64.00 448.00
+-1.00 -1.00
+5 0
+0
+ 3
+64.00 576.00
+64.00 576.00
+128.00 576.00
+128.00 576.00
+64.00 576.00
+-1.00 -1.00
+5 0
+0
+ 0
+80.00 608.00
+80.00 618.00
+80.00 618.00
+80.00 618.00
+-1.00 -1.00
+1 1
+5 m_act
+ 0
+80.00 512.00
+80.00 522.00
+80.00 522.00
+80.00 522.00
+-1.00 -1.00
+1 1
+6 m_next
+ 3
+64.00 528.00
+64.00 528.00
+128.00 528.00
+128.00 528.00
+64.00 528.00
+-1.00 -1.00
+5 0
+0
+ 3
+64.00 592.00
+128.00 592.00
+-1.00 -1.00
+5 0
+0
+ 3
+64.00 624.00
+64.00 496.00
+128.00 496.00
+128.00 624.00
+64.00 624.00
+-1.00 -1.00
+5 0
+0
+ 0
+74.00 401.00
+74.00 411.00
+74.00 411.00
+74.00 411.00
+-1.00 -1.00
+1 1
+6 MT_EOT
+ 0
+207.00 577.00
+207.00 587.00
+207.00 587.00
+207.00 587.00
+-1.00 -1.00
+1 1
+6 MT_EOT
+ 0
+446.00 575.00
+446.00 585.00
+446.00 585.00
+446.00 585.00
+-1.00 -1.00
+1 1
+6 MT_EOT
+ 3
+80.00 576.00
+80.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+72.00 576.00
+72.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+88.00 576.00
+88.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+96.00 576.00
+96.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+104.00 576.00
+104.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+112.00 576.00
+112.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+120.00 576.00
+120.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+80.00 400.00
+80.00 376.00
+-1.00 -1.00
+1 0
+0
+ 3
+72.00 400.00
+72.00 376.00
+-1.00 -1.00
+1 0
+0
+ 3
+88.00 400.00
+88.00 376.00
+-1.00 -1.00
+1 0
+0
+ 3
+96.00 400.00
+96.00 376.00
+-1.00 -1.00
+1 0
+0
+ 3
+104.00 400.00
+104.00 376.00
+-1.00 -1.00
+1 0
+0
+ 3
+112.00 400.00
+112.00 376.00
+-1.00 -1.00
+1 0
+0
+ 3
+120.00 400.00
+120.00 376.00
+-1.00 -1.00
+1 0
+0
+ 3
+336.00 552.00
+336.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+328.00 552.00
+328.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+344.00 552.00
+344.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+352.00 552.00
+352.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+360.00 552.00
+360.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+368.00 552.00
+368.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+376.00 552.00
+376.00 528.00
+-1.00 -1.00
+1 0
+0
+ 3
+336.00 400.00
+336.00 352.00
+-1.00 -1.00
+1 0
+0
+ 3
+328.00 400.00
+328.00 352.00
+-1.00 -1.00
+1 0
+0
+ 3
+344.00 400.00
+344.00 352.00
+-1.00 -1.00
+1 0
+0
+ 3
+352.00 400.00
+352.00 352.00
+-1.00 -1.00
+1 0
+0
+ 3
+360.00 400.00
+360.00 352.00
+-1.00 -1.00
+1 0
+0
+ 3
+368.00 400.00
+368.00 352.00
+-1.00 -1.00
+1 0
+0
+ 3
+376.00 400.00
+376.00 352.00
+-1.00 -1.00
+1 0
+0
+ 3
+328.00 208.00
+328.00 192.00
+-1.00 -1.00
+1 0
+0
+ 3
+336.00 208.00
+336.00 192.00
+-1.00 -1.00
+1 0
+0
+ 3
+352.00 208.00
+352.00 192.00
+-1.00 -1.00
+1 0
+0
+ 3
+344.00 208.00
+344.00 192.00
+-1.00 -1.00
+1 0
+0
+ 3
+360.00 208.00
+360.00 192.00
+-1.00 -1.00
+1 0
+0
+ 3
+368.00 208.00
+368.00 192.00
+-1.00 -1.00
+1 0
+0
+ 3
+376.00 208.00
+376.00 192.00
+-1.00 -1.00
+1 0
+0
+ 0
+64.00 640.00
+64.00 650.00
+64.00 650.00
+64.00 650.00
+-1.00 -1.00
+1 1
+10 first TSDU
+ 0
+192.00 640.00
+192.00 650.00
+192.00 650.00
+192.00 650.00
+-1.00 -1.00
+1 1
+11 second TSDU
+ 0
+320.00 640.00
+320.00 650.00
+320.00 650.00
+320.00 650.00
+-1.00 -1.00
+1 1
+9 last TSDU
+ 0
+64.00 688.00
+64.00 698.00
+64.00 698.00
+64.00 698.00
+-1.00 -1.00
+1 1
+16 so->so_rcv.sb_mb
+ 3
+48.00 704.00
+48.00 672.00
+160.00 672.00
+160.00 704.00
+48.00 704.00
+-1.00 -1.00
+5 0
+0
+ 3
+48.00 688.00
+32.00 688.00
+-1.00 -1.00
+5 0
+0
+ 3
+32.00 688.00
+32.00 608.00
+-1.00 -1.00
+5 0
+0
+ 3
+32.00 608.00
+64.00 608.00
+-1.00 -1.00
+5 0
+0
+ 3
+64.00 608.00
+59.00 605.00
+61.00 608.00
+59.00 611.00
+64.00 608.00
+-1.00 -1.00
+5 0
+0
+ -1
diff --git a/share/doc/iso/wisc/figs/mbufrcv.nr b/share/doc/iso/wisc/figs/mbufrcv.nr
new file mode 100644
index 0000000..af35c70
--- /dev/null
+++ b/share/doc/iso/wisc/figs/mbufrcv.nr
@@ -0,0 +1,504 @@
+.(z
+.br
+.nr g1 2880u
+.nr g2 3250u
+.GS C
+.nr g3 \n(.f
+.nr g4 \n(.s
+\0
+.sp -1
+\D't 1u'
+.sp -1
+.sp 557u
+\h'186u'\D'l -29u 18u'\D'l 12u -18u'\D'l -12u -17u'\D'l 29u 17u'
+.sp -1
+\D'l 186u 0u'
+.sp -1
+.sp -464u
+\D'l 0u 464u'
+.sp -1
+\h'93u'\D'l -93u 0u'
+.sp -1
+.sp -93u
+\h'93u'\D'l 0u 186u'\D'l 651u 0u'\D'l 0u -186u'\D'l -651u 0u'
+.sp -1
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "so->so_rcv.sb_mb
+.sp 93u
+\h'186u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "last TSDU
+.sp 371u
+\h'1673u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "second TSDU
+.sp 371u
+\h'929u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "first TSDU
+.sp 371u
+\h'186u'\&\*(g9
+.sp |\n(g8u
+\D's 4u'
+.sp -1
+.sp 2879u
+\h'1998u'\D'l 0u 93u'
+.sp -1
+\h'1951u'\D'l 0u 93u'
+.sp -1
+\h'1905u'\D'l 0u 93u'
+.sp -1
+\h'1812u'\D'l 0u 93u'
+.sp -1
+\h'1858u'\D'l 0u 93u'
+.sp -1
+\h'1765u'\D'l 0u 93u'
+.sp -1
+\h'1719u'\D'l 0u 93u'
+.sp -1
+.sp -1115u
+\h'1998u'\D'l 0u 279u'
+.sp -1
+\h'1951u'\D'l 0u 279u'
+.sp -1
+\h'1905u'\D'l 0u 279u'
+.sp -1
+\h'1858u'\D'l 0u 279u'
+.sp -1
+\h'1812u'\D'l 0u 279u'
+.sp -1
+\h'1719u'\D'l 0u 279u'
+.sp -1
+\h'1765u'\D'l 0u 279u'
+.sp -1
+.sp -882u
+\h'1998u'\D'l 0u 140u'
+.sp -1
+\h'1951u'\D'l 0u 140u'
+.sp -1
+\h'1905u'\D'l 0u 140u'
+.sp -1
+\h'1858u'\D'l 0u 140u'
+.sp -1
+\h'1812u'\D'l 0u 140u'
+.sp -1
+\h'1719u'\D'l 0u 140u'
+.sp -1
+\h'1765u'\D'l 0u 140u'
+.sp -1
+.sp 882u
+\h'511u'\D'l 0u 139u'
+.sp -1
+\h'465u'\D'l 0u 139u'
+.sp -1
+\h'418u'\D'l 0u 139u'
+.sp -1
+\h'372u'\D'l 0u 139u'
+.sp -1
+\h'325u'\D'l 0u 139u'
+.sp -1
+\h'233u'\D'l 0u 139u'
+.sp -1
+\h'279u'\D'l 0u 139u'
+.sp -1
+.sp -1021u
+\h'511u'\D'l 0u 279u'
+.sp -1
+\h'465u'\D'l 0u 279u'
+.sp -1
+\h'418u'\D'l 0u 279u'
+.sp -1
+\h'372u'\D'l 0u 279u'
+.sp -1
+\h'325u'\D'l 0u 279u'
+.sp -1
+\h'233u'\D'l 0u 279u'
+.sp -1
+\h'279u'\D'l 0u 279u'
+.sp -1
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "MT_EOT
+.sp 6u
+\h'2404u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "MT_EOT
+.sp -6u
+\h'1016u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "MT_EOT
+.sp 1015u
+\h'244u'\&\*(g9
+.sp |\n(g8u
+\D's -1u'
+.sp -1
+.sp -279u
+\h'186u'\D'l 0u 743u'\D'l 372u 0u'\D'l 0u -743u'\D'l -372u 0u'
+.sp -1
+.sp 186u
+\h'186u'\D'l 372u 0u'
+.sp -1
+.sp 372u
+\h'186u'\D'l 0u 0u'\D'l 372u 0u'\D'l 0u 0u'\D'l -372u 0u'
+.sp -1
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_next
+.sp 93u
+\h'279u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_act
+.sp -465u
+\h'279u'\&\*(g9
+.sp |\n(g8u
+.sp -279u
+\h'186u'\D'l 0u 0u'\D'l 372u 0u'\D'l 0u 0u'\D'l -372u 0u'
+.sp -1
+.sp 742u
+\h'186u'\D'l 0u 744u'\D'l 372u 0u'\D'l 0u -744u'\D'l -372u 0u'
+.sp -1
+.sp 186u
+\h'186u'\D'l 372u 0u'
+.sp -1
+.sp 372u
+\h'186u'\D'l 0u 0u'\D'l 372u 0u'\D'l 0u 0u'\D'l -372u 0u'
+.sp -1
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_next
+.sp 93u
+\h'279u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_act
+.sp -465u
+\h'279u'\&\*(g9
+.sp |\n(g8u
+.sp -279u
+\h'186u'\D'l 0u 0u'\D'l 372u 0u'\D'l 0u 0u'\D'l -372u 0u'
+.sp -1
+.sp -1021u
+\h'929u'\D'l 0u 0u'\D'l 372u 0u'\D'l 0u 0u'\D'l -372u 0u'
+.sp -1
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_act
+.sp -186u
+\h'1022u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_next
+.sp 372u
+\h'1022u'\&\*(g9
+.sp |\n(g8u
+.sp 279u
+\h'929u'\D'l 0u 0u'\D'l 372u 0u'\D'l 0u 0u'\D'l -372u 0u'
+.sp -1
+.sp -372u
+\h'929u'\D'l 372u 0u'
+.sp -1
+.sp -186u
+\h'929u'\D'l 0u 743u'\D'l 372u 0u'\D'l 0u -743u'\D'l -372u 0u'
+.sp -1
+\h'1673u'\D'l 0u 743u'\D'l 371u 0u'\D'l 0u -743u'\D'l -371u 0u'
+.sp -1
+.sp 186u
+\h'1673u'\D'l 371u 0u'
+.sp -1
+.sp 372u
+\h'1673u'\D'l 0u 0u'\D'l 371u 0u'\D'l 0u 0u'\D'l -371u 0u'
+.sp -1
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_next
+.sp 93u
+\h'1765u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_act
+.sp -465u
+\h'1765u'\&\*(g9
+.sp |\n(g8u
+.sp -279u
+\h'1673u'\D'l 0u 0u'\D'l 371u 0u'\D'l 0u 0u'\D'l -371u 0u'
+.sp -1
+.sp 1021u
+\h'1673u'\D'l 0u 0u'\D'l 371u 0u'\D'l 0u 0u'\D'l -371u 0u'
+.sp -1
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_act
+.sp -186u
+\h'1765u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_next
+.sp 372u
+\h'1765u'\&\*(g9
+.sp |\n(g8u
+.sp 279u
+\h'1673u'\D'l 0u 0u'\D'l 371u 0u'\D'l 0u 0u'\D'l -371u 0u'
+.sp -1
+.sp -372u
+\h'1673u'\D'l 371u 0u'
+.sp -1
+.sp -186u
+\h'1673u'\D'l 0u 744u'\D'l 371u 0u'\D'l 0u -744u'\D'l -371u 0u'
+.sp -1
+.sp 1022u
+\h'1673u'\D'l 0u 743u'\D'l 371u 0u'\D'l 0u -743u'\D'l -371u 0u'
+.sp -1
+.sp 186u
+\h'1673u'\D'l 371u 0u'
+.sp -1
+.sp 372u
+\h'1673u'\D'l 0u 0u'\D'l 371u 0u'\D'l 0u 0u'\D'l -371u 0u'
+.sp -1
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_next
+.sp 93u
+\h'1765u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_act
+.sp -465u
+\h'1765u'\&\*(g9
+.sp |\n(g8u
+.sp -279u
+\h'1673u'\D'l 0u 0u'\D'l 371u 0u'\D'l 0u 0u'\D'l -371u 0u'
+.sp -1
+.sp -2043u
+\h'2323u'\D'l 0u 0u'\D'l 372u 0u'\D'l 0u 0u'\D'l -372u 0u'
+.sp -1
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_act
+.sp -186u
+\h'2416u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "m_next
+.sp 372u
+\h'2416u'\&\*(g9
+.sp |\n(g8u
+.sp 279u
+\h'2323u'\D'l 0u 0u'\D'l 372u 0u'\D'l 0u 0u'\D'l -372u 0u'
+.sp -1
+.sp -372u
+\h'2323u'\D'l 372u 0u'
+.sp -1
+.sp -186u
+\h'2323u'\D'l 0u 743u'\D'l 372u 0u'\D'l 0u -743u'\D'l -372u 0u'
+.sp -1
+.sp 93u
+\h'558u'\D'l 371u 0u'
+.sp -1
+\h'1301u'\D'l 372u 0u'
+.sp -1
+\h'929u'\D'l -29u 18u'\D'l 12u -18u'\D'l -12u -17u'\D'l 29u 17u'
+.sp -1
+\h'1673u'\D'l -29u 18u'\D'l 11u -18u'\D'l -11u -17u'\D'l 29u 17u'
+.sp -1
+\h'2044u'\D'l 279u 0u'
+.sp -1
+\h'2323u'\D'l -29u 18u'\D'l 11u -18u'\D'l -11u -17u'\D'l 29u 17u'
+.sp -1
+.sp 558u
+\h'558u'\D'l 186u 0u'
+.sp -1
+\h'2044u'\D'l 186u 0u'
+.sp -1
+\h'744u'\D'l 0u 277u'
+.sp -1
+.sp 277u
+\h'744u'\D'l -372u 0u'
+.sp -1
+\h'372u'\D'l 0u 93u'
+.sp -1
+.sp 93u
+\h'372u'\D'l -17u -29u'\D'l 17u 12u'\D'l 17u -12u'\D'l -17u 29u'
+.sp -1
+.sp -370u
+\h'2230u'\D'l 0u 277u'
+.sp -1
+.sp 277u
+\h'2230u'\D'l -372u 0u'
+.sp -1
+\h'1858u'\D'l 0u 93u'
+.sp -1
+.sp 93u
+\h'1858u'\D'l -17u -29u'\D'l 17u 12u'\D'l 18u -12u'\D'l -18u 29u'
+.sp -1
+.sp 651u
+\h'2044u'\D'l 186u 0u'
+.sp -1
+\h'2230u'\D'l 0u 278u'
+.sp -1
+.sp 278u
+\h'2230u'\D'l -372u 0u'
+.sp -1
+\h'1858u'\D'l 0u 93u'
+.sp -1
+.sp 93u
+\h'1858u'\D'l -17u -29u'\D'l 17u 12u'\D'l 18u -12u'\D'l -18u 29u'
+.sp -1
+.sp -1950u
+\h'2695u'\D'l 92u 0u'
+.sp -1
+.sp -93u
+\h'2787u'\D'l 0u 186u'
+.sp -1
+\h'2880u'\D'l 0u 186u'
+.sp -1
+.sp 558u
+\h'1487u'\D'l 0u 185u'
+.sp -1
+\h'1580u'\D'l 0u 185u'
+.sp -1
+.sp 2136u
+\h'2044u'\D'l 186u 0u'
+.sp -1
+.sp -93u
+\h'2230u'\D'l 0u 185u'
+.sp -1
+\h'2323u'\D'l 0u 185u'
+.sp -1
+.sp -1858u
+\h'1487u'\D'l 93u -185u'
+.sp -1
+.sp -557u
+\h'2787u'\D'l 93u -186u'
+.sp -1
+.sp 2600u
+\h'2230u'\D'l 93u -185u'
+.sp -1
+.sp -1114u
+\h'558u'\D'l 186u 0u'
+.sp -1
+.sp -93u
+\h'744u'\D'l 0u 186u'
+.sp -1
+\h'836u'\D'l 0u 186u'
+.sp -1
+.sp 186u
+\h'744u'\D'l 92u -186u'
+.sp -1
+.sp -1114u
+\h'2695u'\D'l 92u 0u'
+.sp -1
+.sp -93u
+\h'2787u'\D'l 0u 185u'\D'l 93u -185u'\D'l 0u 185u'
+.sp -1
+.sp 93u
+\h'1301u'\D'l 186u 0u'
+.sp -1
+.sp 556u
+\h'744u'\D'l 92u -186u'
+.sp -1
+.sp -186u
+\h'836u'\D'l 0u 186u'
+.sp -1
+\h'744u'\D'l 0u 186u'
+.sp -1
+.sp 93u
+\h'558u'\D'l 186u 0u'
+.sp -1
+\h'2044u'\D'l 186u 0u'
+.sp -1
+.sp -93u
+\h'2230u'\D'l 0u 186u'
+.sp -1
+\h'2323u'\D'l 0u 186u'
+.sp -1
+.sp 186u
+\h'2230u'\D'l 93u -186u'
+.sp -1
+.sp 1022u
+\h'2230u'\D'l 93u -186u'
+.sp -1
+.sp -186u
+\h'2323u'\D'l 0u 186u'
+.sp -1
+\h'2230u'\D'l 0u 186u'
+.sp -1
+.sp 93u
+\h'2044u'\D'l 186u 0u'
+.sp -1
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "MT_DATA
+.sp -1857u
+\h'233u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "MT_DATA
+.sp -1857u
+\h'1719u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "MT_DATA
+.sp -836u
+\h'1719u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 5
+.nr g8 \n(.d
+.ds g9 "MT_DATA
+.sp 186u
+\h'1719u'\&\*(g9
+.sp |\n(g8u
+.sp 650u
+\D't 3u'\D's -1u'
+.br
+.ft \n(g3
+.ps \n(g4
+.GE
+.ce
+\fB Figure \n+(FG\fR: \fImbuf\fR chains on socket receive buffer
+.)z
diff --git a/share/doc/iso/wisc/figs/mbufsnd.grn b/share/doc/iso/wisc/figs/mbufsnd.grn
new file mode 100644
index 0000000..9b7ac5e
--- /dev/null
+++ b/share/doc/iso/wisc/figs/mbufsnd.grn
@@ -0,0 +1,13 @@
+.(z
+.GS C
+width 5.0
+high 6.0
+narrow 1
+medium 3
+thick 7
+pointscale on
+file mbufsnd.gsrc
+.GE
+.ce
+\fB Figure \n+(FG\fR: \fImbuf\fR chains on socket send buffer
+.)z
diff --git a/share/doc/iso/wisc/figs/mbufsnd.gsrc b/share/doc/iso/wisc/figs/mbufsnd.gsrc
new file mode 100644
index 0000000..8e2f0a8
--- /dev/null
+++ b/share/doc/iso/wisc/figs/mbufsnd.gsrc
@@ -0,0 +1,534 @@
+gremlinfile
+0 124.00 410.00
+0
+124.00 310.00
+124.00 320.00
+124.00 320.00
+124.00 320.00
+-1.00 -1.00
+1 1
+12 == user data
+ 3
+71.00 343.00
+71.00 295.00
+-1.00 -1.00
+1 0
+0
+ 3
+79.00 343.00
+79.00 295.00
+-1.00 -1.00
+1 0
+0
+ 3
+87.00 343.00
+87.00 295.00
+-1.00 -1.00
+1 0
+0
+ 3
+95.00 343.00
+95.00 295.00
+-1.00 -1.00
+1 0
+0
+ 3
+103.00 343.00
+103.00 295.00
+-1.00 -1.00
+1 0
+0
+ 3
+111.00 343.00
+111.00 295.00
+-1.00 -1.00
+1 0
+0
+ 3
+119.00 343.00
+119.00 295.00
+-1.00 -1.00
+1 0
+0
+ 3
+160.00 688.00
+256.00 688.00
+160.00 688.00
+256.00 688.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 512.00
+352.00 512.00
+-1.00 -1.00
+5 0
+0
+ 3
+352.00 528.00
+352.00 496.00
+368.00 528.00
+368.00 496.00
+-1.00 -1.00
+5 0
+0
+ 0
+264.00 656.00
+264.00 666.00
+264.00 666.00
+264.00 666.00
+-1.00 -1.00
+1 1
+7 MT_DATA
+ 3
+256.00 480.00
+320.00 480.00
+-1.00 -1.00
+5 0
+0
+ 0
+272.00 480.00
+272.00 490.00
+272.00 490.00
+272.00 490.00
+-1.00 -1.00
+1 1
+6 MT_XPD
+ 3
+312.00 304.00
+312.00 256.00
+-1.00 -1.00
+1 0
+0
+ 3
+304.00 304.00
+304.00 256.00
+-1.00 -1.00
+1 0
+0
+ 3
+296.00 304.00
+296.00 256.00
+-1.00 -1.00
+1 0
+0
+ 3
+288.00 304.00
+288.00 256.00
+-1.00 -1.00
+1 0
+0
+ 3
+280.00 304.00
+280.00 256.00
+-1.00 -1.00
+1 0
+0
+ 3
+264.00 304.00
+264.00 256.00
+-1.00 -1.00
+1 0
+0
+ 3
+272.00 304.00
+272.00 256.00
+-1.00 -1.00
+1 0
+0
+ 3
+256.00 304.00
+256.00 304.00
+320.00 304.00
+320.00 304.00
+256.00 304.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 256.00
+256.00 256.00
+320.00 256.00
+320.00 256.00
+256.00 256.00
+-1.00 -1.00
+5 0
+0
+ 3
+288.00 352.00
+285.00 357.00
+288.00 355.00
+291.00 357.00
+288.00 352.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 416.00
+352.00 416.00
+-1.00 -1.00
+5 0
+0
+ 3
+352.00 416.00
+352.00 368.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 352.00
+256.00 224.00
+320.00 224.00
+320.00 352.00
+256.00 352.00
+-1.00 -1.00
+5 0
+0
+ 3
+352.00 368.00
+288.00 368.00
+-1.00 -1.00
+5 0
+0
+ 3
+288.00 368.00
+288.00 352.00
+-1.00 -1.00
+5 0
+0
+ 3
+352.00 704.00
+352.00 672.00
+368.00 704.00
+368.00 672.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 688.00
+352.00 688.00
+-1.00 -1.00
+5 0
+0
+ 0
+64.00 688.00
+64.00 698.00
+64.00 698.00
+64.00 698.00
+-1.00 -1.00
+1 1
+16 so->so_snd.sb_mb
+ 3
+256.00 688.00
+251.00 685.00
+253.00 688.00
+251.00 691.00
+256.00 688.00
+-1.00 -1.00
+5 0
+0
+ 3
+48.00 704.00
+48.00 672.00
+160.00 672.00
+160.00 704.00
+48.00 704.00
+-1.00 -1.00
+5 0
+0
+ 3
+312.00 656.00
+312.00 608.00
+-1.00 -1.00
+1 0
+0
+ 3
+304.00 656.00
+304.00 608.00
+-1.00 -1.00
+1 0
+0
+ 3
+296.00 656.00
+296.00 608.00
+-1.00 -1.00
+1 0
+0
+ 3
+288.00 656.00
+288.00 608.00
+-1.00 -1.00
+1 0
+0
+ 3
+280.00 656.00
+280.00 608.00
+-1.00 -1.00
+1 0
+0
+ 3
+264.00 656.00
+264.00 608.00
+-1.00 -1.00
+1 0
+0
+ 3
+272.00 656.00
+272.00 608.00
+-1.00 -1.00
+1 0
+0
+ 0
+271.00 305.00
+271.00 315.00
+271.00 315.00
+271.00 315.00
+-1.00 -1.00
+1 1
+6 MT_EOT
+ 3
+256.00 704.00
+256.00 576.00
+320.00 576.00
+320.00 704.00
+256.00 704.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 672.00
+320.00 672.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 608.00
+256.00 608.00
+320.00 608.00
+320.00 608.00
+256.00 608.00
+-1.00 -1.00
+5 0
+0
+ 0
+272.00 592.00
+272.00 602.00
+272.00 602.00
+272.00 602.00
+-1.00 -1.00
+1 1
+6 m_next
+ 0
+272.00 688.00
+272.00 698.00
+272.00 698.00
+272.00 698.00
+-1.00 -1.00
+1 1
+5 m_act
+ 3
+256.00 656.00
+256.00 656.00
+320.00 656.00
+320.00 656.00
+256.00 656.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 528.00
+256.00 400.00
+320.00 400.00
+320.00 528.00
+256.00 528.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 496.00
+320.00 496.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 432.00
+256.00 432.00
+320.00 432.00
+320.00 432.00
+256.00 432.00
+-1.00 -1.00
+5 0
+0
+ 0
+272.00 416.00
+272.00 426.00
+272.00 426.00
+272.00 426.00
+-1.00 -1.00
+1 1
+6 m_next
+ 0
+272.00 512.00
+272.00 522.00
+272.00 522.00
+272.00 522.00
+-1.00 -1.00
+1 1
+5 m_act
+ 3
+256.00 304.00
+256.00 304.00
+320.00 304.00
+320.00 304.00
+256.00 304.00
+-1.00 -1.00
+5 0
+0
+ 0
+272.00 336.00
+272.00 346.00
+272.00 346.00
+272.00 346.00
+-1.00 -1.00
+1 1
+5 m_act
+ 0
+272.00 240.00
+272.00 250.00
+272.00 250.00
+272.00 250.00
+-1.00 -1.00
+1 1
+6 m_next
+ 3
+256.00 256.00
+256.00 256.00
+320.00 256.00
+320.00 256.00
+256.00 256.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 320.00
+320.00 320.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 352.00
+256.00 224.00
+320.00 224.00
+320.00 352.00
+256.00 352.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 592.00
+352.00 592.00
+-1.00 -1.00
+5 0
+0
+ 3
+352.00 592.00
+352.00 544.00
+-1.00 -1.00
+5 0
+0
+ 3
+352.00 544.00
+288.00 544.00
+-1.00 -1.00
+5 0
+0
+ 3
+288.00 544.00
+288.00 528.00
+-1.00 -1.00
+5 0
+0
+ 3
+288.00 528.00
+285.00 533.00
+288.00 531.00
+291.00 533.00
+288.00 528.00
+-1.00 -1.00
+5 0
+0
+ 3
+320.00 240.00
+352.00 240.00
+-1.00 -1.00
+5 0
+0
+ 3
+352.00 256.00
+352.00 224.00
+-1.00 -1.00
+5 0
+0
+ 3
+368.00 256.00
+368.00 224.00
+-1.00 -1.00
+5 0
+0
+ 3
+352.00 224.00
+368.00 256.00
+-1.00 -1.00
+5 0
+0
+ 3
+288.00 472.00
+288.00 464.00
+-1.00 -1.00
+5 0
+0
+ 0
+72.00 480.00
+72.00 490.00
+72.00 490.00
+72.00 490.00
+-1.00 -1.00
+1 1
+13 tpcb->tp_Xuna
+ 0
+72.00 464.00
+72.00 474.00
+72.00 474.00
+72.00 474.00
+-1.00 -1.00
+1 1
+18 sequence number of
+ 0
+72.00 448.00
+72.00 458.00
+72.00 458.00
+72.00 458.00
+-1.00 -1.00
+1 1
+8 XPD TPDU
+ 3
+288.00 464.00
+208.00 456.00
+-1.00 -1.00
+5 0
+0
+ 3
+288.00 472.00
+208.00 480.00
+208.00 480.00
+-1.00 -1.00
+5 0
+0
+ 3
+208.00 488.00
+184.00 472.00
+208.00 448.00
+-1.00 -1.00
+5 0
+0
+ -1
diff --git a/share/doc/iso/wisc/figs/mbufsnd.nr b/share/doc/iso/wisc/figs/mbufsnd.nr
new file mode 100644
index 0000000..4b38574
--- /dev/null
+++ b/share/doc/iso/wisc/figs/mbufsnd.nr
@@ -0,0 +1,284 @@
+.(z
+.br
+.nr g1 2304u
+.nr g2 3455u
+.GS C
+.nr g3 \n(.f
+.nr g4 \n(.s
+\0
+.sp -1
+\D't 1u'
+.sp -1
+.sp 1554u
+\h'1152u'\D'l -173u 115u'\D'l 173u 173u'
+.sp -1
+.sp 115u
+\h'1728u'\D'l -576u -57u'\D'l 0u 0u'
+.sp -1
+.sp 58u
+\h'1728u'\D'l -576u 57u'
+.sp -1
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "XPD TPDU
+.sp 115u
+\h'173u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "sequence number of
+\h'173u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "tpcb->tp_Xuna
+.sp -115u
+\h'173u'\&\*(g9
+.sp |\n(g8u
+.sp -58u
+\h'1728u'\D'l 0u 58u'
+.sp -1
+.sp 1786u
+\h'2189u'\D'l 115u -231u'
+.sp -1
+.sp -231u
+\h'2304u'\D'l 0u 231u'
+.sp -1
+\h'2189u'\D'l 0u 231u'
+.sp -1
+.sp 116u
+\h'1959u'\D'l 230u 0u'
+.sp -1
+.sp -2073u
+\h'1728u'\D'l -21u -36u'\D'l 21u 14u'\D'l 22u -14u'\D'l -22u 36u'
+.sp -1
+.sp -115u
+\h'1728u'\D'l 0u 115u'
+.sp -1
+\h'2189u'\D'l -461u 0u'
+.sp -1
+.sp -346u
+\h'2189u'\D'l 0u 346u'
+.sp -1
+\h'1959u'\D'l 230u 0u'
+.sp -1
+.sp 1727u
+\h'1498u'\D'l 0u 922u'\D'l 461u 0u'\D'l 0u -922u'\D'l -461u 0u'
+.sp -1
+.sp 231u
+\h'1498u'\D'l 461u 0u'
+.sp -1
+.sp 460u
+\h'1498u'\D'l 0u 0u'\D'l 461u 0u'\D'l 0u 0u'\D'l -461u 0u'
+.sp -1
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "m_next
+.sp 116u
+\h'1613u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "m_act
+.sp -576u
+\h'1613u'\&\*(g9
+.sp |\n(g8u
+.sp -345u
+\h'1498u'\D'l 0u 0u'\D'l 461u 0u'\D'l 0u 0u'\D'l -461u 0u'
+.sp -1
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "m_act
+.sp -1497u
+\h'1613u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "m_next
+.sp -807u
+\h'1613u'\&\*(g9
+.sp |\n(g8u
+.sp -922u
+\h'1498u'\D'l 0u 0u'\D'l 461u 0u'\D'l 0u 0u'\D'l -461u 0u'
+.sp -1
+.sp -461u
+\h'1498u'\D'l 461u 0u'
+.sp -1
+.sp -229u
+\h'1498u'\D'l 0u 921u'\D'l 461u 0u'\D'l 0u -921u'\D'l -461u 0u'
+.sp -1
+.sp -922u
+\h'1498u'\D'l 0u 0u'\D'l 461u 0u'\D'l 0u 0u'\D'l -461u 0u'
+.sp -1
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "m_act
+.sp -230u
+\h'1613u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "m_next
+.sp 461u
+\h'1613u'\&\*(g9
+.sp |\n(g8u
+.sp 346u
+\h'1498u'\D'l 0u 0u'\D'l 461u 0u'\D'l 0u 0u'\D'l -461u 0u'
+.sp -1
+.sp -461u
+\h'1498u'\D'l 461u 0u'
+.sp -1
+.sp -230u
+\h'1498u'\D'l 0u 922u'\D'l 461u 0u'\D'l 0u -922u'\D'l -461u 0u'
+.sp -1
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "MT_EOT
+.sp 2872u
+\h'1606u'\&\*(g9
+.sp |\n(g8u
+\D's 4u'
+.sp -1
+.sp 345u
+\h'1613u'\D'l 0u 346u'
+.sp -1
+\h'1555u'\D'l 0u 346u'
+.sp -1
+\h'1670u'\D'l 0u 346u'
+.sp -1
+\h'1728u'\D'l 0u 346u'
+.sp -1
+\h'1786u'\D'l 0u 346u'
+.sp -1
+\h'1843u'\D'l 0u 346u'
+.sp -1
+\h'1901u'\D'l 0u 346u'
+.sp -1
+\D's -1u'
+.sp -1
+.sp -345u
+\D'l 0u 230u'\D'l 807u 0u'\D'l 0u -230u'\D'l -807u 0u'
+.sp -1
+.sp 115u
+\h'1498u'\D'l -36u 22u'\D'l 14u -22u'\D'l -14u -21u'\D'l 36u 21u'
+.sp -1
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "so->so_snd.sb_mb
+\h'115u'\&\*(g9
+.sp |\n(g8u
+\h'1959u'\D'l 230u 0u'
+.sp -1
+.sp -115u
+\h'2189u'\D'l 0u 230u'\D'l 115u -230u'\D'l 0u 230u'
+.sp -1
+.sp 2418u
+\h'1728u'\D'l 0u 115u'
+.sp -1
+\h'2189u'\D'l -461u 0u'
+.sp -1
+.sp 115u
+\h'1498u'\D'l 0u 922u'\D'l 461u 0u'\D'l 0u -922u'\D'l -461u 0u'
+.sp -1
+.sp -461u
+\h'2189u'\D'l 0u 346u'
+.sp -1
+\h'1959u'\D'l 230u 0u'
+.sp -1
+.sp 461u
+\h'1728u'\D'l -21u -36u'\D'l 21u 15u'\D'l 22u -15u'\D'l -22u 36u'
+.sp -1
+.sp 691u
+\h'1498u'\D'l 0u 0u'\D'l 461u 0u'\D'l 0u 0u'\D'l -461u 0u'
+.sp -1
+.sp -345u
+\h'1498u'\D'l 0u 0u'\D'l 461u 0u'\D'l 0u 0u'\D'l -461u 0u'
+.sp -1
+\D's 4u'
+.sp -1
+\h'1613u'\D'l 0u 345u'
+.sp -1
+\h'1555u'\D'l 0u 345u'
+.sp -1
+\h'1670u'\D'l 0u 345u'
+.sp -1
+\h'1728u'\D'l 0u 345u'
+.sp -1
+\h'1786u'\D'l 0u 345u'
+.sp -1
+\h'1843u'\D'l 0u 345u'
+.sp -1
+\h'1901u'\D'l 0u 345u'
+.sp -1
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "MT_XPD
+.sp -1267u
+\h'1613u'\&\*(g9
+.sp |\n(g8u
+\D's -1u'
+.sp -1
+.sp -1267u
+\h'1498u'\D'l 461u 0u'
+.sp -1
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "MT_DATA
+.sp -1267u
+\h'1555u'\&\*(g9
+.sp |\n(g8u
+.sp -345u
+\h'2189u'\D'l 0u 229u'\D'l 115u -229u'\D'l 0u 229u'
+.sp -1
+.sp 115u
+\h'1959u'\D'l 230u 0u'
+.sp -1
+.sp -1267u
+\h'807u'\D'l 691u 0u'\D'l -691u 0u'\D'l 691u 0u'
+.sp -1
+\D's 4u'
+.sp -1
+.sp 2483u
+\h'511u'\D'l 0u 346u'
+.sp -1
+\h'454u'\D'l 0u 346u'
+.sp -1
+\h'396u'\D'l 0u 346u'
+.sp -1
+\h'338u'\D'l 0u 346u'
+.sp -1
+\h'281u'\D'l 0u 346u'
+.sp -1
+\h'223u'\D'l 0u 346u'
+.sp -1
+\h'166u'\D'l 0u 346u'
+.sp -1
+.ft R
+.ps 6
+.nr g8 \n(.d
+.ds g9 "== user data
+.sp 238u
+\h'547u'\&\*(g9
+.sp |\n(g8u
+.sp 857u
+\D't 3u'\D's -1u'
+.br
+.ft \n(g3
+.ps \n(g4
+.GE
+.ce
+\fB Figure \n+(FG\fR: \fImbuf\fR chains on socket send buffer
+.)z
diff --git a/share/doc/iso/wisc/figs/osi_addr.grn b/share/doc/iso/wisc/figs/osi_addr.grn
new file mode 100644
index 0000000..333260b
--- /dev/null
+++ b/share/doc/iso/wisc/figs/osi_addr.grn
@@ -0,0 +1,18 @@
+.(z
+.GS C
+width 6.0
+high 7.0
+1 8
+2 10
+3 12
+4 14
+sc 0.4
+narrow 1
+medium 3
+thick 7
+pointscale off
+file osi_addr.gsrc
+.GE
+.ce
+\fB Figure \n+(FG\fR: Format of OSI addresses
+.)z
diff --git a/share/doc/iso/wisc/figs/osi_addr.gsrc b/share/doc/iso/wisc/figs/osi_addr.gsrc
new file mode 100644
index 0000000..0a69b96
--- /dev/null
+++ b/share/doc/iso/wisc/figs/osi_addr.gsrc
@@ -0,0 +1,62 @@
+gremlinfile
+0 87.01 78.31
+3
+87.01 641.69
+87.01 567.61
+349.25 567.61
+349.25 641.69
+87.01 641.69
+-1.00 -1.00
+5 0
+0
+ 0
+138.15 617.43
+138.15 636.43
+138.15 636.43
+138.15 636.43
+-1.00 -1.00
+1 4
+3 IDP
+ 3
+212.23 641.69
+212.23 567.61
+-1.00 -1.00
+5 0
+0
+ 3
+87.01 609.57
+212.23 609.57
+-1.00 -1.00
+5 0
+0
+ 0
+98.81 585.31
+98.81 604.31
+98.81 604.31
+98.81 604.31
+-1.00 -1.00
+1 4
+3 AFI
+ 3
+149.29 610.22
+149.29 567.61
+-1.00 -1.00
+5 0
+0
+ 0
+170.27 586.62
+170.27 605.62
+170.27 605.62
+170.27 605.62
+-1.00 -1.00
+1 4
+3 IDI
+ 0
+271.23 598.42
+271.23 617.42
+271.23 617.42
+271.23 617.42
+-1.00 -1.00
+1 4
+3 DSP
+ -1
diff --git a/share/doc/iso/wisc/figs/osi_addr.nr b/share/doc/iso/wisc/figs/osi_addr.nr
new file mode 100644
index 0000000..f4c88fa
--- /dev/null
+++ b/share/doc/iso/wisc/figs/osi_addr.nr
@@ -0,0 +1,59 @@
+.(z
+.br
+.nr g1 3456u
+.nr g2 1722u
+.GS C
+.nr g3 \n(.f
+.nr g4 \n(.s
+\0
+.sp -1
+.ft R
+.ps 14
+.nr g8 \n(.d
+.ds g9 "DSP
+.sp 570u
+\h'2428u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 14
+.nr g8 \n(.d
+.ds g9 "IDI
+.sp 726u
+\h'1097u'\&\*(g9
+.sp |\n(g8u
+\D't 1u'
+.sp -1
+.sp 415u
+\h'821u'\D'l 0u 561u'
+.sp -1
+.ft R
+.ps 14
+.nr g8 \n(.d
+.ds g9 "AFI
+.sp 328u
+\h'156u'\&\*(g9
+.sp |\n(g8u
+.sp 8u
+\D'l 1650u 0u'
+.sp -1
+.sp -423u
+\h'1650u'\D'l 0u 976u'
+.sp -1
+.ft R
+.ps 14
+.nr g8 \n(.d
+.ds g9 "IDP
+.sp 320u
+\h'674u'\&\*(g9
+.sp |\n(g8u
+\D'l 0u 976u'\D'l 3456u 0u'\D'l 0u -976u'\D'l -3456u 0u'
+.sp -1
+.sp 1722u
+\D't 3u'\D's -1u'
+.br
+.ft \n(g3
+.ps \n(g4
+.GE
+.ce
+\fB Figure \n+(FG\fR: Format of OSI addresses
+.)z
diff --git a/share/doc/iso/wisc/figs/tppt.grn b/share/doc/iso/wisc/figs/tppt.grn
new file mode 100644
index 0000000..649c3d9
--- /dev/null
+++ b/share/doc/iso/wisc/figs/tppt.grn
@@ -0,0 +1,18 @@
+.(z
+.GS C
+width 6.0
+high 7.0
+1 8
+2 10
+3 12
+4 14
+sc 0.4
+narrow 1
+medium 3
+thick 7
+pointscale off
+file tppt.gsrc
+.GE
+.ce
+\fB Figure \n+(FG\fR: Output of tppt(8)
+.)z
diff --git a/share/doc/iso/wisc/figs/tppt.gsrc b/share/doc/iso/wisc/figs/tppt.gsrc
new file mode 100644
index 0000000..5643940
--- /dev/null
+++ b/share/doc/iso/wisc/figs/tppt.gsrc
@@ -0,0 +1,411 @@
+gremlinfile
+0 352.00 352.00
+0
+352.00 368.00
+352.00 381.00
+352.00 381.00
+352.00 381.00
+-1.00 -1.00
+2 2
+17 this is a CR TPDU
+ 3
+256.00 384.00
+256.00 400.00
+368.00 400.00
+368.00 384.00
+256.00 384.00
+-1.00 -1.00
+5 0
+0
+ 0
+112.00 288.00
+112.00 302.00
+112.00 302.00
+112.00 302.00
+-1.00 -1.00
+1 3
+59 +12: 0x02 0x00 0x07 0xc0 20: 0x01 0x08 0x00 0x00
+ 0
+112.00 304.00
+112.00 318.00
+112.00 318.00
+112.00 318.00
+-1.00 -1.00
+1 3
+59 + 8: 0x06 0x74 0x70 0x70 12: 0x69 0x6e 0xc7 0xc2
+ 0
+112.00 320.00
+112.00 334.00
+112.00 334.00
+112.00 334.00
+-1.00 -1.00
+1 3
+59 + 0: 0x15 0xe0 0x00 0x00 4: 0x00 0x03 0x00 0xc1
+ 0
+160.00 208.00
+160.00 221.00
+160.00 221.00
+160.00 221.00
+-1.00 -1.00
+2 2
+17 class and options
+ 3
+112.00 208.00
+144.00 208.00
+-1.00 -1.00
+6 0
+0
+ 3
+336.00 320.00
+368.00 320.00
+-1.00 -1.00
+6 0
+0
+ 3
+80.00 352.00
+75.00 349.00
+77.00 352.00
+75.00 355.00
+80.00 352.00
+-1.00 -1.00
+5 0
+0
+ 3
+96.00 288.00
+91.00 285.00
+93.00 288.00
+91.00 291.00
+96.00 288.00
+-1.00 -1.00
+5 0
+0
+ 3
+96.00 288.00
+48.00 288.00
+48.00 240.00
+96.00 240.00
+-1.00 -1.00
+5 0
+0
+ 0
+336.00 432.00
+336.00 445.00
+336.00 445.00
+336.00 445.00
+-1.00 -1.00
+2 2
+22 indicates a TPDU event
+ 0
+48.00 448.00
+48.00 461.00
+48.00 461.00
+48.00 461.00
+-1.00 -1.00
+2 2
+18 TPDU was received;
+ 0
+128.00 448.00
+128.00 461.00
+128.00 461.00
+128.00 461.00
+-1.00 -1.00
+2 2
+28 its total length is 22 bytes
+ 0
+48.00 432.00
+48.00 445.00
+48.00 445.00
+48.00 445.00
+-1.00 -1.00
+2 2
+26 and its header is 22 bytes
+ 0
+48.00 416.00
+48.00 429.00
+48.00 429.00
+48.00 429.00
+-1.00 -1.00
+2 2
+15 (21 in the LI +
+ 0
+112.00 416.00
+112.00 429.00
+112.00 429.00
+112.00 429.00
+-1.00 -1.00
+2 2
+13 1 for the LI)
+ 3
+112.00 240.00
+144.00 240.00
+-1.00 -1.00
+1 0
+0
+ 0
+160.00 240.00
+160.00 253.00
+160.00 253.00
+160.00 253.00
+-1.00 -1.00
+2 2
+2 LI
+ 3
+208.00 320.00
+336.00 320.00
+-1.00 -1.00
+2 0
+0
+ 3
+112.00 224.00
+144.00 224.00
+-1.00 -1.00
+2 0
+0
+ 0
+160.00 224.00
+160.00 237.00
+160.00 237.00
+160.00 237.00
+-1.00 -1.00
+2 2
+16 dst-ref, src-ref
+ 3
+304.00 240.00
+336.00 240.00
+-1.00 -1.00
+3 0
+0
+ 0
+352.00 240.00
+352.00 253.00
+352.00 253.00
+352.00 253.00
+-1.00 -1.00
+2 2
+26 calling transport selector
+ 3
+144.00 288.00
+224.00 288.00
+-1.00 -1.00
+4 0
+0
+ 3
+304.00 224.00
+336.00 224.00
+-1.00 -1.00
+4 0
+0
+ 0
+352.00 224.00
+352.00 237.00
+352.00 237.00
+352.00 237.00
+-1.00 -1.00
+2 2
+25 called transport selector
+ 3
+240.00 288.00
+336.00 288.00
+-1.00 -1.00
+5 0
+0
+ 3
+304.00 208.00
+336.00 208.00
+-1.00 -1.00
+5 0
+0
+ 0
+352.00 208.00
+352.00 221.00
+352.00 221.00
+352.00 221.00
+-1.00 -1.00
+2 2
+9 TPDU size
+ 3
+144.00 320.00
+192.00 320.00
+-1.00 -1.00
+1 0
+0
+ 0
+176.00 240.00
+176.00 253.00
+176.00 253.00
+176.00 253.00
+-1.00 -1.00
+2 2
+11 , TPDU type
+ 3
+400.00 432.00
+400.00 400.00
+-1.00 -1.00
+5 0
+0
+ 3
+400.00 400.00
+397.00 405.00
+400.00 403.00
+403.00 405.00
+400.00 400.00
+-1.00 -1.00
+5 0
+0
+ 3
+368.00 400.00
+368.00 384.00
+432.00 384.00
+432.00 400.00
+368.00 400.00
+-1.00 -1.00
+5 0
+0
+ 0
+384.00 384.00
+384.00 398.00
+384.00 398.00
+384.00 398.00
+-1.00 -1.00
+1 3
+4 tpdu
+ 3
+80.00 352.00
+48.00 352.00
+48.00 400.00
+-1.00 -1.00
+5 0
+0
+ 3
+96.00 336.00
+96.00 272.00
+416.00 272.00
+416.00 336.00
+96.00 336.00
+-1.00 -1.00
+5 0
+0
+ 3
+80.00 368.00
+80.00 336.00
+224.00 336.00
+224.00 368.00
+80.00 368.00
+-1.00 -1.00
+5 0
+0
+ 0
+96.00 352.00
+96.00 366.00
+96.00 366.00
+96.00 366.00
+-1.00 -1.00
+1 3
+19 INPUT total len 22
+ 0
+96.00 336.00
+96.00 350.00
+96.00 350.00
+96.00 350.00
+-1.00 -1.00
+1 3
+13 HDRLEN: 21+1
+ 3
+224.00 352.00
+224.00 336.00
+320.00 336.00
+320.00 352.00
+224.00 352.00
+-1.00 -1.00
+5 0
+0
+ 0
+240.00 336.00
+240.00 350.00
+240.00 350.00
+240.00 350.00
+-1.00 -1.00
+1 3
+12 CR_TPDU_type
+ 0
+336.00 336.00
+336.00 350.00
+336.00 350.00
+336.00 350.00
+-1.00 -1.00
+1 3
+23 cdt 0(0x0) dref 0x0
+ 3
+288.00 352.00
+285.00 357.00
+288.00 355.00
+291.00 357.00
+288.00 352.00
+-1.00 -1.00
+5 0
+0
+ 3
+288.00 352.00
+288.00 368.00
+352.00 368.00
+-1.00 -1.00
+5 0
+0
+ 0
+80.00 144.00
+80.00 158.00
+80.00 158.00
+80.00 158.00
+-1.00 -1.00
+1 3
+24 1a: Ref 22 arg 14(0xe)
+ 0
+256.00 384.00
+256.00 398.00
+256.00 398.00
+256.00 398.00
+-1.00 -1.00
+1 3
+22 @ 91990 : 0000.435125
+ 3
+288.00 400.00
+285.00 405.00
+288.00 403.00
+291.00 405.00
+288.00 400.00
+-1.00 -1.00
+5 0
+0
+ 3
+288.00 400.00
+288.00 416.00
+-1.00 -1.00
+5 0
+0
+ 0
+240.00 416.00
+240.00 429.00
+240.00 429.00
+240.00 429.00
+-1.00 -1.00
+2 2
+30 event # : time since 1st event
+ 3
+368.00 320.00
+384.00 320.00
+-1.00 -1.00
+3 0
+0
+ 3
+144.00 304.00
+336.00 304.00
+-1.00 -1.00
+3 0
+0
+ 3
+336.00 304.00
+384.00 304.00
+-1.00 -1.00
+4 0
+0
+ -1
diff --git a/share/doc/iso/wisc/figs/tppt.gsrc.save b/share/doc/iso/wisc/figs/tppt.gsrc.save
new file mode 100644
index 0000000..3ad56ef
--- /dev/null
+++ b/share/doc/iso/wisc/figs/tppt.gsrc.save
@@ -0,0 +1,335 @@
+gremlinfile
+0 240.00 464.00
+0
+240.00 256.00
+240.00 269.00
+240.00 269.00
+240.00 269.00
+-1.00 -1.00
+2 2
+11 , TPDU type
+ 3
+208.00 320.00
+256.00 320.00
+-1.00 -1.00
+1 0
+0
+ 0
+224.00 192.00
+224.00 205.00
+224.00 205.00
+224.00 205.00
+-1.00 -1.00
+2 2
+9 TPDU size
+ 3
+176.00 192.00
+208.00 192.00
+-1.00 -1.00
+5 0
+0
+ 3
+304.00 288.00
+400.00 288.00
+-1.00 -1.00
+5 0
+0
+ 0
+224.00 208.00
+224.00 221.00
+224.00 221.00
+224.00 221.00
+-1.00 -1.00
+2 2
+25 called transport selector
+ 3
+176.00 208.00
+208.00 208.00
+-1.00 -1.00
+4 0
+0
+ 3
+208.00 288.00
+288.00 288.00
+-1.00 -1.00
+4 0
+0
+ 3
+432.00 304.00
+464.00 304.00
+-1.00 -1.00
+4 0
+0
+ 3
+160.00 336.00
+160.00 272.00
+480.00 272.00
+480.00 336.00
+160.00 336.00
+-1.00 -1.00
+5 0
+0
+ 0
+224.00 224.00
+224.00 237.00
+224.00 237.00
+224.00 237.00
+-1.00 -1.00
+2 2
+26 calling transport selector
+ 3
+176.00 224.00
+208.00 224.00
+-1.00 -1.00
+3 0
+0
+ 3
+208.00 304.00
+432.00 304.00
+-1.00 -1.00
+3 0
+0
+ 3
+432.00 320.00
+464.00 320.00
+-1.00 -1.00
+3 0
+0
+ 0
+224.00 240.00
+224.00 253.00
+224.00 253.00
+224.00 253.00
+-1.00 -1.00
+2 2
+16 dst-ref, src-ref
+ 3
+176.00 240.00
+208.00 240.00
+-1.00 -1.00
+2 0
+0
+ 3
+272.00 320.00
+400.00 320.00
+-1.00 -1.00
+2 0
+0
+ 0
+224.00 256.00
+224.00 269.00
+224.00 269.00
+224.00 269.00
+-1.00 -1.00
+2 2
+2 LI
+ 3
+176.00 256.00
+208.00 256.00
+-1.00 -1.00
+1 0
+0
+ 0
+48.00 416.00
+48.00 429.00
+48.00 429.00
+48.00 429.00
+-1.00 -1.00
+2 2
+13 1 for the LI)
+ 0
+48.00 432.00
+48.00 445.00
+48.00 445.00
+48.00 445.00
+-1.00 -1.00
+2 2
+15 (21 in the LI +
+ 0
+48.00 448.00
+48.00 461.00
+48.00 461.00
+48.00 461.00
+-1.00 -1.00
+2 2
+26 and its header is 22 bytes
+ 0
+48.00 464.00
+48.00 477.00
+48.00 477.00
+48.00 477.00
+-1.00 -1.00
+2 2
+28 its total length is 22 bytes
+ 0
+48.00 480.00
+48.00 493.00
+48.00 493.00
+48.00 493.00
+-1.00 -1.00
+2 2
+18 TPDU was received;
+ 0
+176.00 416.00
+176.00 429.00
+176.00 429.00
+176.00 429.00
+-1.00 -1.00
+2 2
+17 TPDU is a CR TPDU
+ 0
+368.00 432.00
+368.00 445.00
+368.00 445.00
+368.00 445.00
+-1.00 -1.00
+2 2
+22 indicates a TPDU event
+ 3
+160.00 304.00
+112.00 304.00
+112.00 256.00
+160.00 256.00
+-1.00 -1.00
+5 0
+0
+ 3
+160.00 304.00
+155.00 301.00
+157.00 304.00
+155.00 307.00
+160.00 304.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 352.00
+256.00 416.00
+-1.00 -1.00
+5 0
+0
+ 3
+256.00 352.00
+253.00 357.00
+256.00 355.00
+259.00 357.00
+256.00 352.00
+-1.00 -1.00
+5 0
+0
+ 3
+80.00 352.00
+48.00 352.00
+48.00 400.00
+-1.00 -1.00
+5 0
+0
+ 3
+80.00 352.00
+75.00 349.00
+77.00 352.00
+75.00 355.00
+80.00 352.00
+-1.00 -1.00
+5 0
+0
+ 3
+416.00 384.00
+416.00 416.00
+-1.00 -1.00
+5 0
+0
+ 3
+416.00 384.00
+413.00 389.00
+416.00 387.00
+419.00 389.00
+416.00 384.00
+-1.00 -1.00
+5 0
+0
+ 3
+192.00 352.00
+192.00 336.00
+288.00 336.00
+288.00 352.00
+192.00 352.00
+-1.00 -1.00
+5 0
+0
+ 3
+80.00 352.00
+80.00 336.00
+192.00 336.00
+192.00 352.00
+80.00 352.00
+-1.00 -1.00
+5 0
+0
+ 3
+80.00 368.00
+80.00 352.00
+208.00 352.00
+208.00 368.00
+80.00 368.00
+-1.00 -1.00
+5 0
+0
+ 3
+400.00 384.00
+400.00 368.00
+448.00 368.00
+448.00 384.00
+400.00 384.00
+-1.00 -1.00
+5 0
+0
+ 0
+96.00 288.00
+96.00 303.00
+96.00 303.00
+96.00 303.00
+-1.00 -1.00
+1 2
+66 +16: 0x02 0x00 0x07 0xc0 20: 0x01 0x08 0x00 0x00
+ 0
+96.00 304.00
+96.00 319.00
+96.00 319.00
+96.00 319.00
+-1.00 -1.00
+1 2
+66 + 8: 0x06 0x74 0x70 0x70 12: 0x69 0x6e 0x67 0xc2
+ 0
+96.00 320.00
+96.00 335.00
+96.00 335.00
+96.00 335.00
+-1.00 -1.00
+1 2
+66 + 0: 0x15 0xe0 0x00 0x00 4: 0x00 0x03 0x00 0xc1
+ 0
+96.00 336.00
+96.00 351.00
+96.00 351.00
+96.00 351.00
+-1.00 -1.00
+1 2
+56 HDRLEN: 21+1 CR_TPDU_type cdt 0(0x0) dref 0x0
+ 0
+96.00 352.00
+96.00 367.00
+96.00 367.00
+96.00 367.00
+-1.00 -1.00
+1 2
+18 INPUT total len 22
+ 0
+96.00 368.00
+96.00 383.00
+96.00 383.00
+96.00 383.00
+-1.00 -1.00
+1 2
+60 1a: Ref 22 arg 14(0xe), @ 91990 : 0000.435125 tpdu
+ -1
diff --git a/share/doc/iso/wisc/figs/tppt.nr b/share/doc/iso/wisc/figs/tppt.nr
new file mode 100644
index 0000000..a6dcd18
--- /dev/null
+++ b/share/doc/iso/wisc/figs/tppt.nr
@@ -0,0 +1,296 @@
+.(z
+.br
+.nr g1 3456u
+.nr g2 2736u
+.GS C
+.nr g3 \n(.f
+.nr g4 \n(.s
+\0
+.sp -1
+\D's 16u'\D't 1u'
+.sp -1
+.sp 1296u
+\h'2592u'\D'l 432u 0u'
+.sp -1
+\D's -1u'\D't 7u'
+.sp -1
+\h'864u'\D'l 1728u 0u'
+.sp -1
+.sp -144u
+\h'2880u'\D'l 144u 0u'
+.sp -1
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "event # : time since 1st event
+.sp -864u
+\h'1728u'\&\*(g9
+.sp |\n(g8u
+\D't 1u'
+.sp -1
+.sp -720u
+\h'2160u'\D'l 0u -144u'
+.sp -1
+\h'2160u'\D'l -27u -45u'\D'l 27u 18u'\D'l 27u -18u'\D'l -27u 45u'
+.sp -1
+.ft R
+.ps 12
+.nr g8 \n(.d
+.ds g9 "@ 91990 : 0000.435125
+.sp 144u
+\h'1872u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 12
+.nr g8 \n(.d
+.ds g9 "1a: Ref 22 arg 14(0xe)
+.sp 2304u
+\h'288u'\&\*(g9
+.sp |\n(g8u
+.sp 432u
+\h'2160u'\D'l 0u -144u'\D'l 576u 0u'
+.sp -1
+\h'2160u'\D'l -27u -45u'\D'l 27u 18u'\D'l 27u -18u'\D'l -27u 45u'
+.sp -1
+.ft R
+.ps 12
+.nr g8 \n(.d
+.ds g9 "cdt 0(0x0) dref 0x0
+.sp 144u
+\h'2592u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 12
+.nr g8 \n(.d
+.ds g9 "CR_TPDU_type
+.sp 144u
+\h'1728u'\&\*(g9
+.sp |\n(g8u
+\h'1584u'\D'l 0u 144u'\D'l 864u 0u'\D'l 0u -144u'\D'l -864u 0u'
+.sp -1
+.ft R
+.ps 12
+.nr g8 \n(.d
+.ds g9 "HDRLEN: 21+1
+.sp 144u
+\h'432u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 12
+.nr g8 \n(.d
+.ds g9 "INPUT total len 22
+\h'432u'\&\*(g9
+.sp |\n(g8u
+.sp -144u
+\h'288u'\D'l 0u 288u'\D'l 1296u 0u'\D'l 0u -288u'\D'l -1296u 0u'
+.sp -1
+.sp 288u
+\h'432u'\D'l 0u 576u'\D'l 2880u 0u'\D'l 0u -576u'\D'l -2880u 0u'
+.sp -1
+.sp -144u
+\h'288u'\D'l -288u 0u'\D'l 0u -432u'
+.sp -1
+.ft R
+.ps 12
+.nr g8 \n(.d
+.ds g9 "tpdu
+.sp -288u
+\h'3024u'\&\*(g9
+.sp |\n(g8u
+.sp -432u
+\h'2880u'\D'l 0u 144u'\D'l 576u 0u'\D'l 0u -144u'\D'l -576u 0u'
+.sp -1
+\h'3168u'\D'l -27u -45u'\D'l 27u 18u'\D'l 27u -18u'\D'l -27u 45u'
+.sp -1
+.sp -288u
+\h'3168u'\D'l 0u 288u'
+.sp -1
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 ", TPDU type
+.sp 1728u
+\h'1152u'\&\*(g9
+.sp |\n(g8u
+\D's 4u'
+.sp -1
+.sp 1008u
+\h'864u'\D'l 432u 0u'
+.sp -1
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "TPDU size
+.sp 1008u
+\h'2736u'\&\*(g9
+.sp |\n(g8u
+\D's -1u'
+.sp -1
+.sp 1008u
+\h'2304u'\D'l 288u 0u'
+.sp -1
+.sp -720u
+\h'1728u'\D'l 864u 0u'
+.sp -1
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "called transport selector
+.sp 576u
+\h'2736u'\&\*(g9
+.sp |\n(g8u
+\D's 16u'
+.sp -1
+.sp 576u
+\h'2304u'\D'l 288u 0u'
+.sp -1
+.sp -576u
+\h'864u'\D'l 720u 0u'
+.sp -1
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "calling transport selector
+.sp 432u
+\h'2736u'\&\*(g9
+.sp |\n(g8u
+\D's -1u'\D't 7u'
+.sp -1
+.sp 432u
+\h'2304u'\D'l 288u 0u'
+.sp -1
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "dst-ref, src-ref
+.sp 144u
+\h'1008u'\&\*(g9
+.sp |\n(g8u
+\D's 20u'\D't 1u'
+.sp -1
+.sp 144u
+\h'576u'\D'l 288u 0u'
+.sp -1
+.sp -864u
+\h'1440u'\D'l 1152u 0u'
+.sp -1
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "LI
+.sp 720u
+\h'1008u'\&\*(g9
+.sp |\n(g8u
+\D's 4u'
+.sp -1
+.sp 720u
+\h'576u'\D'l 288u 0u'
+.sp -1
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "1 for the LI)
+.sp -1584u
+\h'576u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "(21 in the LI +
+.sp -1584u
+\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "and its header is 22 bytes
+.sp -1728u
+\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "its total length is 22 bytes
+.sp -1872u
+\h'720u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "TPDU was received;
+.sp -1872u
+\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "indicates a TPDU event
+.sp -1728u
+\h'2592u'\&\*(g9
+.sp |\n(g8u
+\D's -1u'
+.sp -1
+.sp -432u
+\h'432u'\D'l -432u 0u'\D'l 0u 432u'\D'l 432u 0u'
+.sp -1
+\h'432u'\D'l -45u 27u'\D'l 18u -27u'\D'l -18u -27u'\D'l 45u 27u'
+.sp -1
+.sp -576u
+\h'288u'\D'l -45u 27u'\D'l 18u -27u'\D'l -18u -27u'\D'l 45u 27u'
+.sp -1
+\D't 3u'
+.sp -1
+.sp 288u
+\h'2592u'\D'l 288u 0u'
+.sp -1
+.sp 1008u
+\h'576u'\D'l 288u 0u'
+.sp -1
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "class and options
+\h'1008u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 12
+.nr g8 \n(.d
+.ds g9 "+ 0: 0x15 0xe0 0x00 0x00 4: 0x00 0x03 0x00 0xc1
+.sp -1008u
+\h'576u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 12
+.nr g8 \n(.d
+.ds g9 "+ 8: 0x06 0x74 0x70 0x70 12: 0x69 0x6e 0xc7 0xc2
+.sp -864u
+\h'576u'\&\*(g9
+.sp |\n(g8u
+.ft R
+.ps 12
+.nr g8 \n(.d
+.ds g9 "+12: 0x02 0x00 0x07 0xc0 20: 0x01 0x08 0x00 0x00
+.sp -720u
+\h'576u'\&\*(g9
+.sp |\n(g8u
+\D't 1u'
+.sp -1
+.sp -1584u
+\h'1872u'\D'l 0u -144u'\D'l 1008u 0u'\D'l 0u 144u'\D'l -1008u 0u'
+.sp -1
+.ft I
+.ps 10
+.nr g8 \n(.d
+.ds g9 "this is a CR TPDU
+.sp 144u
+\h'2736u'\&\*(g9
+.sp |\n(g8u
+.sp 2160u
+\D't 3u'\D's -1u'
+.br
+.ft \n(g3
+.ps \n(g4
+.GE
+.ce
+\fB Figure \n+(FG\fR: Output of tppt(8)
+.)z
diff --git a/share/doc/iso/wisc/figs/trans_flow.grn b/share/doc/iso/wisc/figs/trans_flow.grn
new file mode 100644
index 0000000..4a45d91
--- /dev/null
+++ b/share/doc/iso/wisc/figs/trans_flow.grn
@@ -0,0 +1,20 @@
+.(z
+.GS C
+width 6.0
+high 7.0
+1 8
+2 10
+3 12
+4 14
+sc 0.4
+narrow 1
+medium 3
+thick 7
+pointscale off
+file trans_flow.gsrc
+.GE
+.ce
+\fB Figure \n+(FG\fR: Control flow (solid) and data flow (broken)
+.ce
+among the parts of the transport implementation.
+.)z
diff --git a/share/doc/iso/wisc/figs/trans_flow.gsrc b/share/doc/iso/wisc/figs/trans_flow.gsrc
new file mode 100644
index 0000000..1b96523
--- /dev/null
+++ b/share/doc/iso/wisc/figs/trans_flow.gsrc
@@ -0,0 +1,567 @@
+gremlinfile
+0 448.00 587.00
+3
+448.00 201.00
+450.69 206.18
+450.55 202.57
+453.83 201.07
+448.00 201.00
+-1.00 -1.00
+6 0
+0
+ 3
+549.00 260.00
+447.00 201.00
+-1.00 -1.00
+6 0
+0
+ 3
+582.00 238.00
+585.82 233.60
+582.52 235.05
+579.91 232.55
+582.00 238.00
+-1.00 -1.00
+6 0
+0
+ 3
+585.00 148.00
+583.00 239.00
+-1.00 -1.00
+6 0
+0
+ 3
+423.00 376.00
+428.82 375.64
+425.47 374.30
+425.42 370.70
+423.00 376.00
+-1.00 -1.00
+6 0
+0
+ 3
+542.00 322.00
+422.00 375.00
+-1.00 -1.00
+6 0
+0
+ 3
+393.00 246.00
+389.63 250.76
+392.77 248.99
+395.61 251.22
+393.00 246.00
+-1.00 -1.00
+6 0
+0
+ 3
+390.00 364.00
+392.00 244.00
+-1.00 -1.00
+6 0
+0
+ 3
+476.00 655.00
+481.66 653.59
+478.12 652.88
+477.41 649.34
+476.00 655.00
+-1.00 -1.00
+6 0
+0
+ 3
+540.00 577.00
+476.00 656.00
+-1.00 -1.00
+6 0
+0
+ 3
+138.00 209.00
+139.96 203.51
+137.41 206.06
+134.08 204.69
+138.00 209.00
+-1.00 -1.00
+6 0
+0
+ 3
+137.00 209.00
+124.00 149.00
+-1.00 -1.00
+6 0
+0
+ 3
+378.00 242.00
+375.00 247.00
+378.00 245.00
+381.00 247.00
+378.00 242.00
+-1.00 -1.00
+1 0
+0
+ 3
+376.00 364.00
+378.00 239.00
+-1.00 -1.00
+1 0
+0
+ 3
+441.00 215.00
+443.50 220.27
+443.50 216.66
+446.82 215.28
+441.00 215.00
+-1.00 -1.00
+1 0
+0
+ 3
+541.00 269.00
+438.00 214.00
+-1.00 -1.00
+1 0
+0
+ 3
+600.00 240.00
+603.25 235.16
+600.15 237.00
+597.25 234.86
+600.00 240.00
+-1.00 -1.00
+1 0
+0
+ 3
+599.00 242.00
+605.00 148.00
+-1.00 -1.00
+1 0
+0
+ 3
+497.00 138.00
+491.22 137.21
+494.24 139.18
+493.59 142.73
+497.00 138.00
+-1.00 -1.00
+1 0
+0
+ 3
+441.00 165.00
+495.00 138.00
+-1.00 -1.00
+1 0
+0
+ 3
+423.00 231.00
+423.07 236.83
+424.57 233.55
+428.18 233.69
+423.00 231.00
+-1.00 -1.00
+1 0
+0
+ 3
+563.00 479.00
+421.00 231.00
+-1.00 -1.00
+1 0
+0
+ 3
+433.00 394.00
+438.82 394.29
+435.65 392.59
+436.00 389.00
+433.00 394.00
+-1.00 -1.00
+1 0
+0
+ 3
+554.00 335.00
+434.00 391.00
+-1.00 -1.00
+1 0
+0
+ 3
+176.00 317.00
+178.50 322.27
+178.50 318.66
+181.82 317.28
+176.00 317.00
+-1.00 -1.00
+1 0
+0
+ 3
+325.00 413.00
+175.00 315.00
+-1.00 -1.00
+1 0
+0
+ 3
+343.00 378.00
+340.62 372.67
+340.54 376.28
+337.18 377.59
+343.00 378.00
+-1.00 -1.00
+1 0
+0
+ 3
+199.00 285.00
+342.00 377.00
+-1.00 -1.00
+1 0
+0
+ 3
+344.00 226.00
+338.60 228.20
+342.20 228.40
+343.40 231.80
+344.00 226.00
+-1.00 -1.00
+1 0
+0
+ 3
+197.00 458.00
+342.00 226.00
+-1.00 -1.00
+1 0
+0
+ 3
+523.00 513.00
+520.80 507.60
+520.60 511.20
+517.20 512.40
+523.00 513.00
+-1.00 -1.00
+1 0
+0
+ 3
+424.00 461.00
+522.00 512.00
+-1.00 -1.00
+1 0
+0
+ 3
+553.00 583.00
+547.45 584.79
+551.02 585.26
+551.97 588.74
+553.00 583.00
+-1.00 -1.00
+1 0
+0
+ 3
+491.00 657.00
+553.00 583.00
+-1.00 -1.00
+1 0
+0
+ 3
+235.00 559.00
+235.65 564.79
+236.82 561.38
+240.42 561.15
+235.00 559.00
+-1.00 -1.00
+1 0
+0
+ 3
+304.00 656.00
+233.00 556.00
+-1.00 -1.00
+1 0
+0
+ 4
+383.00 420.00
+354.00 467.00
+383.00 364.77
+383.00 475.23
+438.23 420.00
+327.77 420.00
+-1.00 -1.00
+5 0
+0
+ 4
+189.00 515.00
+160.00 562.00
+189.00 459.77
+189.00 570.23
+244.23 515.00
+133.77 515.00
+-1.00 -1.00
+5 0
+0
+ 4
+577.00 532.00
+548.00 579.00
+577.00 476.77
+577.00 587.23
+632.23 532.00
+521.77 532.00
+-1.00 -1.00
+5 0
+0
+ 4
+592.00 296.00
+563.00 343.00
+592.00 240.77
+592.00 351.23
+647.23 296.00
+536.77 296.00
+-1.00 -1.00
+5 0
+0
+ 4
+388.00 185.00
+359.00 232.00
+388.00 129.77
+388.00 240.23
+443.23 185.00
+332.77 185.00
+-1.00 -1.00
+5 0
+0
+ 4
+145.00 265.00
+116.00 312.00
+145.00 209.77
+145.00 320.23
+200.23 265.00
+89.77 265.00
+-1.00 -1.00
+5 0
+0
+ 3
+282.00 708.00
+282.00 658.00
+500.00 658.00
+500.00 708.00
+282.00 708.00
+-1.00 -1.00
+5 0
+0
+ 3
+384.00 660.00
+384.00 484.00
+-1.00 -1.00
+6 0
+0
+ 3
+384.00 484.00
+381.00 489.00
+384.00 487.00
+387.00 489.00
+384.00 484.00
+-1.00 -1.00
+6 0
+0
+ 3
+552.00 484.00
+408.00 236.00
+-1.00 -1.00
+6 0
+0
+ 3
+408.00 236.00
+408.28 241.82
+409.66 238.50
+413.27 238.50
+408.00 236.00
+-1.00 -1.00
+6 0
+0
+ 3
+432.00 452.00
+528.00 500.00
+-1.00 -1.00
+6 0
+0
+ 3
+528.00 500.00
+525.50 494.73
+525.50 498.34
+522.18 499.72
+528.00 500.00
+-1.00 -1.00
+6 0
+0
+ 3
+240.00 484.00
+328.00 444.00
+-1.00 -1.00
+6 0
+0
+ 3
+240.00 484.00
+245.69 485.26
+242.85 483.05
+243.79 479.57
+240.00 484.00
+-1.00 -1.00
+6 0
+0
+ 0
+320.00 668.00
+320.00 681.00
+320.00 681.00
+320.00 681.00
+-1.00 -1.00
+3 2
+11 SOCKET CODE
+ 0
+512.00 116.00
+512.00 129.00
+512.00 129.00
+512.00 129.00
+-1.00 -1.00
+3 2
+13 NETWORK LEVEL
+ 3
+496.00 148.00
+496.00 100.00
+704.00 100.00
+704.00 148.00
+496.00 148.00
+-1.00 -1.00
+6 0
+0
+ 0
+64.00 116.00
+64.00 129.00
+64.00 129.00
+64.00 129.00
+-1.00 -1.00
+3 2
+5 CLOCK
+ 3
+48.00 148.00
+48.00 100.00
+160.00 100.00
+160.00 148.00
+48.00 148.00
+-1.00 -1.00
+6 0
+0
+ 0
+160.00 500.00
+160.00 513.00
+160.00 513.00
+160.00 513.00
+-1.00 -1.00
+3 2
+4 SEND
+ 0
+544.00 524.00
+544.00 537.00
+544.00 537.00
+544.00 537.00
+-1.00 -1.00
+3 2
+4 RECV
+ 0
+352.00 421.00
+352.00 434.00
+352.00 434.00
+352.00 434.00
+-1.00 -1.00
+3 2
+6 DRIVER
+ 0
+105.00 264.00
+105.00 277.00
+105.00 277.00
+105.00 277.00
+-1.00 -1.00
+3 2
+6 TIMERS
+ 0
+560.00 276.00
+560.00 289.00
+560.00 289.00
+560.00 289.00
+-1.00 -1.00
+3 2
+5 INPUT
+ 0
+349.00 181.00
+349.00 194.00
+349.00 194.00
+349.00 194.00
+-1.00 -1.00
+3 2
+6 OUTPUT
+ 3
+192.00 292.00
+336.00 388.00
+-1.00 -1.00
+6 0
+0
+ 3
+336.00 388.00
+334.59 382.34
+333.88 385.88
+330.34 386.59
+336.00 388.00
+-1.00 -1.00
+6 0
+0
+ 3
+328.00 404.00
+184.00 308.00
+-1.00 -1.00
+6 0
+0
+ 3
+184.00 308.00
+187.13 312.92
+186.68 309.34
+189.81 307.55
+184.00 308.00
+-1.00 -1.00
+6 0
+0
+ 3
+208.00 460.00
+352.00 236.00
+-1.00 -1.00
+6 0
+0
+ 3
+352.00 236.00
+347.08 239.13
+350.66 238.68
+352.45 241.81
+352.00 236.00
+-1.00 -1.00
+6 0
+0
+ 3
+432.00 148.00
+496.00 116.00
+-1.00 -1.00
+6 0
+0
+ 3
+496.00 116.00
+491.00 113.00
+493.00 116.00
+491.00 119.00
+496.00 116.00
+-1.00 -1.00
+6 0
+0
+ 3
+224.00 564.00
+288.00 660.00
+-1.00 -1.00
+6 0
+0
+ 3
+288.00 660.00
+288.45 654.19
+286.66 657.32
+283.08 656.87
+288.00 660.00
+-1.00 -1.00
+6 0
+0
+ -1
diff --git a/share/doc/iso/wisc/figs/trans_flow.nr b/share/doc/iso/wisc/figs/trans_flow.nr
new file mode 100644
index 0000000..2b8061c
--- /dev/null
+++ b/share/doc/iso/wisc/figs/trans_flow.nr
@@ -0,0 +1,274 @@
+.(z
+.br
+.nr g1 3456u
+.nr g2 3202u
+.GS C
+.nr g3 \n(.f
+.nr g4 \n(.s
+\0
+.sp -1
+.sp 253u
+\h'1265u'\D'l 2u 30u'\D'l -9u -16u'\D'l -19u 2u'\D'l 26u -16u'
+.sp -1
+.sp 505u
+\h'928u'\D'l 337u -505u'
+.sp -1
+.sp 2359u
+\h'2361u'\D'l -27u 16u'\D'l 11u -16u'\D'l -11u -15u'\D'l 27u 15u'
+.sp -1
+.sp -168u
+\h'2023u'\D'l 338u 168u'
+.sp -1
+.sp -464u
+\h'1602u'\D'l -26u -16u'\D'l 19u 2u'\D'l 9u -16u'\D'l -2u 30u'
+.sp -1
+.sp -1180u
+\h'843u'\D'l 759u 1180u'
+.sp -1
+.sp 801u
+\h'717u'\D'l 16u -26u'\D'l -2u 19u'\D'l 16u 9u'\D'l -30u -2u'
+.sp -1
+.sp -506u
+\h'1475u'\D'l -758u 506u'
+.sp -1
+.sp 84u
+\h'1518u'\D'l -8u 30u'\D'l -4u -18u'\D'l -18u -4u'\D'l 30u -8u'
+.sp -1
+.sp 506u
+\h'759u'\D'l 759u -506u'
+.sp -1
+.ft B
+.ps 10
+.nr g8 \n(.d
+.ds g9 "OUTPUT
+.sp 585u
+\h'1586u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 10
+.nr g8 \n(.d
+.ds g9 "INPUT
+.sp 85u
+\h'2698u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 10
+.nr g8 \n(.d
+.ds g9 "TIMERS
+.sp 148u
+\h'301u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 10
+.nr g8 \n(.d
+.ds g9 "DRIVER
+.sp -679u
+\h'1602u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 10
+.nr g8 \n(.d
+.ds g9 "RECV
+.sp -1221u
+\h'2613u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 10
+.nr g8 \n(.d
+.ds g9 "SEND
+.sp -1096u
+\h'590u'\&\*(g9
+.sp |\n(g8u
+.sp 759u
+\D'l 0u 253u'\D'l 590u 0u'\D'l 0u -253u'\D'l -590u 0u'
+.sp -1
+.ft B
+.ps 10
+.nr g8 \n(.d
+.ds g9 "CLOCK
+.sp 168u
+\h'85u'\&\*(g9
+.sp |\n(g8u
+\h'2361u'\D'l 0u 253u'\D'l 1095u 0u'\D'l 0u -253u'\D'l -1095u 0u'
+.sp -1
+.ft B
+.ps 10
+.nr g8 \n(.d
+.ds g9 "NETWORK LEVEL
+.sp 168u
+\h'2445u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 10
+.nr g8 \n(.d
+.ds g9 "SOCKET CODE
+.sp -2739u
+\h'1433u'\&\*(g9
+.sp |\n(g8u
+.sp -1770u
+\h'1012u'\D'l 30u -7u'\D'l -15u 12u'\D'l 5u 18u'\D'l -20u -23u'
+.sp -1
+\h'1012u'\D'l 463u 210u'
+.sp -1
+.sp -85u
+\h'2529u'\D'l -13u 28u'\D'l 0u -19u'\D'l -18u -7u'\D'l 31u -2u'
+.sp -1
+.sp 253u
+\h'2023u'\D'l 506u -253u'
+.sp -1
+.sp 1138u
+\h'1897u'\D'l 1u -30u'\D'l 8u 17u'\D'l 19u 0u'\D'l -28u 13u'
+.sp -1
+.sp -1306u
+\h'2656u'\D'l -759u 1306u'
+.sp -1
+\h'1771u'\D'l -16u -27u'\D'l 16u 11u'\D'l 15u -11u'\D'l -15u 27u'
+.sp -1
+.sp -926u
+\h'1771u'\D'l 0u 926u'
+.sp -1
+\D't 1u'
+.sp -1
+.sp -253u
+\h'1233u'\D'l 0u 263u'\D'l 1149u 0u'\D'l 0u -263u'\D'l -1149u 0u'
+.sp -1
+.sp 2332u
+\h'220u'\D'c 581u'
+.sp -1
+.sp 422u
+\h'1501u'\D'c 581u'
+.sp -1
+.sp -585u
+\h'2575u'\D'c 581u'
+.sp -1
+.sp -1242u
+\h'2496u'\D'c 581u'
+.sp -1
+.sp 89u
+\h'452u'\D'c 581u'
+.sp -1
+.sp 500u
+\h'1474u'\D'c 581u'
+.sp -1
+\D's 4u'
+.sp -1
+.sp -1242u
+\h'1349u'\D'l -374u 526u'
+.sp -1
+.sp 511u
+\h'986u'\D'l 3u -31u'\D'l 6u 18u'\D'l 19u 1u'\D'l -28u 12u'
+.sp -1
+.sp -517u
+\h'2334u'\D'l 327u 390u'
+.sp -1
+.sp 390u
+\h'2661u'\D'l -29u -9u'\D'l 18u -3u'\D'l 5u -18u'\D'l 6u 30u'
+.sp -1
+.sp 642u
+\h'1981u'\D'l 517u -268u'
+.sp -1
+.sp -273u
+\h'2503u'\D'l -12u 27u'\D'l -1u -18u'\D'l -18u -6u'\D'l 31u -3u'
+.sp -1
+.sp 289u
+\h'785u'\D'l 764u 1222u'
+.sp -1
+.sp 1222u
+\h'1560u'\D'l -29u -12u'\D'l 19u -1u'\D'l 7u -18u'\D'l 3u 31u'
+.sp -1
+.sp -311u
+\h'796u'\D'l 753u -485u'
+.sp -1
+.sp -490u
+\h'1555u'\D'l -13u 28u'\D'l 0u -19u'\D'l -18u -7u'\D'l 31u -2u'
+.sp -1
+.sp -184u
+\h'1460u'\D'l -791u 516u'
+.sp -1
+.sp 506u
+\h'675u'\D'l 13u -28u'\D'l 0u 19u'\D'l 17u 7u'\D'l -30u 2u'
+.sp -1
+.sp -95u
+\h'2666u'\D'l -632u -295u'
+.sp -1
+.sp -311u
+\h'2029u'\D'l 30u -2u'\D'l -16u 9u'\D'l 1u 19u'\D'l -15u -26u'
+.sp -1
+.sp -448u
+\h'2714u'\D'l -749u 1307u'
+.sp -1
+.sp 1307u
+\h'1976u'\D'l 0u -31u'\D'l 8u 17u'\D'l 19u -1u'\D'l -27u 15u'
+.sp -1
+.sp 347u
+\h'2071u'\D'l 284u 143u'
+.sp -1
+.sp 143u
+\h'2366u'\D'l -31u 4u'\D'l 16u -11u'\D'l -3u -18u'\D'l 18u 25u'
+.sp -1
+.sp -548u
+\h'2903u'\D'l 32u 495u'
+.sp -1
+.sp 10u
+\h'2908u'\D'l 18u 26u'\D'l -17u -10u'\D'l -15u 11u'\D'l 14u -27u'
+.sp -1
+.sp -153u
+\h'2598u'\D'l -543u 290u'
+.sp -1
+.sp 285u
+\h'2071u'\D'l 13u -28u'\D'l 0u 19u'\D'l 17u 7u'\D'l -30u 2u'
+.sp -1
+.sp -785u
+\h'1728u'\D'l 11u 658u'
+.sp -1
+.sp 643u
+\h'1739u'\D'l -16u -27u'\D'l 16u 11u'\D'l 16u -11u'\D'l -16u 27u'
+.sp -1
+\D's -1u'\D't 3u'
+.sp -1
+.sp 174u
+\h'469u'\D'l -68u 316u'
+.sp -1
+\h'475u'\D'l 10u 28u'\D'l -14u -13u'\D'l -17u 7u'\D'l 21u -22u'
+.sp -1
+.sp -1938u
+\h'2592u'\D'l -337u -416u'
+.sp -1
+.sp -411u
+\h'2255u'\D'l 30u 7u'\D'l -19u 4u'\D'l -3u 19u'\D'l -8u -30u'
+.sp -1
+.sp 1532u
+\h'1802u'\D'l 11u 632u'
+.sp -1
+.sp 622u
+\h'1818u'\D'l -18u -25u'\D'l 17u 9u'\D'l 15u -12u'\D'l -14u 28u'
+.sp -1
+.sp -401u
+\h'2603u'\D'l -632u -279u'
+.sp -1
+.sp -284u
+\h'1976u'\D'l 31u 2u'\D'l -18u 7u'\D'l 0u 19u'\D'l -13u -28u'
+.sp -1
+.sp 1201u
+\h'2829u'\D'l -10u -480u'
+.sp -1
+.sp -474u
+\h'2814u'\D'l 20u 23u'\D'l -18u -8u'\D'l -13u 13u'\D'l 11u -28u'
+.sp -1
+.sp -116u
+\h'2640u'\D'l -538u 311u'
+.sp -1
+.sp 311u
+\h'2108u'\D'l 14u -28u'\D'l -1u 19u'\D'l 17u 8u'\D'l -30u 1u'
+.sp -1
+.sp 532u
+\D't 3u'\D's -1u'
+.br
+.ft \n(g3
+.ps \n(g4
+.GE
+.ce
+\fB Figure \n+(FG\fR: Control flow (solid) and data flow (broken)
+.ce
+among the parts of the transport implementation.
+.)z
diff --git a/share/doc/iso/wisc/figs/unix_ipc.grn b/share/doc/iso/wisc/figs/unix_ipc.grn
new file mode 100644
index 0000000..7c06d27
--- /dev/null
+++ b/share/doc/iso/wisc/figs/unix_ipc.grn
@@ -0,0 +1,18 @@
+.(z L
+.GS C
+width 6.0
+high 7.0
+1 8
+2 10
+3 12
+4 14
+sc 0.3
+narrow 1
+medium 3
+thick 7
+pointscale off
+file unix_ipc.gsrc
+.GE
+.ce
+\fBFigure \n+(FG\fR: IPC in 4.2 Unix
+.)z
diff --git a/share/doc/iso/wisc/figs/unix_ipc.gsrc b/share/doc/iso/wisc/figs/unix_ipc.gsrc
new file mode 100644
index 0000000..cafe972
--- /dev/null
+++ b/share/doc/iso/wisc/figs/unix_ipc.gsrc
@@ -0,0 +1,1041 @@
+gremlinfile
+0 384.00 408.00
+3
+384.00 380.00
+387.00 375.00
+384.00 377.00
+381.00 375.00
+384.00 380.00
+-1.00 -1.00
+6 0
+0
+ 3
+392.00 612.00
+608.00 612.00
+-1.00 -1.00
+6 0
+0
+ 3
+248.00 612.00
+32.00 612.00
+-1.00 -1.00
+6 0
+0
+ 4
+176.00 692.00
+176.00 740.00
+176.00 644.00
+176.00 740.00
+224.00 692.00
+128.00 692.00
+-1.00 -1.00
+6 0
+0
+ 4
+160.00 532.00
+160.00 580.00
+160.00 484.00
+160.00 580.00
+208.00 532.00
+112.00 532.00
+-1.00 -1.00
+6 0
+0
+ 4
+528.00 340.00
+528.00 388.00
+528.00 292.00
+528.00 388.00
+576.00 340.00
+480.00 340.00
+-1.00 -1.00
+6 0
+0
+ 4
+544.00 124.00
+544.00 188.00
+544.00 60.00
+544.00 188.00
+608.00 124.00
+480.00 124.00
+-1.00 -1.00
+6 0
+0
+ 4
+320.00 604.00
+320.00 676.00
+320.00 532.00
+320.00 676.00
+392.00 604.00
+248.00 604.00
+-1.00 -1.00
+6 0
+0
+ 0
+144.00 676.00
+144.00 692.00
+144.00 692.00
+144.00 692.00
+-1.00 -1.00
+3 3
+7 program
+ 0
+152.00 700.00
+152.00 716.00
+152.00 716.00
+152.00 716.00
+-1.00 -1.00
+3 3
+4 user
+ 0
+288.00 628.00
+288.00 644.00
+288.00 644.00
+288.00 644.00
+-1.00 -1.00
+3 3
+9 C library
+ 0
+280.00 572.00
+280.00 588.00
+280.00 588.00
+280.00 588.00
+-1.00 -1.00
+3 3
+12 system calls
+ 0
+144.00 532.00
+144.00 548.00
+144.00 548.00
+144.00 548.00
+-1.00 -1.00
+3 3
+5 clock
+ 0
+512.00 132.00
+512.00 148.00
+512.00 148.00
+512.00 148.00
+-1.00 -1.00
+3 3
+8 network
+ 0
+512.00 108.00
+512.00 124.00
+512.00 124.00
+512.00 124.00
+-1.00 -1.00
+3 3
+9 interface
+ 0
+512.00 84.00
+512.00 100.00
+512.00 100.00
+512.00 100.00
+-1.00 -1.00
+3 3
+7 drivers
+ 0
+32.00 628.00
+32.00 644.00
+32.00 644.00
+32.00 644.00
+-1.00 -1.00
+2 3
+4 user
+ 0
+32.00 580.00
+32.00 596.00
+32.00 596.00
+32.00 596.00
+-1.00 -1.00
+2 3
+6 kernel
+ 3
+248.00 612.00
+392.00 612.00
+-1.00 -1.00
+1 0
+0
+ 0
+488.00 692.00
+488.00 708.00
+488.00 708.00
+488.00 708.00
+-1.00 -1.00
+3 3
+7 network
+ 0
+480.00 668.00
+480.00 684.00
+480.00 684.00
+480.00 684.00
+-1.00 -1.00
+3 3
+10 management
+ 4
+528.00 692.00
+528.00 756.00
+528.00 628.00
+528.00 756.00
+592.00 692.00
+464.00 692.00
+-1.00 -1.00
+6 0
+0
+ 4
+528.00 500.00
+528.00 548.00
+528.00 452.00
+528.00 548.00
+576.00 500.00
+480.00 500.00
+-1.00 -1.00
+6 0
+0
+ 0
+504.00 508.00
+504.00 524.00
+504.00 524.00
+504.00 524.00
+-1.00 -1.00
+3 3
+7 routing
+ 0
+504.00 484.00
+504.00 500.00
+504.00 500.00
+504.00 500.00
+-1.00 -1.00
+3 3
+6 tables
+ 4
+320.00 436.00
+320.00 516.00
+320.00 356.00
+320.00 516.00
+400.00 436.00
+240.00 436.00
+-1.00 -1.00
+6 0
+0
+ 0
+288.00 420.00
+288.00 436.00
+288.00 436.00
+288.00 436.00
+-1.00 -1.00
+3 3
+7 sockets
+ 3
+80.00 356.00
+80.00 100.00
+208.00 100.00
+208.00 356.00
+80.00 356.00
+-1.00 -1.00
+6 0
+0
+ 0
+112.00 292.00
+112.00 308.00
+112.00 308.00
+112.00 308.00
+-1.00 -1.00
+3 3
+9 transport
+ 0
+112.00 244.00
+112.00 260.00
+112.00 260.00
+112.00 260.00
+-1.00 -1.00
+3 3
+8 protocol
+ 0
+112.00 188.00
+112.00 204.00
+112.00 204.00
+112.00 204.00
+-1.00 -1.00
+3 3
+6 switch
+ 4
+448.00 228.00
+448.00 276.00
+448.00 180.00
+448.00 276.00
+496.00 228.00
+400.00 228.00
+-1.00 -1.00
+6 0
+0
+ 4
+288.00 292.00
+288.00 340.00
+288.00 244.00
+288.00 340.00
+336.00 292.00
+240.00 292.00
+-1.00 -1.00
+6 0
+0
+ 4
+288.00 132.00
+288.00 180.00
+288.00 84.00
+288.00 180.00
+336.00 132.00
+240.00 132.00
+-1.00 -1.00
+6 0
+0
+ 0
+504.00 340.00
+504.00 356.00
+504.00 356.00
+504.00 356.00
+-1.00 -1.00
+3 3
+5 mbufs
+ 0
+264.00 292.00
+264.00 308.00
+264.00 308.00
+264.00 308.00
+-1.00 -1.00
+3 3
+7 proto 1
+ 0
+264.00 124.00
+264.00 140.00
+264.00 140.00
+264.00 140.00
+-1.00 -1.00
+3 3
+7 proto n
+ 3
+208.00 660.00
+256.00 636.00
+-1.00 -1.00
+6 0
+0
+ 3
+480.00 652.00
+384.00 628.00
+-1.00 -1.00
+6 0
+0
+ 3
+384.00 564.00
+480.00 516.00
+-1.00 -1.00
+6 0
+0
+ 3
+304.00 532.00
+304.00 516.00
+-1.00 -1.00
+6 0
+0
+ 5
+240.00 420.00
+176.00 420.00
+144.00 404.00
+128.00 372.00
+128.00 356.00
+-1.00 -1.00
+6 0
+0
+ 3
+216.00 292.00
+240.00 292.00
+-1.00 -1.00
+6 0
+0
+ 3
+216.00 132.00
+240.00 132.00
+-1.00 -1.00
+6 0
+0
+ 3
+336.00 292.00
+368.00 292.00
+-1.00 -1.00
+6 0
+0
+ 3
+336.00 132.00
+368.00 132.00
+-1.00 -1.00
+6 0
+0
+ 3
+368.00 132.00
+368.00 324.00
+-1.00 -1.00
+6 0
+0
+ 3
+512.00 180.00
+488.00 196.00
+-1.00 -1.00
+6 0
+0
+ 5
+368.00 324.00
+368.00 356.00
+368.00 364.00
+-1.00 -1.00
+6 0
+0
+ 3
+328.00 268.00
+400.00 244.00
+-1.00 -1.00
+6 0
+0
+ 3
+328.00 164.00
+400.00 204.00
+-1.00 -1.00
+6 0
+0
+ 3
+208.00 660.00
+213.81 660.45
+210.68 658.66
+211.13 655.08
+208.00 660.00
+-1.00 -1.00
+6 0
+0
+ 3
+256.00 636.00
+250.34 637.41
+253.88 638.12
+254.59 641.66
+256.00 636.00
+-1.00 -1.00
+6 0
+0
+ 3
+384.00 628.00
+389.00 631.00
+387.00 628.00
+389.00 625.00
+384.00 628.00
+-1.00 -1.00
+6 0
+0
+ 3
+480.00 652.00
+475.00 649.00
+477.00 652.00
+475.00 655.00
+480.00 652.00
+-1.00 -1.00
+6 0
+0
+ 3
+384.00 564.00
+389.81 564.45
+386.68 562.66
+387.13 559.08
+384.00 564.00
+-1.00 -1.00
+6 0
+0
+ 3
+480.00 516.00
+475.00 513.00
+477.00 516.00
+475.00 519.00
+480.00 516.00
+-1.00 -1.00
+6 0
+0
+ 3
+304.00 532.00
+307.00 527.00
+304.00 529.00
+301.00 527.00
+304.00 532.00
+-1.00 -1.00
+6 0
+0
+ 3
+304.00 516.00
+301.00 521.00
+304.00 519.00
+307.00 521.00
+304.00 516.00
+-1.00 -1.00
+6 0
+0
+ 3
+128.00 356.00
+125.00 361.00
+128.00 359.00
+131.00 361.00
+128.00 356.00
+-1.00 -1.00
+6 0
+0
+ 3
+240.00 292.00
+235.00 289.00
+237.00 292.00
+235.00 295.00
+240.00 292.00
+-1.00 -1.00
+6 0
+0
+ 3
+240.00 132.00
+235.00 129.00
+237.00 132.00
+235.00 135.00
+240.00 132.00
+-1.00 -1.00
+6 0
+0
+ 3
+368.00 364.00
+371.00 359.00
+368.00 361.00
+365.00 359.00
+368.00 364.00
+-1.00 -1.00
+6 0
+0
+ 3
+328.00 268.00
+333.81 268.45
+330.68 266.66
+331.13 263.08
+328.00 268.00
+-1.00 -1.00
+6 0
+0
+ 3
+400.00 244.00
+395.00 241.00
+397.00 244.00
+395.00 247.00
+400.00 244.00
+-1.00 -1.00
+6 0
+0
+ 3
+400.00 204.00
+398.59 198.34
+397.88 201.88
+394.34 202.59
+400.00 204.00
+-1.00 -1.00
+6 0
+0
+ 3
+328.00 164.00
+331.13 168.92
+330.68 165.34
+333.81 163.55
+328.00 164.00
+-1.00 -1.00
+6 0
+0
+ 3
+488.00 196.00
+493.66 194.59
+490.12 193.88
+489.41 190.34
+488.00 196.00
+-1.00 -1.00
+6 0
+0
+ 3
+512.00 180.00
+506.34 181.41
+509.88 182.12
+510.59 185.66
+512.00 180.00
+-1.00 -1.00
+6 0
+0
+ 0
+416.00 228.00
+416.00 244.00
+416.00 244.00
+416.00 244.00
+-1.00 -1.00
+3 3
+6 DoD IP
+ 0
+368.00 20.00
+368.00 36.00
+368.00 36.00
+368.00 36.00
+-1.00 -1.00
+2 3
+12 control flow
+ 0
+144.00 20.00
+144.00 36.00
+144.00 36.00
+144.00 36.00
+-1.00 -1.00
+2 3
+9 data flow
+ 3
+304.00 36.00
+352.00 36.00
+-1.00 -1.00
+6 0
+0
+ 3
+80.00 36.00
+128.00 36.00
+-1.00 -1.00
+1 0
+0
+ 3
+224.00 676.00
+264.00 652.00
+-1.00 -1.00
+1 0
+0
+ 3
+464.00 676.00
+384.00 644.00
+-1.00 -1.00
+1 0
+0
+ 3
+392.00 580.00
+488.00 532.00
+-1.00 -1.00
+1 0
+0
+ 3
+200.00 500.00
+248.00 468.00
+-1.00 -1.00
+1 0
+0
+ 5
+120.00 500.00
+48.00 372.00
+48.00 276.00
+48.00 196.00
+48.00 84.00
+64.00 68.00
+144.00 68.00
+480.00 68.00
+496.00 76.00
+-1.00 -1.00
+1 0
+0
+ 3
+152.00 68.00
+152.00 100.00
+-1.00 -1.00
+1 0
+0
+ 3
+432.00 52.00
+432.00 180.00
+-1.00 -1.00
+1 0
+0
+ 3
+216.00 116.00
+240.00 116.00
+-1.00 -1.00
+1 0
+0
+ 3
+216.00 276.00
+240.00 276.00
+-1.00 -1.00
+1 0
+0
+ 3
+336.00 276.00
+384.00 276.00
+-1.00 -1.00
+1 0
+0
+ 3
+336.00 116.00
+384.00 116.00
+-1.00 -1.00
+1 0
+0
+ 3
+384.00 116.00
+384.00 388.00
+-1.00 -1.00
+1 0
+0
+ 3
+336.00 148.00
+408.00 188.00
+-1.00 -1.00
+1 0
+0
+ 3
+328.00 252.00
+400.00 228.00
+-1.00 -1.00
+1 0
+0
+ 3
+472.00 180.00
+488.00 164.00
+-1.00 -1.00
+1 0
+0
+ 3
+504.00 300.00
+480.00 268.00
+-1.00 -1.00
+1 0
+0
+ 3
+480.00 340.00
+328.00 324.00
+-1.00 -1.00
+1 0
+0
+ 3
+400.00 420.00
+488.00 372.00
+-1.00 -1.00
+1 0
+0
+ 3
+544.00 292.00
+544.00 188.00
+-1.00 -1.00
+1 0
+0
+ 3
+528.00 452.00
+528.00 388.00
+-1.00 -1.00
+1 0
+0
+ 3
+336.00 532.00
+336.00 516.00
+-1.00 -1.00
+1 0
+0
+ 3
+224.00 676.00
+229.66 674.59
+226.12 673.88
+225.41 670.34
+224.00 676.00
+-1.00 -1.00
+1 0
+0
+ 3
+264.00 652.00
+258.34 653.41
+261.88 654.12
+262.59 657.66
+264.00 652.00
+-1.00 -1.00
+1 0
+0
+ 3
+384.00 644.00
+387.13 648.92
+386.68 645.34
+389.81 643.55
+384.00 644.00
+-1.00 -1.00
+1 0
+0
+ 3
+464.00 676.00
+462.59 670.34
+461.88 673.88
+458.34 674.59
+464.00 676.00
+-1.00 -1.00
+1 0
+0
+ 3
+392.00 580.00
+397.81 580.45
+394.68 578.66
+395.13 575.08
+392.00 580.00
+-1.00 -1.00
+1 0
+0
+ 3
+488.00 532.00
+482.19 531.55
+485.32 533.34
+484.87 536.92
+488.00 532.00
+-1.00 -1.00
+1 0
+0
+ 3
+336.00 532.00
+339.00 527.00
+336.00 529.00
+333.00 527.00
+336.00 532.00
+-1.00 -1.00
+1 0
+0
+ 3
+336.00 516.00
+333.00 521.00
+336.00 519.00
+339.00 521.00
+336.00 516.00
+-1.00 -1.00
+1 0
+0
+ 3
+248.00 468.00
+242.19 467.55
+245.32 469.34
+244.87 472.92
+248.00 468.00
+-1.00 -1.00
+1 0
+0
+ 3
+152.00 100.00
+152.00 84.00
+-1.00 -1.00
+1 0
+0
+ 3
+240.00 116.00
+235.00 113.00
+237.00 116.00
+235.00 119.00
+240.00 116.00
+-1.00 -1.00
+1 0
+0
+ 3
+152.00 100.00
+155.00 95.00
+152.00 97.00
+149.00 95.00
+152.00 100.00
+-1.00 -1.00
+1 0
+0
+ 3
+432.00 180.00
+435.00 175.00
+432.00 177.00
+429.00 175.00
+432.00 180.00
+-1.00 -1.00
+1 0
+0
+ 3
+472.00 180.00
+477.66 178.59
+474.12 177.88
+473.41 174.34
+472.00 180.00
+-1.00 -1.00
+1 0
+0
+ 3
+496.00 156.00
+490.34 157.41
+493.88 158.12
+494.59 161.66
+496.00 156.00
+-1.00 -1.00
+1 0
+0
+ 3
+496.00 76.00
+494.59 70.34
+493.88 73.88
+490.34 74.59
+496.00 76.00
+-1.00 -1.00
+1 0
+0
+ 3
+408.00 188.00
+406.59 182.34
+405.88 185.88
+402.34 186.59
+408.00 188.00
+-1.00 -1.00
+1 0
+0
+ 3
+336.00 148.00
+339.13 152.92
+338.68 149.34
+341.81 147.55
+336.00 148.00
+-1.00 -1.00
+1 0
+0
+ 3
+328.00 252.00
+333.81 252.45
+330.68 250.66
+331.13 247.08
+328.00 252.00
+-1.00 -1.00
+1 0
+0
+ 3
+400.00 228.00
+395.00 225.00
+397.00 228.00
+395.00 231.00
+400.00 228.00
+-1.00 -1.00
+1 0
+0
+ 3
+544.00 292.00
+547.00 287.00
+544.00 289.00
+541.00 287.00
+544.00 292.00
+-1.00 -1.00
+1 0
+0
+ 3
+504.00 300.00
+502.59 294.34
+501.88 297.88
+498.34 298.59
+504.00 300.00
+-1.00 -1.00
+1 0
+0
+ 3
+480.00 268.00
+481.41 273.66
+482.12 270.12
+485.66 269.41
+480.00 268.00
+-1.00 -1.00
+1 0
+0
+ 3
+400.00 420.00
+405.81 420.45
+402.68 418.66
+403.13 415.08
+400.00 420.00
+-1.00 -1.00
+1 0
+0
+ 3
+488.00 372.00
+482.19 371.55
+485.32 373.34
+484.87 376.92
+488.00 372.00
+-1.00 -1.00
+1 0
+0
+ 3
+528.00 452.00
+531.00 447.00
+528.00 449.00
+525.00 447.00
+528.00 452.00
+-1.00 -1.00
+1 0
+0
+ 3
+528.00 388.00
+525.00 393.00
+528.00 391.00
+531.00 393.00
+528.00 388.00
+-1.00 -1.00
+1 0
+0
+ 3
+480.00 340.00
+475.00 337.00
+477.00 340.00
+475.00 343.00
+480.00 340.00
+-1.00 -1.00
+1 0
+0
+ 3
+328.00 324.00
+333.00 327.00
+331.00 324.00
+333.00 321.00
+328.00 324.00
+-1.00 -1.00
+1 0
+0
+ 5
+240.00 404.00
+176.00 404.00
+160.00 388.00
+152.00 372.00
+152.00 356.00
+-1.00 -1.00
+1 0
+0
+ 3
+152.00 356.00
+149.00 361.00
+152.00 359.00
+155.00 361.00
+152.00 356.00
+-1.00 -1.00
+1 0
+0
+ 5
+480.00 324.00
+448.00 308.00
+416.00 292.00
+400.00 276.00
+336.00 212.00
+320.00 196.00
+312.00 180.00
+-1.00 -1.00
+1 0
+0
+ 3
+312.00 180.00
+311.55 185.81
+313.34 182.68
+316.92 183.13
+312.00 180.00
+-1.00 -1.00
+1 0
+0
+ 3
+480.00 324.00
+476.87 319.08
+477.32 322.66
+474.19 324.45
+480.00 324.00
+-1.00 -1.00
+1 0
+0
+ -1
diff --git a/share/doc/iso/wisc/figs/unix_ipc.nr b/share/doc/iso/wisc/figs/unix_ipc.nr
new file mode 100644
index 0000000..de24796
--- /dev/null
+++ b/share/doc/iso/wisc/figs/unix_ipc.nr
@@ -0,0 +1,499 @@
+.(z L
+.br
+.nr g1 3155u
+.nr g2 4031u
+.GS C
+.nr g3 \n(.f
+.nr g4 \n(.s
+\0
+.sp -1
+\D's 4u'\D't 1u'
+.sp -1
+.sp 2366u
+\h'2454u'\D'l -17u 27u'\D'l 2u -20u'\D'l -17u -10u'\D'l 32u 3u'
+.sp -1
+.sp 789u
+\h'1534u'\D'l -3u -32u'\D'l 10u 17u'\D'l 20u -2u'\D'l -27u 17u'
+.sp -1
+.sp -789u
+\h'2454u'\D'g -175u 88u -176u 87u -87u 88u -351u 350u -87u 88u -44u 88u'
+.sp -1
+.sp -175u
+\h'657u'\D'l -16u -28u'\D'l 16u 11u'\D'l 17u -11u'\D'l -17u 28u'
+.sp -1
+.sp -263u
+\h'1139u'\D'g -350u 0u -88u 87u -44u 88u 0u 88u'
+.sp -1
+.sp 438u
+\h'1621u'\D'l 28u -17u'\D'l -11u 17u'\D'l 11u 16u'\D'l -28u -16u'
+.sp -1
+.sp -88u
+\h'2454u'\D'l -27u 17u'\D'l 11u -17u'\D'l -11u -16u'\D'l 27u 16u'
+.sp -1
+.sp -263u
+\h'2717u'\D'l -16u -27u'\D'l 16u 11u'\D'l 16u -11u'\D'l -16u 27u'
+.sp -1
+.sp -350u
+\h'2717u'\D'l 16u 27u'\D'l -16u -11u'\D'l -16u 11u'\D'l 16u -27u'
+.sp -1
+.sp 438u
+\h'2498u'\D'l -32u 2u'\D'l 17u -9u'\D'l -2u -20u'\D'l 17u 27u'
+.sp -1
+.sp -263u
+\h'2016u'\D'l 32u -2u'\D'l -18u 9u'\D'l 3u 20u'\D'l -17u -27u'
+.sp -1
+.sp 833u
+\h'2454u'\D'l 8u -31u'\D'l 4u 19u'\D'l 19u 4u'\D'l -31u 8u'
+.sp -1
+.sp -176u
+\h'2586u'\D'l -8u 31u'\D'l -4u -19u'\D'l -19u -4u'\D'l 31u -8u'
+.sp -1
+.sp 44u
+\h'2805u'\D'l 16u 28u'\D'l -16u -11u'\D'l -17u 11u'\D'l 17u -28u'
+.sp -1
+.sp 351u
+\h'2016u'\D'l -28u 16u'\D'l 11u -16u'\D'l -11u -17u'\D'l 28u 17u'
+.sp -1
+.sp -132u
+\h'1621u'\D'l 32u -2u'\D'l -17u 10u'\D'l 3u 19u'\D'l -18u -27u'
+.sp -1
+.sp 570u
+\h'1665u'\D'l 17u -27u'\D'l -2u 20u'\D'l 17u 10u'\D'l -32u -3u'
+.sp -1
+.sp -219u
+\h'2060u'\D'l -8u 31u'\D'l -4u -19u'\D'l -19u -4u'\D'l 31u -8u'
+.sp -1
+.sp 614u
+\h'2542u'\D'l -8u 31u'\D'l -4u -20u'\D'l -19u -4u'\D'l 31u -7u'
+.sp -1
+.sp -439u
+\h'2542u'\D'l -31u -7u'\D'l 19u -4u'\D'l 4u -20u'\D'l 8u 31u'
+.sp -1
+.sp -131u
+\h'2410u'\D'l 31u 8u'\D'l -19u 3u'\D'l -4u 20u'\D'l -8u -31u'
+.sp -1
+\h'2191u'\D'l 17u 27u'\D'l -17u -11u'\D'l -16u 11u'\D'l 16u -27u'
+.sp -1
+.sp 438u
+\h'657u'\D'l 17u 27u'\D'l -17u -10u'\D'l -16u 10u'\D'l 16u -27u'
+.sp -1
+.sp -88u
+\h'1139u'\D'l -27u 17u'\D'l 11u -17u'\D'l -11u -16u'\D'l 27u 16u'
+.sp -1
+.sp 88u
+\h'657u'\D'l 0u 88u'
+.sp -1
+.sp -2016u
+\h'1183u'\D'l -32u 3u'\D'l 17u -10u'\D'l -2u -20u'\D'l 17u 27u'
+.sp -1
+.sp -262u
+\h'1665u'\D'l -16u -27u'\D'l 16u 11u'\D'l 17u -11u'\D'l -17u 27u'
+.sp -1
+.sp -88u
+\h'1665u'\D'l 17u 28u'\D'l -17u -11u'\D'l -16u 11u'\D'l 16u -28u'
+.sp -1
+\h'2498u'\D'l -32u 3u'\D'l 17u -10u'\D'l -2u -19u'\D'l 17u 26u'
+.sp -1
+.sp -262u
+\h'1972u'\D'l 32u -3u'\D'l -17u 10u'\D'l 2u 19u'\D'l -17u -26u'
+.sp -1
+.sp -526u
+\h'2366u'\D'l -7u 31u'\D'l -4u -20u'\D'l -20u -4u'\D'l 31u -7u'
+.sp -1
+.sp 175u
+\h'1928u'\D'l 17u -27u'\D'l -2u 20u'\D'l 17u 9u'\D'l -32u -2u'
+.sp -1
+.sp -44u
+\h'1271u'\D'l -31u -8u'\D'l 19u -4u'\D'l 4u -19u'\D'l 8u 31u'
+.sp -1
+.sp -131u
+\h'1052u'\D'l 31u 7u'\D'l -20u 4u'\D'l -4u 20u'\D'l -7u -31u'
+.sp -1
+.sp 788u
+\h'1665u'\D'l 0u 88u'
+.sp -1
+.sp 438u
+\h'2717u'\D'l 0u 350u'
+.sp -1
+.sp 876u
+\h'2805u'\D'l 0u 570u'
+.sp -1
+.sp -701u
+\h'2016u'\D'l 482u 263u'
+.sp -1
+.sp 438u
+\h'2454u'\D'l -833u 88u'
+.sp -1
+.sp 219u
+\h'2586u'\D'l -132u 176u'
+.sp -1
+.sp 658u
+\h'2410u'\D'l 88u 87u'
+.sp -1
+.sp -395u
+\h'1621u'\D'l 395u 132u'
+.sp -1
+.sp 570u
+\h'1665u'\D'l 395u -219u'
+.sp -1
+.sp 175u
+\h'1928u'\D'l 0u -1490u'
+.sp -1
+\h'1665u'\D'l 263u 0u'
+.sp -1
+.sp -876u
+\h'1665u'\D'l 263u 0u'
+.sp -1
+\h'1008u'\D'l 131u 0u'
+.sp -1
+.sp 876u
+\h'1008u'\D'l 131u 0u'
+.sp -1
+.sp 351u
+\h'2191u'\D'l 0u -701u'
+.sp -1
+.sp -88u
+\h'657u'\D'l 0u -175u'
+.sp -1
+.sp -2366u
+\h'482u'\D'g -395u 701u 0u 526u 0u 438u 0u 614u 88u 87u 438u 0u 1841u 0u 88u -43u'
+.sp -1
+\h'920u'\D'l 263u 175u'
+.sp -1
+.sp -437u
+\h'1972u'\D'l 526u 262u'
+.sp -1
+.sp -526u
+\h'2366u'\D'l -438u 175u'
+.sp -1
+\h'1052u'\D'l 219u 131u'
+.sp -1
+.sp 3505u
+\h'263u'\D'l 263u 0u'
+.sp -1
+\D's -1u'\D't 3u'
+.sp -1
+\h'1490u'\D'l 263u 0u'
+.sp -1
+.ft I
+.ps 12
+.nr g8 \n(.d
+.ds g9 "data flow
+.sp 87u
+\h'613u'\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 12
+.nr g8 \n(.d
+.ds g9 "control flow
+.sp 87u
+\h'1840u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "DoD IP
+.sp -1052u
+\h'2103u'\&\*(g9
+.sp |\n(g8u
+.sp -789u
+\h'2629u'\D'l -31u -8u'\D'l 20u -4u'\D'l 4u -19u'\D'l 7u 31u'
+.sp -1
+.sp -88u
+\h'2498u'\D'l 31u 8u'\D'l -19u 4u'\D'l -4u 19u'\D'l -8u -31u'
+.sp -1
+.sp 175u
+\h'1621u'\D'l 18u -26u'\D'l -3u 19u'\D'l 17u 10u'\D'l -32u -3u'
+.sp -1
+.sp -219u
+\h'2016u'\D'l -8u 31u'\D'l -4u -19u'\D'l -19u -4u'\D'l 31u -8u'
+.sp -1
+.sp -219u
+\h'2016u'\D'l -28u 17u'\D'l 11u -17u'\D'l -11u -16u'\D'l 28u 16u'
+.sp -1
+.sp -131u
+\h'1621u'\D'l 32u -3u'\D'l -17u 10u'\D'l 3u 20u'\D'l -18u -27u'
+.sp -1
+.sp -526u
+\h'1840u'\D'l 17u 27u'\D'l -17u -11u'\D'l -16u 11u'\D'l 16u -27u'
+.sp -1
+.sp 1271u
+\h'1139u'\D'l -27u 16u'\D'l 11u -16u'\D'l -11u -17u'\D'l 27u 17u'
+.sp -1
+.sp -877u
+\h'1139u'\D'l -27u 17u'\D'l 11u -17u'\D'l -11u -16u'\D'l 27u 16u'
+.sp -1
+.sp -350u
+\h'526u'\D'l -17u -28u'\D'l 17u 11u'\D'l 16u -11u'\D'l -16u 28u'
+.sp -1
+.sp -876u
+\h'1490u'\D'l -17u -27u'\D'l 17u 11u'\D'l 16u -11u'\D'l -16u 27u'
+.sp -1
+.sp -88u
+\h'1490u'\D'l 16u 28u'\D'l -16u -11u'\D'l -17u 11u'\D'l 17u -28u'
+.sp -1
+.sp 88u
+\h'2454u'\D'l -27u 17u'\D'l 11u -17u'\D'l -11u -16u'\D'l 27u 16u'
+.sp -1
+.sp -263u
+\h'1928u'\D'l 32u -2u'\D'l -17u 9u'\D'l 2u 20u'\D'l -17u -27u'
+.sp -1
+.sp -482u
+\h'2454u'\D'l -27u 17u'\D'l 11u -17u'\D'l -11u -16u'\D'l 27u 16u'
+.sp -1
+.sp 132u
+\h'1928u'\D'l 28u -17u'\D'l -11u 17u'\D'l 11u 16u'\D'l -28u -16u'
+.sp -1
+.sp -44u
+\h'1227u'\D'l -31u -8u'\D'l 19u -4u'\D'l 4u -19u'\D'l 8u 31u'
+.sp -1
+.sp -132u
+\h'964u'\D'l 32u -2u'\D'l -17u 10u'\D'l 2u 19u'\D'l -17u -27u'
+.sp -1
+.sp 2716u
+\h'1621u'\D'l 395u -219u'
+.sp -1
+.sp -569u
+\h'1621u'\D'l 395u 131u'
+.sp -1
+.sp -307u
+\h'1840u'\D'g 0u -175u 0u -44u'
+.sp -1
+.sp 789u
+\h'2629u'\D'l -131u -88u'
+.sp -1
+.sp 263u
+\h'1840u'\D'l 0u -1052u'
+.sp -1
+\h'1665u'\D'l 175u 0u'
+.sp -1
+.sp -877u
+\h'1665u'\D'l 175u 0u'
+.sp -1
+.sp 877u
+\h'1008u'\D'l 131u 0u'
+.sp -1
+.sp -877u
+\h'1008u'\D'l 131u 0u'
+.sp -1
+.sp -701u
+\h'1139u'\D'g -350u 0u -176u 88u -87u 175u 0u 88u'
+.sp -1
+.sp -613u
+\h'1490u'\D'l 0u 88u'
+.sp -1
+.sp -175u
+\h'1928u'\D'l 526u 263u'
+.sp -1
+.sp -482u
+\h'2454u'\D'l -526u 132u'
+.sp -1
+.sp -44u
+\h'964u'\D'l 263u 132u'
+.sp -1
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "proto n
+.sp 2936u
+\h'1271u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "proto 1
+.sp 2015u
+\h'1271u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "mbufs
+.sp 1752u
+\h'2586u'\&\*(g9
+.sp |\n(g8u
+.sp 2892u
+\h'1139u'\D'c 525u'
+.sp -1
+.sp -877u
+\h'1139u'\D'c 525u'
+.sp -1
+.sp 351u
+\h'2016u'\D'c 525u'
+.sp -1
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "switch
+.sp 219u
+\h'438u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "protocol
+.sp -88u
+\h'438u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "transport
+.sp -351u
+\h'438u'\&\*(g9
+.sp |\n(g8u
+.sp -701u
+\h'263u'\D'l 0u 1402u'\D'l 701u 0u'\D'l 0u -1402u'\D'l -701u 0u'
+.sp -1
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "sockets
+.sp -351u
+\h'1402u'\&\*(g9
+.sp |\n(g8u
+.sp -439u
+\h'1139u'\D'c 876u'
+.sp -1
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "tables
+.sp -263u
+\h'2586u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "routing
+.sp -394u
+\h'2586u'\&\*(g9
+.sp |\n(g8u
+.sp -350u
+\h'2454u'\D'c 525u'
+.sp -1
+.sp -1051u
+\h'2366u'\D'c 701u'
+.sp -1
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "management
+.sp 131u
+\h'2454u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "network
+\h'2498u'\&\*(g9
+.sp |\n(g8u
+\D's 4u'\D't 1u'
+.sp -1
+.sp 438u
+\h'1183u'\D'l 789u 0u'
+.sp -1
+.ft I
+.ps 12
+.nr g8 \n(.d
+.ds g9 "kernel
+.sp 176u
+\&\*(g9
+.sp |\n(g8u
+.ft I
+.ps 12
+.nr g8 \n(.d
+.ds g9 "user
+.sp -87u
+\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "drivers
+.sp 2892u
+\h'2629u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "interface
+.sp 2760u
+\h'2629u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "network
+.sp 2629u
+\h'2629u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "clock
+.sp 438u
+\h'613u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "system calls
+.sp 219u
+\h'1358u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "C library
+.sp -87u
+\h'1402u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "user
+.sp -482u
+\h'657u'\&\*(g9
+.sp |\n(g8u
+.ft B
+.ps 12
+.nr g8 \n(.d
+.ds g9 "program
+.sp -350u
+\h'613u'\&\*(g9
+.sp |\n(g8u
+\D's -1u'\D't 3u'
+.sp -1
+.sp 44u
+\h'1183u'\D'c 788u'
+.sp -1
+.sp 2629u
+\h'2454u'\D'c 701u'
+.sp -1
+.sp -1184u
+\h'2454u'\D'c 525u'
+.sp -1
+.sp -1051u
+\h'438u'\D'c 525u'
+.sp -1
+.sp -876u
+\h'526u'\D'c 525u'
+.sp -1
+.sp 438u
+\h'1183u'\D'l -1183u 0u'
+.sp -1
+\h'1972u'\D'l 1183u 0u'
+.sp -1
+.sp 1270u
+\h'1928u'\D'l 17u 28u'\D'l -17u -11u'\D'l -16u 11u'\D'l 16u -28u'
+.sp -1
+.sp 1972u
+\D't 3u'\D's -1u'
+.br
+.ft \n(g3
+.ps \n(g4
+.GE
+.ce
+\fBFigure \n+(FG\fR: IPC in 4.2 Unix
+.)z
diff --git a/share/doc/iso/wisc/intro.nr b/share/doc/iso/wisc/intro.nr
new file mode 100644
index 0000000..5e03515
--- /dev/null
+++ b/share/doc/iso/wisc/intro.nr
@@ -0,0 +1,76 @@
+.NC "Introduction"
+.sh 1 "Introduction"
+.pp
+This document describes the design and implementation of the ISO
+transport and network layers written for the ACIS Operating System,
+the IBM ACIS port of Berkeley 4.3 Unix\**
+.(f
+\** Unix is a registered trademark of AT&T.
+.)f
+for the IBM RT PC,
+hereafter called AOS.
+Collectively, this work is called the Wisconsin ARGO kernel.
+The ARGO kernel supports the
+the connection-oriented ISO transport service (COTS), the
+ISO connectionless network service (CLNS)
+and a
+connection-oriented network service (CONS).
+The COTS is provided by the ISO transport protocol TP,
+ISO 8073 Revised.
+The CLNS is provided by the connectionless network protocol,
+ISO 8473.
+The CONS is provided by the X.25 protocols.
+The ARGO implementation of the CONS is not a complete
+ISO CONS, but contains enough of the CONS to support
+the COTS and the CLNS (in the latter case, the CONS can be
+viewed as a subnetwork service).
+.pp
+The purposes of this document are
+.ip "1) "
+to describe the transport service and the software interface
+between the user and provider of this service,
+.ip "2) "
+to describe the network service and the software interface it
+provides,
+.ip "3) "
+to describe the design of the software which provides
+these services, and
+.ip "4) "
+to provide a guide for readers who are perusing or maintaining
+the ARGO kernel source code.
+.pp
+It is assumed that the reader is familiar with the \fBC\fR
+programming language,
+with Unix conventions, and with the ISO specifications listed in Appendix A.
+.sh 1 "Organization"
+.pp
+This document is composed of several chapters.
+Chapter One contains this introduction. Chapter Two presents a
+definition of terms and phrases used throughout the document.
+Chapter Three describes the transport service interface, which is
+the interface between the transport protocol implementation software and the transport user software.
+Chapter Four describes the network service interface, and the interface
+above and below the network layer.
+Chapter Five explains the format of an OSI address.
+Chapter Six describes the
+the architecture of the interprocess communication support in the
+kernel, which to a large degree mandates
+the design of a protocol implementation for a 4.3 Unix kernel.
+Chapter Seven describes the design of this transport
+protocol implementation,
+including descriptions of implementation options.
+Chapter Eight describes the design of the network layer implementation.
+Chapter Nine describes the way errors are handled in the system.
+Chapter Ten summarizes the methods used for
+testing and debugging the ARGO kernel.
+Appendix A is a list of the applicable ISO standards.
+.\" The manual pages relevant to the transport and network layers
+.\" are included as Appendix B.
+.pp
+Several conventions are followed in this document.
+All procedure names and system call names are followed
+by a pair of parentheses, for example,
+\fIread()\fR.
+References to manual pages consist of the name of the
+manual page, followed by the section in which
+the man page is found: \fIread(2)\fR.
diff --git a/share/doc/iso/wisc/ipc.nr b/share/doc/iso/wisc/ipc.nr
new file mode 100644
index 0000000..9f9d962
--- /dev/null
+++ b/share/doc/iso/wisc/ipc.nr
@@ -0,0 +1,372 @@
+.NC "The Design of Unix IPC"
+.sh 1 "General"
+.pp
+The ARGO implementation of
+TP and CLNP was designed to fit into the AOS
+kernel
+as easily as possible.
+All the standard protocol hooks are used.
+To understand the design, it is useful to have
+read
+Leffler, Joy, and Fabry:
+\*(lq4.2 BSD Networking Implementation Notes\*(rq July 1983.
+This section describes the
+design of the IPC support in the AOS kernel.
+.sh 1 "Functional Unit Overview"
+.pp
+The
+AOS
+kernel
+is a monolithic program of considerable size and complexity.
+The code can be separated into parts of distinct function,
+but there are no kernel processes per se.
+The kernel code is either executed on behalf of a user
+process, in which case the kernel was entered by a system call,
+or it is executed on behalf of a hardware or software interrupt.
+The following sections describe briefly the major functional units
+of the kernel.
+.\" FIGURE
+.so figs/func_units.nr
+.CF
+shows the arrangement of these kernel units and
+their interactions.
+.sh 2 "The file system."
+.pp
+.sh 2 "Virtual memory support."
+.pp
+This includes protection, swapping, paging, and
+text sharing.
+.sh 2 "Blocked device drivers (disks, tapes)."
+.pp
+All these drivers share some minor functional units,
+such as buffer management and bus support
+for the various types of busses on the machine.
+.sh 2 "Interprocess communication (IPC)."
+.pp
+This includes
+support for various protocols,
+buffer management, and a standard interface for inter-protocol
+communication.
+.sh 2 "Network interface drivers."
+.pp
+These drivers are closely tied to the IPC support.
+They use the IPC's buffer management unit rather
+than the buffers used by the blocked device drivers.
+The interface between these drivers and the rest of the kernel
+differs from the interface used by the blocked devices.
+.sh 2 "Tty driver"
+.pp
+This is terminal support, including the user interface
+and the device drivers.
+.sh 2 "System call interface."
+.pp
+This handles signals, traps, and system calls.
+.sh 2 "Clock."
+.pp
+The clock is used in various forms by many
+other units.
+.sh 2 "User process support (the rest)."
+.pp
+This includes support for accounting, process creation,
+control, scheduling, and destruction.
+.pp
+.sh 2 "IPC"
+.pp
+The major functional unit that supports IPC
+can be divided into the following smaller functional
+units.
+.sh 3 "Buffer management."
+.pp
+All protocols share a pool of buffers called \fImbufs\fR:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct mbuf {
+.T&
+l l l l.
++struct mbuf+*m_next;+/* next buffer in chain */
++u_long+m_off;+/* offset of data */
++short+m_len;+/* amount of data */
++short+m_type;+/* mbuf type (0 == free) */
++u_char+m_dat[MLEN];+/* data storage */
++struct mbuf+*m_act;+/* link in 2-d structure */
+};
+.TE
+\fR
+.)b
+.pp
+There are two forms of mbufs - small ones and large ones.
+Small ones are 128 octets in
+AOS
+and 256 octets
+in the ARGO release. Small mbufs are copied by byte-to-byte
+copies.
+The data in these mbufs are kept in the character
+array field \fIm_dat\fR in the mbuf structure
+itself.
+For this type of mbuf, the field \fIm_off\fR is positive,
+and is the offset to the beginning of the data from
+the beginning of the mbuf structure itself.
+Large mbufs, called \fIclusters\fR, are page-sized
+and page-aligned.
+They may be \*(lqcopied\*(rq by multiply mapping the pages they occupy.
+They consist of a page of memory plus a small mbuf structure
+whose fields are used
+to link clusters into chains, but whose \fIm_dat\fR array is
+not used.
+The \fIm_off\fR field of the structure
+is the offset (positive or negative) from the
+beginning of the mbuf structure to the beginning
+of the data page part of the cluster.
+In the case of clusters, the offset is always out of the
+bounds of the \fIm_dat\fR array and so it is alway possible
+to tell from the \fIm_off\fR field whether an mbuf structure
+is part of a cluster or is a small mbuf.
+All mbufs permanently reside in memory.
+The mbuf management unit manages its own page table.
+The mbuf manager keeps limited statistics on the quantities and
+types of buffers in use.
+Mbufs are used for many purposes, and most of these purposes
+have a type associated with them.
+Some of the types that buffers may take are
+MT_FREE (not allocated), MT_DATA,
+MT_HEADER, MT_SOCKET (socket structure),
+MT_PCB (protocol control block),
+MT_RTABLE (routing tables),
+and
+MT_SOOPTS (arguments passed to \fIgetsockopt()\fR and
+\fIsetsockopt()\fR.
+Data are passed among functional units by means
+of queues, the contents of which are
+either chains of mbufs or groups of chains of mbufs.
+Mbufs are linked into chains with the \fIm_next\fR field.
+Chains of mbufs are linked into groups with the \fIm_act\fR
+field.
+The \fIm_act\fR field allows a protocol to retain packet
+boundaries in a queue of mbufs.
+.sh 3 "Routing."
+.pp
+Routing decisions in the kernel are made by the procedure \fIrtalloc()\fR.
+This procedure will scan the kernel routing tables (stored in mbufs)
+looking for a route. A route is represented by
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct rtentry {
+.T&
+l l l l.
++u_long+rt_hash;+/* to speed lookups */
++struct sockaddr+rt_dst;+/* key */
++struct sockaddr+rt_gateway;+/* value */
++short+rt_flags;+/* up/down?, host/net */
++short+rt_refcnt;+/* # held references */
++u_long+rt_use;+/* raw # packets forwarded */
++struct ifnet+*rt_ifp;+/* interface to use */
+}
+.TE
+\fR
+.)b
+When looking for a route, \fIrtalloc()\fR will first hash the entire destination
+address, and scan the routing tables looking for a complete route. If a route
+is not found, then \fIrtalloc()\fR will rescan the table looking for a route
+which matches the \fInetwork\fR portion of the address. If a route is still
+not found, then a default route is used (if present).
+.pp
+If a route is found, the entity which called \fIrtalloc()\fR can use information
+from the \fIrtentry\fR structure to dispatch the datagram. Specifically, the
+datagram is queued on the interface identified by the interface
+pointer \fIrt_ifp\fR.
+.sh 3 "Socket code."
+.pp
+This is the protocol-independent part of the IPC support.
+Each communication endpoint (which may or may not be associated
+with a connection) is represented by the following structure:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct socket {
+.T&
+l l l l.
++short+so_type;+/* type, e.g. SOCK_DGRAM */
++short+so_options;+/* from socket call */
++short+so_linger;+/* time to linger @ close */
++short+so_state;+/* internal state flags */
++caddr_t+so_pcb;+/* network layer pcb */
++struct protosw+*so_proto;+/* protocol handle */
++struct socket+*so_head;+/* ptr to accept socket */
++struct socket+*so_q0;+/* queue of partial connX */
++short+so_q0len;+/* # partials on so_q0 */
++struct socket+*so_q;+/* queue of incoming connX */
++short+so_qlen;+/* # connections on so_q */
++short+so_qlimit;+/* max # queued connX */
++struct sockbuf+{
+++short+sb_cc;+/* actual chars in buffer */
+++short+sb_hiwat;+/* max actual char count */
+++short+sb_mbcnt;+/* chars of mbufs used */
+++short+sb_mbmax;+/* max chars of mbufs to use */
+++short+sb_lowat;+/* low water mark (not used yet) */
+++short+sb_timeo;+/* timeout (not used ) */
+++struct mbuf+*sb_mb;+/* the mbuf chain */
+++struct proc+*sb_sel;+/* process selecting */
+++short+sb_flags;+/* flags, see below */
++} so_rcv, so_snd;
++short+so_timeo;+/* connection timeout */
++u_short+so_error;+/* error affecting connX */
++short+so_oobmark;+/* oob mark (TCP only) */
++short+so_pgrp;+/* pgrp for signals */
+}
+.TE
+\fR
+.)b
+.pp
+The socket code maintains a pair of queues for each socket,
+\fIso_rcv\fR and \fIso_snd\fR.
+Each queue is associated with a count of the number of characters
+in the queue, the maximum number of characters allowed to be put
+in the queue, some status information (\fIsb_flags\fR), and
+several unused fields.
+For a send operation, data are copied from the user's address space
+into chains of mbufs.
+This is done by the socket module, which then calls the underlying
+transport protocol module to place the data
+on the send queue.
+This is generally done by
+appending to the chain beginning at \fIsb_mb\fR.
+The socket module copies data from the \fIso_rcv\fR queue
+to the user's address space to effect a receive operation.
+The underlying transport layer is expected to have put incoming
+data into \fIso_rcv\fR by calling procedures in this module.
+.in -5
+.sh 3 "Transport protocol management."
+.pp
+All protocols and address types must be \*(lqregistered\*(rq in a
+common way in order to use the IPC user interface.
+Each protocol must have an entry in a protocol switch table.
+Each entry takes the form:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct protosw {
+.T&
+l l l l.
++short+pr_type;+/* socket type used for */
++short+pr_family;+/* protocol family */
++short+pr_protocol;+/* protocol # from the database */
++short+pr_flags;+/* status information */
++++/* protocol-protocol hooks */
++int+(*pr_input)();+/* input (from below) */
++int+(*pr_output)();+/* output (from above) */
++int+(*pr_ctlinput)();+/* control input */
++int+(*pr_ctloutput)();+/* control output */
++++/* user-protocol hook */
++int+(*pr_usrreq)();+/* user request: see list below */
++++/* utility hooks */
++int+(*pr_init)();+/* initialization hook */
++int+(*pr_fasttimo)();+/* fast timeout (200ms) */
++int+(*pr_slowtimo)();+/* slow timeout (500ms) */
++int+(*pr_drain)();+/* free some space (not used) */
+}
+.TE
+\fR
+.)b
+.pp
+Associated with each protocol are the types of socket
+abstractions supported by the protocol (\fIpr_type\fR), the
+format of the addresses used by the protocol (\fIpr_family\fR),
+the routines to be called to perform
+a standard set of protocol functions (\fIpr_input\fR,...,\fIpr_drain\fR),
+and some status information (\fIpr_flags\fR).
+The field pr_flags keeps such information as
+SS_ISCONNECTED (this socket has a peer),
+SS_ISCONNECTING (this socket is in the process of establishing
+a connection),
+SS_ISDISCONNECTING (this socket is in the process of being disconnected),
+SS_CANTSENDMORE (this socket is half-closed and cannot send),
+SS_CANTRCVMORE (this socket is half-closed and cannot receive).
+There are some flags that are specific to the TCP concept
+of out-of-band data.
+A flag SS_OOBAVAIL was added for the ARGO implementation, to support
+the TP concept of out-of-band data (expedited data).
+.sh 3 "Network Interface Drivers"
+.pp
+The drivers for the devices attaching a Unix machine to a network
+medium share a common interface to the protocol
+software.
+There is a common data structure for managing queues,
+not surprisingly, a chain of mbufs.
+There is a set of macros that are used to enqueue and
+dequeue mbuf chains at high priority.
+A driver
+delivers an indication to a protocol entity when
+an incoming packet has been placed on a queue by
+issuing a
+software
+interrupt.
+.sh 3 "Support for individual protocols."
+.pp
+Each protocol is written as a separate functional unit.
+Because all protocols share the clock and the mbuf pool, they
+are not entirely insulated from each other.
+The details of TP are described in a section that
+follows.
+.\"*****************************************************
+.\" FIGURE
+.so figs/unix_ipc.nr
+.pp
+.CF
+shows the arrangement of the IPC support.
+.pp
+The AOS
+IPC was designed for DoD Internet protocols, all of
+which run over DoD IP.
+The assumptions that DoD Internet is the domain
+and that DoD IP is the network layer
+appear in the code and data structures in numerous places.
+For example, it is assumed that addresses can be compared
+by a bitwise comparison of 4 octets.
+Another example is that the transport protocols all directly call
+IP routines.
+There are no hooks in the data structures through
+which the transport layer can choose a network level protocol.
+A third example is that the host's local addresses
+are stored in the network interface drivers and the drivers
+have only one address - an Internet address.
+A fourth example is that headers are assumed to
+fit in one small mbuf (112 bytes for data in AOS).
+A fifth example is this:
+It is assumed in many places that buffer space is managed
+in units of characters or octets.
+The user data are copied from user address space into the kernel mbufs
+amorphously
+by the socket code, a protocol-independent part of the kernel.
+This is fine for a stream protocol, but it means that a
+packet protocol, in order to \*(lqpacketize\*(rq the data,
+must perform a memory-to-memory copy
+that might have been avoided had the protocol layer done the original
+copy from user address space.
+Furthermore, protocols that count credit in terms of packets or
+buffers rather than characters do not work efficiently because
+the computation of buffer space is not in the protocol module,
+but rather it is in the socket code module.
+This list of examples is not complete.
+.pp
+To summarize, adding a new transport protocol to the kernel consists of
+adding entries to the tables in the protocol management
+unit,
+modifying the network interface driver(s) to recognize
+new network protocol identifiers,
+adding the
+new system calls to the kernel and to the user library,
+and
+adding code modules for each of the protocols,
+and correcting deficiencies in the socket code,
+where the assumptions made about the nature of
+transport protocols do not apply.
diff --git a/share/doc/iso/wisc/macros.nr b/share/doc/iso/wisc/macros.nr
new file mode 100644
index 0000000..a3624c9
--- /dev/null
+++ b/share/doc/iso/wisc/macros.nr
@@ -0,0 +1,50 @@
+.\"
+.\" Macro to initialize chapter macros
+.\"
+.de IC
+.nr CN 0 1
+..
+.\"
+.\" Macro to begin new chapter
+.\"
+.de NC
+.he 'ARGO Kernel Programmer\'s Guide''Chapter \\n+(CN'
+.bp
+.sh 0 "_" 1 1 1 1 1 1
+.sz +2
+.(l C
+CHAPTER \\n(CN
+
+\fB\\$1\fR
+.)l
+.sp 1
+.(x
+Chapter \\n(CN \\$1
+.)x
+.sz -2
+..
+.\"
+.\" Figure conventions:
+.\" 1) do .so of figure source - figure reg incremented here
+.\" 2) make references to figure via CF
+.\"
+.\"
+.\" Macro to initialize figure register
+.\"
+.de IF
+.nr FG 0 1
+..
+.\"
+.\" Macro for current figure number
+.\"
+.de CF
+Figure \\n(FG
+..
+.\"
+.\" Define this macro to include section headings in table of contents
+.\"
+.de $0
+.(x
+Section \\$2 \\$1
+.)x
+..
diff --git a/share/doc/iso/wisc/net_design.nr b/share/doc/iso/wisc/net_design.nr
new file mode 100644
index 0000000..d066f8e
--- /dev/null
+++ b/share/doc/iso/wisc/net_design.nr
@@ -0,0 +1,1139 @@
+.NC "The Design of the ARGO Network Layer"
+.sh 1 "Connectionless Network Layer
+.pp
+The following sections describe the design of the ARGO
+connectionless network layer (CLNL).
+The connectionless network service is provided by several
+network-layer protocols: ES-IS (ISO 9542),
+CLNP (ISO 8348), and (ISO 8208) X.25.
+The protocol CLNP is the primary connectionless network layer
+protocol.
+It is supported by X.25 when X.25 is used as a subnetwork layer.
+X.25 can also be viewed as a link layer protocol in this context.
+The ES-IS protocol supports CLNP by providing the following functions:
+.ip \(bu 5
+automatic mapping of NSAP-addresses to SNPA addresses,
+.ip \(bu 5
+automatic configuration of networks of end systems and intermediate
+systems, and
+.ip \(bu 5
+redirection of network-layer traffic in response to
+configuration changes.
+.pp
+The rest of this chapter describes the design of
+CLNP, the design of ES-IS,
+and the design of the connection-oriented
+network layer, including the connection-oriented subnetwork service (X.25).
+.pp
+CLNP has two subsets defined: the Inactive Network Layer
+protocol subset and the Non-Segmenting protocol subset.
+The Inactive Network Layer subset is a null-function subset
+in which the CLNP is not needed, and the
+protocol consists of sending
+a 1-byte header containing the value zero.
+This "subset" is not supported in ARGO.
+.pp
+The Non-Segmenting protocol subset permits simplification of the DT NPDU
+header when it is known that segmentation of the DT NPDU is not required.
+ARGO supports this subset.
+When this subset is used,
+the segmentation part of the DT NPDU (data packet) header is not present,
+and the \fIdon't segment\fR bit is set in the
+fixed part of the header.
+This subset is chosen by setting the bit
+\fICLNP_NO_SEG\fR in the \fIflags\fR argument to \fIclnp_output()\fR.
+.pp
+Throughout the remainder of this
+document,
+following definitions apply:
+.(b
+\(bu DT NPDU: data transfer NPDU.
+\(bu ER NPDU: error report NPDU.
+\(bu NPDU: either an ER or DT NPDU.
+.)b
+.sh 2 "DT NPDU Output"
+.pp
+A CLNP DT NPDU is transmitted by calling \fIclnp_output()\fR.
+.so figs/clnp_output.nr
+.\" FIGURE
+.CF
+outlines the sequence of steps taken by \fIclnp_output()\fR when
+transmitting an NPDU.
+The solid lines indicate normal flow of control. The
+dashed lines indicate possible error returns (with associated
+error code).
+.pp
+\fIClnp_output()\fR will automatically cache (in the \fIisopcb\fR)
+the header of each packet it sends. This cached copy of the header
+is used on subsequent sends reducing the amount of time spent generating
+the header. Therefore, the first action \fIclnp_output()\fR takes is to
+examine the cached header (if any). If the header is still valid (see below)
+then it is used. Otherwise, a new header is built.
+.sh 3 "When The Cached Header Is Invalid"
+.pp
+Before any resources are allocated, the options to be sent with the packet
+are examined. If any unsupported options are present, the error \fIEINVAL\fR
+is returned.
+Next, the length of the source and destination
+NSAP addresses (taken from the \fIisopcb\fR)
+are checked. The source address length may be zero. This
+indicates that \fIclnp_output()\fR should compute the source address based upon
+the route taken, in which case CLNP calls
+the function \fIclnp_srcroute()\fR.
+Source routing
+will be discussed in detail later in this section.
+If, in the process of checking
+the address lengths, an invalid length is detected, the error
+\fIENAMETOOLONG\fR is returned.
+.pp
+After checking the lengths of the addresses,
+CLNP allocates an \fImbuf\fR in which the DT NPDU header will be constructed.
+If an \fImbuf\fR cannot be found, the error
+\fIENOBUFS\fR is returned. Once the \fImbuf\fR is allocated,
+the fixed part of the DT NPDU header is copied into the \fImbuf\fR.
+.pp
+The next step is to route the DT NPDU. This is accomplished by the
+\fIclnp_route()\fR function.
+It is necessary to route the datagram early in the output process because
+in many cases, the source address will not be known until the route
+has been created.
+When a system is multi-homed it has several source addresses.
+The source address to choose depends on the
+network interface (thus, the route) used.
+.pp
+The address part of the DT NPDU follows the fixed part.
+Since appending the address part is the next task,
+the source address must be determined.
+Therefore the route must be determined.
+.pp
+After appending the address part to the fixed part of the
+NPDU header, CLNP
+appends any options given in the arguments to
+\fIclnp_output()\fR.
+The options are specified in a
+separate \fImbuf\fR stored in the \fIiso_pcb\fR.
+If this \fImbuf\fR
+pointer is not null, a copy of the \fImbuf\fR is made, and this copy is
+chained (appended) to the
+\fImbuf\fR in which the
+NPDU header resides. The options \fImbuf\fR linked in with the DT packet
+must be a copy of the options \fImbuf\fR passed to \fIclnp_output()\fR. If
+this was not done, then
+the options \fImbuf\fR passed would be freed by the interface
+driver after the NPDU had been transmitted.
+Since a copy must be made, it is possible for \fIclnp_output()\fR to
+return \fIENOBUFS\fR at this time.
+A later section of this chapter describes
+the handling of options in greater detail.
+.pp
+User data for the packet are passed to
+\fIclnp_output()\fR as an \fImbuf\fR chain.
+This \fImbuf\fR chain is appended to the DT NPDU header chain.
+At this point, the DT NPDU is ready for transmission.
+If header caching has not been disabled, a cache entry is made in the
+\fIisopcb\fR.
+If the size of the entire packet
+is less than the maximum transmission unit (MTU) of the
+network interface to be used,
+the packet is placed on the queue for that network interface,
+otherwise \fIclnp_fragment()\fR is invoked to
+break up the packet into smaller packets, called
+"derived NPDUs", and transmit the derived NPDUs.
+.sh 3 "When A Cached Header Exists"
+.pp
+In this case, \fIclnp_output()\fR updates the segmentation part of the
+header (if segmenting is permitted), computes the checksum, and transmits
+(or fragments) the packet.
+.pp
+The cached CLNP header is stored in the \fIstruct isopcb\fR. The field
+\fIisop_clnpcache\fR within the \fIisopcb\fR points to an \fImbuf\fR
+which contains a \fIstruct clnp_cache\fR:
+.(b
+\fC
+.TS
+tab(+);
+l s s.
+struct clnp_cache {
+.T&
+l l l l.
++u_short+cni_securep;+/* ptr to security option */
++struct iso_addr+clc_dst;+/* destination of packet */
++struct mbuf+*clc_options;+/* ptr to options mbuf */
++int+clc_flags;+/* flags passed to clnp_output */
++int+clc_segoff;+/* offset of seg part of header */
++struct sockaddr+*clc_firsthop;+/* first hop of packet */
++struct ifnet+*clc_ifp;+/* ptr to interface */
++struct mbuf+*clc_hdr;+/* cached pkt hdr (finally)! */
+};
+.TE
+\fR
+.)b
+The first three fields \fIclc_dst, clc_options\fR and \fIclc_flags\fR
+are used to check the validity of the cache entry. The cache is considered
+valid if:
+.ip \(bu 5
+The options mbuf has not changed.
+.ip \(bu 5
+The destination of the packet has not changed.
+.ip \(bu 5
+The route still exists and is up.
+.ip \(bu 5
+The flags have not changed.
+.pp
+If all these conditions are met, then the bulk of the \fIclnp_output()\fR
+processing is avoided. The fields \fIclc_segoff, clc_firsthop,\fR
+and \fIclc_ifp\fR are used by \fIclnp_output()\fR to transmit the packet.
+The field \fIclc_ifp\fR contains the actual cached header which is copied
+and then enqueued on the outgoing interface.
+.sh 2 "NPDU Input"
+.pp
+.\" FIGURE
+.so figs/clnp_input.nr
+All CLNP NPDUs are processed by \fIclnp_input()\fR.
+.CF
+outlines
+the flow of control within \fIclnlintr()\fR and \fIclnp_input()\fR.
+The solid lines
+indicate normal flow of control. The dashed lines indicate
+possible error returns.
+.pp
+\fIClnlintr()\fR is invoked by a software interrupt.
+This interrupt is posted by a device driver whenever a
+packet is placed in CLNL's input queue
+\fIclnlintrq()\fR, and the queue is empty.
+It is the responsibility of \fIclnlintr()\fR, when invoked,
+to process all packets present on the input queue.
+Thus, to begin the task of processing a packet, \fIclnlintr()\fR
+removes the next packet from the queue.
+When an error is discovered during processing, the packet is discarded and
+\fIclnlintr()\fR begins afresh.
+.pp
+Once removed, the type of the NPDU is checked. If the NPDU is an
+ES-IS packet, then \fIesis_input()\fR is called. If the NPDU is a CLNP
+packet, then \fIclnp_input()\fR is called. Other packets are silently
+discarded.
+The function \fIclnp_hdr_ck()\fR checks the NPDU for consistency.
+Before checking consistency, \fIclnp_hdr_ck()\fR insures
+that the entire NPDU header is located
+contigiously in a single \fImbuf\fR (\fIm_pullup()\fR\** performs this task).
+.(f
+\** If the NPDU header is larger than \fIMLEN\fR (currently 256), then
+\fIm_pullup()\fR will allocate a cluster \fImbuf\fR.
+.)f
+After "pulling" the header into a single \fImbuf\fR, \fIclnp_hdr_ck()\fR
+checks for the proper CLNP version and protocol identification.
+It also checks that the lifetime field is greater than zero.
+After checking header consistency, the NPDU checksum is computed.\**
+.(f
+\** If the checksum value is zero, the checksum is not computed.
+The value zero is reserved to mean \*(lqdo not use checksum\*(rq.
+.)f
+If the checksum is valid, \fIclnp_data_ck()\fR is called to insure
+that the amount of data in the \fImbuf\fR chain corresponds to the
+amount indicated in the NPDU header.
+.pp
+Once the consistency of the NPDU has been assured, the various parts of the
+packet are extracted.
+Care is taken with each extraction to insure that an attempt is not made
+to address data that does not really exist. (Such an attempt could
+result in a kernel trap).
+.pp
+Next, the options part of the NPDU, if present, is checked for validity.
+If unsupported options are found, the packet is discarded.
+See the section \*(lqNPDU options\*(rq for details of options processing.
+.pp
+Finally, after the preceding checks and extractions have been made, the
+destination address is examined.
+If the address indicates that the packet's destination is not this
+system, the packet is forwarded by calling \fIclnp_forward()\fR.
+See the section \*(lqDT NPDU Forwarding\*(rl for details of packet forwarding.
+If this end system is the
+packet's destination, processing continues.
+.pp
+If the packet is not complete, it is passed to \fIclnp_reass()\fR for
+reassembly.
+See the section \*(lqDT NPDU Reassembly\*(rq
+for details of packet reassembly.
+.pp
+At this point, a complete NPDU is in hand.
+If the NPDU is a DT NPDU, it is given to the transport layer
+by calling the TP input routine.
+Otherwise, it is give to the ER NPDU processing function,
+\fIclnp_er_input()\fR.
+.sh 3 "DT NPDU Forwarding"
+.pp
+Packet forwarding is accomplished by \fIclnp_forward()\fR.
+This is performed regardless of the system's type (end or intermediate).
+The task of
+forwarding a packet is fairly straight-forward. First, the lifetime
+field of the datagram is decremented.
+If this operation changes the value to zero, the packet is discarded.
+.pp
+If the source route option is present, and the address at the top of the list
+matches an address of one of the system's network interfaces, then
+the next-source-route-to-be-used offset is adjusted in the option.
+Next, the packet is routed by \fIclnp_route()\fR
+or \fIclnp_srcroute()\fR.
+If the record route option is present, the address of the outgoing
+network interface is recorded by \fIclnp_dooptions()\fR.
+.pp
+Finally the packet is dispatched.
+If the size of the entire packet is less than the MTU of the output
+network interface, the packet is enqueued for that interface,
+otherwise \fIclnp_fragment()\fR is invoked to
+fragment the packet and enqueue the derived NPDUs.
+.sh 2 "NPDU Options"
+.pp
+The options section of an NPDU consists of a series of triplets:
+\fIoption identification\fR, \fIoption length\fR,
+and \fIoption value\fR.
+These triplets are checked each time the options are examined or changed.
+To avoid repeated parsing of the options, the ARGO CLNP
+maintains an index.
+This index is organized as a \fIclnp_optidx\fR structure.
+This structure is shown below.
+.(b
+\fC
+.TS
+tab(+);
+l s s.
+struct clnp_optidx {
+.T&
+l l l l.
++u_short+cni_securep;+/* ptr to security option */
++char+cni_secure_len;+/* length of security option */
++u_short+cni_srcrt_s;+/* offset of src rt option */
++u_short+cni_srcrt_len;+/* length of src rt option */
++u_short+cni_recrtp;+/* ptr to head of recrt option */
++char+cni_recrt_len;+/* length of recrt option */
++char+cni_priorp;+/* ptr to priority option */
++u_short+cni_qos_formatp;+/* ptr to format of qos option */
++char+cni_qos_len;+/* length of qos option */
++char+cni_er_reason;+/* reason from ER pdu option */
+};
+.TE
+.)b
+This index allows CLNP quickly to discover the existence
+and value of an option.
+For example, if a security option is present, the \fIcni_securep\fR
+field of the option index is non-zero and the value of
+\fIcni_securep\fR is an offset to the beginning of the
+security option.
+The function \fIclnp_opt_sanity()\fR
+parses the options and computes the index.
+While parsing, it also verifies that the
+options are valid and correctly structured.
+If an error occurs while parsing an option,
+\fIclnp_opt_sanity()\fR returns an error code.
+The following sections describe how options are processed
+during the send, forward and receive operations.
+.sh 3 "Sending Options"
+.pp
+Options to be sent with a datagram are passed to \fIclnp_output()\fR as
+two arguments. An option index is passed along with an \fImbuf\fR
+containing the options.
+The options in the \fImbuf\fR must be formatted
+exactly as specified by CLNP.
+If the security, quality of service, or
+priority options are specified, \fIclnp_output()\fR will not transmit the
+datagram and \fIEINVAL\fR is returned.
+The system call \fIsetsockopt()\fR is used to set the CLNP options
+to be sent on a datagram.
+See \fIclnp(4)\fR for more information about setting CLNP options.
+.pp
+If a source route is specified,
+the normal CLNP routing function \fIclnp_route()\fR is not used, and
+\fIclnp_srcroute()\fR is invoked.
+.pp
+When the DECBIT config option is specified, \fIclnp_output\fR will
+automatically add the globally unique quality of service option to the packet.
+The sequencing preferred and low delay bits in this option are set.
+.sh 3 "Forwarding Options"
+.pp
+During packet forwarding, the padding, security,
+and priority options are ignored. If record route is selected, the
+function \fIclnp_dooptions()\fR logs the current network
+interface address in the record route list.
+.pp
+If a source route is specified,
+the normal CLNP routing function \fIclnp_route()\fR is not used, and
+\fIclnp_srcroute()\fR is invoked.
+.sh 4 "The Congestion Experienced Bit"
+.pp
+If a packet is forwarded containing the globally unique quality of
+service option, and the interface through which the packet will be
+transmitted has a queue length greater than \fIcongest_threshold\fR,
+then the congestion experienced bit is set in the quality of service option.
+.pp
+The threshold value stored in \fIcongest_threshold\fR may be changed
+with the \fIclnlutil\fR utility.
+.sh 3 "Receiving Options"
+.pp
+On receipt, all CLNP options are ignored except the security
+and globally unique quality of service option.
+If the security option is found, the packet is discarded.
+If the globally unique quality of service option is present, and the
+congestion experienced bit is set, then the transport congestion
+control function \fItpclnp_ctlinput(PRC_QUENCH2, addr)\fR is called.
+The following table summarizes the CLNP option processing.
+.(b
+.TS
+allbox, tab(+);
+l l l l.
+Option+Send+Forward+Receive
+=
+Padding+may be set+-+-
+Security+reject+ignore+discard
+Source Route+\fIclnp_srcroute()\fR+\fIclnp_srcroute()\fR+-
+Record Route+-+\fIclnp_dooptions()\fR+-
+QOS+added+congestion bit set+tpclnp_ctlinput()
+Priority+reject+ignore+-
+.TE
+.)b
+.sh 2 "DT NPDU Segmentation"
+.pp
+Segmentation is the process by which initial NPDUs are segmented into
+smaller derived NPDUs when the initial NPDU is too large for transmission
+on a network interface.
+Segmentation is accomplished by \fIclnp_fragment()\fR.
+This function chops the NPDU into pieces and individually places the pieces
+in the appropriate network interface's output queue.
+Each piece is made as large as possible.
+Note: The phrase "fragmentation" is used synonymously with "segmentation"
+throughout this prose and the CLNP fragmentation code. This is due to
+this author's familiarity with the DoD Internet Protocol which uses
+the term "fragment."
+.sh 2 "DT NPDU Reassembly"
+.pp
+Derived NPDUs are put back together by the process called
+reassembly.
+Reassembly is performed only at the destination end system.
+When a derived NPDU arrives, it is passed to \fIclnp_reass()\fR.
+This function scans a linked list of NPDUs awaiting reassembly.
+Each packet in the list is represented by a fragment list
+descriptor, which is stored in an \fImbuf\fR:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct clnp_fragl {
+.T&
+l l l l.
++struct iso_addr+cfl_src;+/* source */
++struct iso_addr+cfl_dst;+/* destination */
++u_short+cfl_id;+/* id of the pkt */
++u_char+cfl_ttl;+/* time to live */
++u_short+cfl_last;+/* offset of last
++++byte of packet */
++struct mbuf +*cfl_orighdr;+/* ptr to
++++original header */
++struct clnp_frag+*cfl_frags;+/* linked list
++++of fragments */
++struct clnp_fragl+*cfl_next;+/* next pkt be-
++++ing reassembled */
+};
+.TE
+\fR
+.)b
+The fields \fIcfl_src\fR, \fIcfl_dst\fR, and \fIcfl_id\fR are used to
+match an incoming derived NPDU with a fragment list.
+\fICfl_orighdr\fR contains a copy of the NPDU header of the first fragment received.
+The linked list of fragments pertaining to the packet is stored in the
+\fIcfl_frags\fR field.
+Each NPDU fragment represented by a \fIclnp_frag\fR structure,
+stored in an \fImbuf\fR:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct clnp_frag {
+.T&
+l l l l.
++u_int+cfr_first;+/* offset of
++++first byte of this frag */
++u_int+cfr_last;+/* offset of last
++++byte of this frag */
++u_int+cfr_bytes;+/* bytes to shave */
++struct mbuf+*cfr_data;+/* ptr to data */
++struct clnp_frag+*cfr_next;+/* next frag */
+};
+.TE
+\fR
+.)b
+The fields \fIcfr_first\fR and \fIcfr_last\fR indicate the first and
+last octet of the fragment.
+\fICfr_data\fR points to an mbuf chain
+which contains the data for the fragment.
+.pp
+If \fIclnp_reass()\fR finds a \fIclnp_fragl\fR structure matching the
+incoming derived NPDU, \fIclnp_insert_frag()\fR is called to create
+a \fIclnp_frag\fR structure and insert it in the linked list of
+packet fragments.
+If no \fIclnp_fragl\fR structure is found,
+\fIclnp_newpkt()\fR is invoked to create a new fragment list structure.
+.pp
+The last task \fIclnp_reass()\fR performs is to check if the fragment
+that just arrived completes the reassembly of the initial NPDU.
+If it does, the reassembled NPDU is rearranged to
+look like it just arrived intact.
+It accomplishes this by linking the \fImbuf\fRs holding
+the fragments into one \fImbuf\fR chain that represents the initial
+NPDU.
+A pointer to this \fImbuf\fR chain is returned by \fIclnp_reass()\fR.
+.pp
+If the newly arrived fragment does not complete an initial NPDU,
+\fIclnp_reass()\fR returns NULL.
+.sh 3 "Reassembly Lifetime Control"
+.pp
+One function of the CLNP is to prevent
+a proliferation of fragments awaiting reassembly from
+consuming buffers in an end system for indefinite periods of time.
+This function is called reassembly lifetime control.
+It is accomplished by
+periodic traversal of
+the list of \fIclnp_fragl\fR structures, decrementing the
+\fIcfl_ttl\fR field.
+This field is a copy of the NPDU time-to-live
+field. If \fIcfl_ttl\fR reaches zero, all resources associated with the
+fragment are released.
+The procedure
+\fIclnp_slowtimo()\fR, which is called by the system
+clock every 500 milliseconds (every half-second),
+performs the CLNP reassembly lifetime control.
+.sh 2 "ER NPDU"
+.pp
+An ER NPDU is sent to the originator of a packet when a DT NPDU is
+discarded and the error report function is not suppressed. Suppression
+of the error report function is accomplished by setting the "no ER"
+bit in the CLNP header.
+A packet is discarded by \fIclnp_discard()\fR.
+Before it
+returns the \fImbufs\fR used to store the
+the discarded packet to the \fImbuf\fR free list,
+\fIclnp_discard()\fR
+determines if the error report function is suppressed.
+If not,
+an ER NPDU will be sent to the originator of the discarded packet by
+calling \fIclnp_emit_er()\fR.
+.pp
+\fIClnp_emit_er()\fR will create an ER NPDU, address it to the
+originator of the discarded packet, route the NPDU,
+and transmit it, sending the header of the discarded NPDU as data.
+ER NPDUs may not be segmented.
+If the ER NPDU is too large for the outgoing network interface,
+the packet is truncated.
+.sh 2 "Raw CLNP"
+.pp
+In order to test CLNP in isolation from higher layer
+protocols, ARGO provides a \*(lqraw\*(rq interface to CLNP.
+This raw interface is selected with the \fISOCK_RAW\fR parameter to
+the
+\fIsocket()\fR
+system call.
+When a \*(rqraw\*(rq socket is open,
+and CLNP receives an NPDU,
+CLNP must determine whether the incoming NPDU is destined for
+the
+\*(rqraw\*(rq interface or for the interface to the
+OSI transport protocol entity.
+ARGO addresses this problem by using non-standard NPDU types
+for packets sent on \*(rqraw\*(rq sockets.
+The type field in the CLNP NPDU header
+is set to \fICLNP_RAW\fR (hex 1d) rather than \fICLNP_DT\fR
+in NPDUs that originate from
+\*(rqraw\*(rq sockets.
+This non-standard type value is used by \fIclnp_input()\fR
+to decide which upper layer protocol should receive the packet.
+See \fIclnptest(8)\fR for more information about the.
+\*(rqraw\*(rq CLNP interface.
+.sh 2 "CLNP Echo"
+.pp
+In the DoD world, ICMP supports an \fIecho\fR service.
+This allows one to \*(lqping\*(rq a distant gateway and
+to receive an echo response (a packet in return) if the gateway is working.
+There is no counterpart to \*(lqecho\*(rq in ISO 8473 (CLNP).
+ARGO provides this non-standard feature in its connectionless
+network layer.
+.pp
+Like raw CLNP, implementing an echo function requires a non-standard
+NPDU type value to allow
+\fIclnp_input()\fR to differentiate between a DT NPDU to be forwarded
+or passed to a higher layer protocol, and an NPDU that is to be echoed.
+When requesting an echo,
+the CLNP type field is set to \fICLNP_EC\fR (hex 1E) rather
+than CLNP_DT.
+When \fIclnp_input()\fR receives a packet with type
+\fICLNP_EC\fR,
+it swaps the source and destination addresses, sets the
+type field to \fICLNP_ECR\fR (hex 1F) and forwards
+the packet back to the sender.
+See also \fIclnpping(8)\fR.
+.sh 2 "Timers"
+.pp
+The only timer used by CLNP is the
+500 millisecond timer, which is
+user for reassembly lifetime control.
+See the section \*(lqReassembly Lifetime Control.\*(rq
+.sh 1 "End System to Intermediate System Routing Protocol (ES-IS)"
+.\" ROB
+.sh 2 "Overview"
+.pp
+This section describes the implementation of the ES-IS routing protocol.
+This protocol is used primarily to resolve NSAP address to SNPA address
+translations. It is also used to identify end systems
+and intermediate systems on
+the local subnetwork.
+All of this work is accomplished by transmitting
+packets of the type End System Hello (ESH), Intermediate System Hello (ISH)
+and Request Redirect (RD).
+.pp
+For the purpose of this section, the following definitions of end system (ES)
+and intermediate system (IS) apply.
+.ip \(bu 5
+An \fIend system\fR is an open system that
+is an OSI end system in the standard OSI sense
+(that it supports a full OSI protocol suite in addition to the network layer)
+and that
+implements the functions of the
+the ES-IS protocol that are mandatory for end systems,
+such as the Query Configuration function and the Record Redirect
+function,
+but that does not implement
+the functions of the ES-IS protocol that are for intermediate systems.
+.ip \(bu 5
+An \fIintermediate system\fR is an open system that
+is an OSI intermediate system in the standard OSI sense
+(that it performs packet routing in the network layer)
+and that
+implements the functions of the
+the ES-IS protocol that are mandatory for intermediate systems,
+such as the Request Redirect function,
+but not the functions of the ES-IS protocol that are for end systems.
+.pp
+While system may be an ES or an IS or both according to the
+standard OSI definitions, this is not the case in the context of
+the ES-IS protocol.
+.pp
+An ARGO system is by default an end system, by the definitions given above.
+An ARGO system can be made to function as an intermediate system
+instead of an end system with the \fIclnlutil\fR program.
+See \fIclnlutil(8)\fR for more information.
+.sh 2 "Report Configuration Function"
+.pp
+The report configuration function is used by end systems and intermediate
+systems to inform each other of their reachability and current subnetwork
+addresses.
+This function is invoked whenever the configuration timer
+expires.
+This timer fires at a frequency of once every
+\fIesis_config_time\fR seconds.
+By default, this value is 60 (seconds),
+but it may be changed with the \fIclnlutil\fR program.
+.pp
+The report configuration function is contained in the C function
+\fIesis_config()\fR. Called every \fIesis_config_time\fR seconds,
+\fIesis_config()\fR searches the list of active network interfaces
+calling \fIesis_shoutput\fR for each interface that is up, has
+broadcast ability and has an ISO address configured.
+.pp
+The function \fIesis_shoutput()\fR has the responsibility of building and
+transmitting ESH and ISH packets.
+It takes several arguments, including a pointer to a network interface
+and
+a packet type (ESH or ISH).
+If the packet type is ESH, then
+each NSAP address configured on the specified interface is added to
+the ESH NPDU. ISH NPDUs may only contain a single NSAP address\**.
+.(f
+\** Actually, ISH packets contain Network Entity Titles (NETs). ARGO
+does not make a distinction between NETs and NSAPs.
+.)f
+After the packet is built, it is transmitted on the subnetwork. ESH packets
+are sent to the multicast address \fIall intermediate systems\fR, whereas
+ISH packets are sent to the multicast address \fIall end systems\fR.
+.pp
+Each ISH and ESH NPDU contains
+a holding timer setting. This setting (specified
+in seconds) is used by the receiver of the NPDU to set its
+holding timer. When its holding timer expires, the information from
+the NPDU is erased. The holding timer value sent on each ISH and ESH NPDU
+is contained in the variable \fIesis_holding_time\fR. By default, this
+timer setting is 120 seconds. This value may be changed with the
+\fIclnlutil\fR utility program.
+.sh 2 "Record Configuration Function"
+.pp
+The Record Configuration function receives ESH or ISH NPDUs, extracts the
+configuration information, and updates kernel-resident tables.
+The two functions \fIesis_eshinput()\fR and \fIesis_ishinput()\fR
+process incoming ESH and ISH NPDUs, respectively.
+.pp
+The ES-IS entity maintains a table that
+associates a SNPA-addresses with NSAP-addresses.
+This table is called the \fISNPA cache\fR.
+.pp
+Whenever an ESH or ISH NPDU is received,
+an entry is made in the SNPA cache
+via the \fIsnpac_add()\fR function.
+This entry is kept in the cache until the holding timer expires.
+In addition to adding an entry to the SNPA cache, \fIsnpac_add()\fR creates
+a default ISO route toward the sender of the ISH.
+One such route is kept so that the ES-IS entity has at most one
+route to an IS at any time.
+Note that ISHs from different sources will
+cause the route to the source of the earlier ISH to be
+overwritten.
+The default route
+will be removed when the ISH holding timer expires.
+.pp
+If, at the time an ESH or ISH NPDU is received, the SNPA cache
+contains no entry for the NSAP address in the NPDU just received,
+an ESH or ISH (depending on the system type) NPDU is
+transmitted to the sender of the NPDU just received.
+.sh 2 "Resolving NSAP addresses to SNPA addresses: Query Configuration Function"
+.pp
+Whenever a device driver needs to resolve an NSAP address to
+an SNPA address, it calls \fIiso_snparesolve()\fR. This function first looks
+up the NSAP address in the SNPA cache. If a match is found, the
+corresponding SNPA address is returned. If a match is not found and the
+system is an end system, and there is a known intermediate system, then
+the SNPA address of the intermediate system is returned. It is assumed that
+the intermediate system will forward the packet and transmit a redirect back
+(see "Redirection Generation", below).
+If a match is not found and the system is an end system, but there is no
+known intermediate system, then \fIiso_snparesolve()\fR will return
+the multicast address \fIall end systems\fR.
+In all other cases, \fIiso_snparesolve()\fR will return an error.
+This is known as the query configuration function.
+.sh 3 "Configuration Response Function"
+.pp
+In order for the query configuration function to be effective, the network
+entity that receives a CLNP DT sent to the \fIall end system\fR
+multicast address must transmit an ESH back to the sender of the DT.
+This is called the configuration response function and is accomplished by
+calling \fIsh_output()\fR from within \fIclnp_input()\fR.
+.sh 2 "Redirection Generation"
+.pp
+When an intermediate system forwards a packet onto the same interface
+upon which
+the packet arrived, a redirect (RD) NPDU is generated. This NPDU is
+transmitted by calling \fIesis_rdoutput()\fR from within \fIclnp_forward()\fR.
+Note that end systems may forward packets but they do not generate RD PDUs.
+.sh 2 "Redirection Receipt"
+.pp
+RD NPDUs direct an end system to create an SNPA cache entry
+for an NSAP address, or, if such an entry exists, to change
+the SNPA address associated with the NSAP address.
+The receipt of RD NPDUs is handled by \fIesis_rdinput()\fR.
+This function
+parses the RD NPDU and adds an entry to the SNPA cache for the corresponding
+destination NSAP address.
+If the redirect is toward an intermediate system,
+meaning that the RD NPDU contains an SNPA address
+of an intermediate system (gateway),
+a route is created for the destination NSAP with the intermediate system as
+the first hop, or gateway, in the route.
+.sh 2 "Multicast Addresses"
+.pp
+As specified by the December 1987 NBS agreements, the address
+\fIall end systems\fR is {0x09, 0x00, 0x2B, 0x00, 0x00, x04} and the address
+\fIall intermediate systems\fR is {0x09, 0x00, x02B, 0x00, 0x00, 0x05}.
+These multicast addresses are only used on the 802.3 subnetwork (baseband).
+Broadcast addresses are used on the 802.5 subnetwork (token ring). See
+the comment in \fC/sys/netargo/iso_snpac.c\fR for more information on
+multicast addresses.
+.sh 1 "Connection Oriented Network Service and Subnetwork Service"
+.pp
+The following sections describe the design of the Connection Oriented
+Network Service (CONS) and the Connection Oriented Subnetwork Service
+(COSNS).
+The CONS and COSNS are provided by two functionally separate but related
+modules, a connection manager and the ISO 8208 (X.25) protocols.
+The connection manager is also known in OSI terminology as a
+subnetwork dependent convergence function, or SNDCF.
+In ARGO it is used for more than an SNDCF, and it is a sort of
+"glue" that binds a transport service, a network service, a
+subnetwork service, and a device driver together, so
+hereinafter it is called "the glue".
+This code performs the some of the functions of ISO 8878,
+which specifies how ISO 8208 (X.25) can be used to provide the OSI
+connection oriented network service.
+The X.25 protocols are implemented in a coprocessor
+made by Eicon Technology, Inc.
+The device driver \fBecn\fR is the Unix kernel interface to this
+coprocessor.
+The sections that follow describe the glue and the \fBecn\fR device
+driver.
+.sh 2 "The Glue"
+.pp
+The glue provides
+services to several modules in the kernel:
+.ip "Subnetwork service" 5
+is provided to other network layer protocols, such as CLNP (ISO 8473).
+The ARGO CLNP uses this service.
+The Internet IP could be made to use this service with
+minimal effort, because this service interface is made to look
+like a standard Unix BSD link layer service (it has
+a device driver interface).
+.ip "Network service" 5
+is provided to transport layer protocols, such as TP (ISO 8073).
+This service interface looks like a standard Unix BSD
+network service (a procedure call interface).
+.ip "Transport service" 5
+could be provided to the socket module.
+While this is not provided with the ARGO software, the glue
+is designed to permit
+such a service to be provided with little additional programming effort.
+.pp
+Higher layer protocols
+that use a connection-oriented
+network or subnetwork service need to manage virtual
+circuits in a similar fashion.
+Rather than put connection management functions into each higher
+layer protocol (HLP) entity
+that uses the CONS or COSNS,
+in ARGO the connection management is in one module, the glue.
+Other alternatives exist, for example in the OSI world,
+one may place in the TP entity the function of connection management for TP,
+and implement a network connection management subprotocol
+of the transport layer (ISO 8073 DAD1, NCMS).
+In addition, connection management for CLNP may be implemented as part of
+the CLNP entity.
+A subnetwork dependent convergence protocol (ISO 8878/A) may
+be implemented to support connection management for CLNP.
+The approach taken in ARGO is different from those suggested in ISO
+for two reasons.
+First, ARGO aims to minimize the amount of code written to perform a given
+task.
+Second, ARGO has several coexisting paths through the network layer,
+which the ISO approach does not address.
+For example, in both ISO 8878/A and in NCMS it is assumed that if
+an incoming call arrives from NSAP \(*b
+while a call to NSAP \(*b is being placed,
+the two calls are resolved to one virtual circuit.
+This is not feasible in the ARGO scenario, since it may not be known
+until after
+the calls are established and higher level packets are exchanged
+whether the two calls are to be used
+for the same path and for the same higher layer protocols.
+A possible alternative approach is to use an NSAP-address for each path
+through the network layer
+(or protocol suite).
+This was rejected in the ARGO design because it puts the burden
+on the calling application entity or network entity to
+determine the proper NSAP-address to use to determine the protocol
+suite to be used to reach the destination end system.
+For this reason, none of the approaches suggested in ISO is adopted
+here.
+.pp
+The glue provided in the ARGO
+kernel does not provide the full OSI network service.
+It provides that subset of the network service that is used
+by ARGO TP and by ARGO CLNP.
+The OSI connection-oriented network service elements that are
+are provided are described in Chapter Four,
+in the section titled "Connection Oriented Network Service".
+.pp
+Each module using the glue has its own service
+interface to the glue.
+.\" When X.25 is used as a
+.\"transport service, the standard protocol switch table is used, and the procedure
+.\"\fIcons_usrreq()\fR is the protosw entry for a
+.\"service in the iso protosw table that provides the
+.\"SOCK_STREAM abstraction in the AF_ISO address family,
+.\"with protocol ISOPROTO_X25.
+.\"This service is called XTS in the glue code and hereafter
+.\"in this document.
+.\".pp
+When the transport layer uses the glue as a network service,
+the interface is the procedure
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+error = cons_output( isop, m, len, isdgm )
+.T&
+l l l.
+ +struct isopcb +*isop;
+ +struct mbuf +*m;
+ +int+error, len, isdgm;
+.TE
+\fR
+.)b
+.pp
+When the network layer uses the glue as a subnetwork service
+the interface is the device driver-like procedure
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+error = cosns_output( ifp, m, dst )
+.T&
+l l l.
+ +struct ifnet +*ifp;
+ +struct mbuf +*m;
+ +struct sockaddr_iso +*dst;
+ +int+error;
+.TE
+\fR
+.)b
+.pp
+When the glue is used as a connection-oriented service
+(i.e., by TP 0, and by TP 4 during the transport
+connection establishment phase, during which
+it is not yet known whether class 0 or class 4 will be used)
+the following procedures are used:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+error = cons_openvc( copcb, dstaddr, so )
+.T&
+l l l.
+ +struct cons_pcb +*copcb;
+ +struct sockaddr_iso +*dstaddr;
+ +struct socket+*so;
+.T&
+l s s s.
+ +++
+error = cons_netcmd( cmd, isop, vc, isdgm )
+.T&
+l l l.
+ +int+cmd;
+ +struct isopcb +*isop;
+ +int+channel, isdgm;
+.TE
+\fR
+.)b
+.pp
+The procedure \fIcons_openvc()\fR places a call.
+The procedure \fIcons_netcmd()\fR accepts, rejects, or clears
+a call.
+There is no incoming call indication, because
+the glue uses the passive open model for accepting calls.
+The HLP simply sees a new incoming packet, and is given
+a virtual circuit number (channel) along with the incoming packet.
+If the HLP chooses to reject the call
+it may do so, which will cause the virtual circuit (VC) to be cleared.
+.pp
+The glue may reject (clear) an incoming call for its own reasons.
+The following table lists the reasons that the glue may
+clear a call and the ISO 8208 diagnostic code used on the X.25 clear packet
+in each case.
+For a complete list of the permissible diagnostic codes, see
+Figure 14-B of ISO 8208.
+.in -5
+.(b
+.TS
+center expand box tab(+);
+l l.
+Reason+Diagnosic code
+=
+The VC was opened for use with CLNP +Higher level initiated reset
+or TP 4 and has been idle for the +user resynchronization
+maximum inactivity time. +(0xfa)
+_
+The HLP closed +Higher level initiated disconnection
+this network connection. +- normal (0xf1)
+_
+The HLP rejected +Higher level initiated connection
+this network connection. +rejection - transient condition (0xf4)
+_
+The X.25 call packet contained +Higher level initiated connection
+facilities that are not supported +rejection - incompatible
+by the glue, or did not contain +information in user data (0xf8)
+necessary information, e.g. calling +
+or called DTE address. +
+_
+The X.25 call packet contained +Higher level initiated connection
+call user data that does not +rejection - unrecognizable protocol
+indicate any HLP supported by ARGO +identifier in user data
+HLP supported by ARGO +(0xf9)
+_
+The given destination +OSI Network service problem: NSAP
+NSAP-address is not supported +address unknown (permanent
+ +condition) (0xeb)
+_
+The X.25 packet or a facility +Packet not allowed-
+therein was too long +packet too long. (0x27)
+.TE
+.)b
+.in +5
+.pp
+The glue provides several functions common to all
+modules (HLPs) that use the glue.
+Regardless of the HLP,
+the DTE addresses and NSAP addresses are associated in the same
+manner.
+One same network layer protocol identification scheme
+(ISO PDTR 9577) for all HLPs.
+Several different HLPs need to close inactive X.25
+virtual circuits after a timer expires.
+The glue insulates the
+device driver interface to the X.25 coprocessor
+from the HLP.
+.pp
+TP class 0 connections
+.\" and the X.25 "transport service"
+do not share X.25 VCs
+.\" with each other or among transport service-level circuits (sockets),
+so
+.\" these two modules need to keep X.25
+the glue needs to maintain
+a 1-1 correspondence between VCs
+and sockets.
+.\" For use by TP 0 and XTS,
+For use by TP 0,
+one network-level pcb is needed for each socket, and that is a
+\fIcons_pcb\fR, described below.
+.pp
+TP class 4 connections may share VCs,
+and TP 4 makes no correspondence between sockets and VCs.
+CLNP regards VCs similarly to TP 4.
+A given VC may be used simultaneously for many higher level connections,
+but all higher level connections using a given VC must use the same
+path or protocol suite.
+In other words, a TP4 connection running over CONS may not share a
+VC with a TP4 connection running over CLNS/COSNS.
+.pp
+To manage VCs and to maintain the separation of sharable and non-sharable
+VCs, the glue uses the following protocol control block:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct cons_pcb {
+.T&
+l l l.
+ +struct isopcb+_co_isopcb;
++u_short+co_state;
++u_char+co_flags;
++u_short+co_ttl;
++u_short+co_init_ttl;
++int+co_channel;
++struct ifnet+*co_ifp;
++struct protosw+*co_proto;
++struct dte_addr+co_peer_dte;
++struct ifqueue+co_pending;
+};
+.T&
+l l s.
+#define co_next+_co_isopcb.isop_next
+#define co_prev+_co_isopcb.isop_prev
+#define co_head+_co_isopcb.isop_head
+#define co_laddr+_co_isopcb.isop_laddr
+#define co_faddr+_co_isopcb.isop_faddr
+#define co_lport+_co_isopcb.isop_laddr.siso_tsuffix
+#define co_fport+_co_isopcb.isop_faddr.siso_tsuffix
+#define co_route+_co_isopcb.isop_route
+#define co_socket+_co_isopcb.isop_socket
+}+
+.TE
+\fR
+.)b
+.pp
+The \fIcons_pcb\fR contains
+an \fIisopcb\fR so that TP 0
+.\" and XTS
+may use the routines that manipulate \fIisopcb\fR structures for allocating
+and
+deallocating PCBs, binding addresses to PCBs,
+and finding routes.
+.pp
+A CONS PCB has states CLOSED, LISTENING, CLOSING,
+CONNECTING, ACKWAIT, and OPEN.
+This represents the state of the VC to the degree necessary to the glue.
+The glue uses the passive open model for opening VCs.
+The coprocessor device driver always accepts
+incoming calls and passes an indication to the glue when
+a call is accepted by the coprocessor.
+If the user of the glue (the HLP) or the glue itself decides
+that the VC is not desired, the VC is cleared.
+.pp
+The \fIcons_pcb\fR contains a bit mask, \fIco_flags\fR, with values:
+.(b
+\fC
+.TS
+tab(+);
+l l l l.
+#define+CONSF_OCRE+0x40+/* created on OUTPUT */
+#define+CONSF_ICRE+0x20+/* created on INPUT */
+#define+CONSF_DGM+0x04+/* for datagram use only */
+.TE
+\fR
+.)b
+.pp
+The flag
+CONSF_DGM means that the VC is being used to provide a
+datagram (connectionless, unreliable, unsequenced)
+service to the higher layer, and that requests for additional VCs
+from the same higher layer entity
+may be served by this VC, effectively
+multiplexing higher layer connections on this VC.
+When this flag is set in a \fIcons_pcb\fR, there is no associated
+\fIco_socket\fR pointer.
+When CONSF_DGM is not set, there is an associated
+\fIco_socket\fR pointer, and the VC is being used for
+TP 0.
+.pp
+The flag
+CONSF_ICRE means that the VC was created by
+and incoming call indication.
+The flag
+CONSF_OCRE means that the VC was created
+on behalf of an outgoing call request.
+.pp
+The \fIstruct dte_addr\fR field, \fIco_peer_dte\fR,
+contains the peer's DTE address.
+The glue locates VCs by searching the list of protocol control
+blocks for a PCB with a DTE matching that desired.
+.pp
+The glue is given an NSAP-address by the HLP entity.
+The glue finds the desired DTE address by searching the
+ES-IS SNPA cache for an SNPA-address (DTE address) associated
+with the NSAP-address given by the HLP entity.
+This means that to use the CONS, an entry for each desired
+peer must appear in the SNPA cache.
+ARGO does not provide the ES-IS protocol for use with ISO 8208, so
+"permanent" or static entries must be placed in this cache by hand,
+using the utility program \fIclnlutil\fR.
+.pp
+When an incoming call is accepted, the peer's DTE address is
+placed in the SNPA cache along with
+an NSAP address generated as follows:
+.np
+If the incoming call contained the peer's NSAP-address
+in an Address Extension Facility (AEF, available with 1984 X.25),
+this NSAP-address is used, otherwise
+.np
+the glue creates a "type-37" address (the format defined by AFI 37
+in ISO 8348/AD 2).
+.pp
+TP 4 can have its outgoing packets sent on more than one VC.
+The glue presently contains no mechanism for fanning outgoing
+packets onto several VCs, however,
+it does not prohibit packets arriving for TP 4 on any VC that
+opened with the protocol identifier for TP.
+.pp
+The glue has the ability to generate AEFs on outgoing calls, but
+this ability is turned off,
+since the public data network on which ARGO runs at Wisconsin
+does not support 1984 X.25, and so it rejects packets containing
+AEFs.
+The use of AEFs can be reinstated by making a kernel with the
+option \fBX25_1984\fR or by adding the line
+.nf
+.in +5
+\fC
+#define X25_1984
+\fR
+.in -5
+.fi
+at the top of the file
+\fC/sys/netargo/if_cons.c\fR
+and rebuilding the kernel.
diff --git a/share/doc/iso/wisc/net_serv.nr b/share/doc/iso/wisc/net_serv.nr
new file mode 100644
index 0000000..4608f01
--- /dev/null
+++ b/share/doc/iso/wisc/net_serv.nr
@@ -0,0 +1,163 @@
+.NC "Network Service Interface"
+.sh 1 "Connectionless Network Service"
+.pp
+This section describes the interface to the ISO connectionless network service.
+There are really two interfaces to the CLNS: the internal interface
+and the IPC interface.
+The internal interface is based on
+procedure calls. It is used only within the kernel. The IPC interface
+allows a user process to access the CLNS directly. This is used only
+for testing and debugging purposes.
+.sh 2 "Primitives"
+.pp
+The CLNS is, by definition, connectionless. Therefore, there are no
+primitives associated with connection establishment or connection release.
+There is one primitive associated with data transfer: N-UNITDATA.
+The parameters to a N-UNITDATA request are: source NSAP address,
+destination NSAP address, quality of service, and user data.
+The parameters of a N-UNITDATA indication are identical to those of the
+request.
+In this implementation, the quality of service parameter is not supported.
+.sh 2 "Internal Interface"
+.pp
+Within the kernel, an N-UNITDATA request is effected by the procedure
+\fIclnp_output()\fR:
+.(b
+\fC
+.TS
+tab(+);
+l s s.
+clnp_output(m0, isop, datalen, flags)
+.T&
+l l l.
+ +struct mbuf+*m0;+/* data */
+ +struct isopcb+*isop;+/* ISO protocol control block */
+ +int+datalen;+
+ +int+flags;+/* flags */
+.TE
+\fR
+.)b
+This procedure will construct a DT NPDU, route it, and transmit it on
+the appropriate subnetwork. \fIM0\fR is an mbuf chain containing the
+user data portion of the N-UNITDATA request. \fIIsopcb\fR is the iso protocol
+control block previously allocated. \fIClnp_output\fR will use the following
+fields: \fIisop_laddr\fR, isop_faddr, isop_route, isop_options,
+isop_optindex, \fI and \fRisop_clnpcache\fR.
+\fIDatalen\fR specifies the number of bytes of user data.
+The \fIflags\fR parameter will be discussed in a subsequent chapter.
+.pp
+A N-UNITDATA indication occurs when a DT NPDU arrives. The indication is
+generated by calling the appropriate upper layer protocol input routine.
+In the case of TP, the procedure \fItpclnp_input()\fR is called:
+.(b
+\fC
+.TS
+tab(+);
+l s s.
+tpclnp_input(m, src, dst, len)
+.T&
+l l l.
+ +struct mbuf+*m;+/* DT NPDU */
+ +struct iso_addr+*src;+/* source of packet */
+ +struct iso_addr+*dst;+/* destination of packet */
+ +int+len;+/* length of clnp header */
+.TE
+\fR
+.)b
+\fIM\fR contains the entire DT NPDU packet. \fILen\fR indicates the size
+of the CLNP header. In other words, the user data of the DT NPDU begins
+\fIlen\fR bytes into \fIm\fR. \fISrc\fR and \fIdst\fR indicate the
+source and destination NSAP addresses of the packet.
+.sh 3 "CLNP/Subnetwork Interface"
+.pp
+The design of the interface between the subnetwork and the CLNP is
+determined by the design of the Unix network interface drivers. CLNP
+follows the conventional mechanisms for exchanging packets with a network
+interface. See the section on Network Interface Drivers in Chapter Five
+for more information on these conventions.
+.sh 2 "IPC (\*(lqRaw\*(rq) Interface"
+.pp
+The IPC interface to the CLNS allows direct (called \*(lqraw\*(rq)
+access to CLNP.
+This interface is intended for testing and debugging only.
+Its use results in the
+transmission of CLNP datagrams with nonstandard identification fields.
+These raw packets may be rejected by a system not employing the same
+convention. See the section on network implementation for more information
+about the conventions.
+.pp
+In order to gain access to the raw interface
+a \fIsocket\fR, with address family AF_ISO and type SOCK_RAW must be created.
+With this socket in hand,
+the system calls \fIsendto()\fR and \fIrecvfrom()\fR can be used to
+transmit and receive raw CLNP datagrams.
+.sh 3 "Sending raw datagrams"
+.pp
+The format of the \fIsendto()\fR system call is:
+.(b
+\fC
+.TS
+tab(+);
+l s s.
+cc = sendto(s, msg, len, flags, to, tolen)
+.T&
+l l l.
+int+cc,s;
+char+*msg;
+int+len,flags;
+struct sockaddr+*to;
+int+to;
+.TE
+\fR
+.)b
+\f\fIS\fR is the socket previously created. \fIMsg\fR is a pointer to
+the data for the NPDU. CLNP will prepend a header to this data before
+transmission. \fILen\fR specifies the number of bytes of data. The
+\fIflags\fR parameter is unused and should be zero. \fITo\fR specifies the
+NSAP address to be used as the destination address. The size (in bytes)
+of \fIto\fR is given in \fItolen\fR. CLNP will automatically insert
+the source address based upon the route taken by the packet. The number of
+user data bytes transmitted is returned as \fIcc\fR. See \fIsendto(2)\fR
+for more information on this system call.
+.sh 3 "Receiving raw datagrams"
+.pp
+The format of the \fIrecvfrom()\fR system call is:
+.(b
+\fC
+.TS
+tab(+);
+l s s.
+cc = recvfrom(s, buf, len, flags, from, fromlen)
+.T&
+l l l.
+int+cc,s;
+char+*buf;
+int+len,flags;
+struct sockaddr+*from;
+int+*fromlen;
+.TE
+\fR
+.)b
+When used with a CLNP raw socket \fIs\fR, \fIrecvfrom()\fR will read a
+NPDU from the CLNS. If no packet is available, the call will block.
+\fIBuf\fR specifies a buffer of \fIlen\fR bytes into which the NPDU will
+be read. The entire packet, including the header, will be read into the
+buffer. The \fIflags\fR parameter is unused, and should be zero. If
+\fIfrom\fR is non-zero, the source address of the NPDU is filled in.
+\fIFromlen\fR is a value-result parameter, initialized to the size of
+the buffer associated with \fIfrom\fR, and modified on return to
+indicate the actual size of the address stored there. The total number
+of bytes received (header and data) is returned as \fIcc\fR.
+See \fIrecvfrom(2)\fR for more information about this system call.
+.sh 1 "Connection Oriented Network Service"
+.pp
+The ARGO Connection Oriented Network Service (CONS) is not a complete
+implementation of the
+OSI network service.
+It is that subset of the OSI network service that is used
+by ARGO Transport and by ARGO CLNP.
+.\" FIGURE
+.so figs/NS_primitives.nr
+.pp
+.CF
+shows which CONS service elements are provided.
diff --git a/share/doc/iso/wisc/parts.nr b/share/doc/iso/wisc/parts.nr
new file mode 100644
index 0000000..1cd70b1
--- /dev/null
+++ b/share/doc/iso/wisc/parts.nr
@@ -0,0 +1,39 @@
+.\"$Header: parts.nr,v 1.1 88/12/05 18:10:50 nhall Exp $
+.\"$Source: /usr/argo/doc/kernel/RCS/parts.nr,v $
+.\"
+.\"
+.\" LOOK FOR ALL CASES OF 'writing' (as in, "at this writing")
+.\" to be sure you've updated everything before distributing this!
+.\"
+.\"This file uses -me and tbl macros.
+.so macros.nr
+.pn 1
+.IC
+.IF
+.(l C
+.sz 16
+Wisconsin ARGO Kernel Programmer's Guide for
+Academic Information Systems 4.3
+
+Current source: argo:/usr/argo/doc/kernel
+.sz 8
+.)l
+.so ../icon/ARGO.nr
+.he 'ARGO Kernel Programmer\'s Guide'''
+.fo '%''\*(td'
+.bp
+.\".so intro.nr
+.\".so def.nr
+.\".so trans_serv.nr
+.\".so net_serv.nr
+.\".so ipc.nr
+.\".so addr.nr
+.so trans_design.nr
+.\".so net_design.nr
+.\".so errors.nr
+.\".so debug.nr
+.\".so appendix_a.nr
+.\".so appendix_b.nr
+.\".fo ''Table of Contents''
+.bp
+.xp
diff --git a/share/doc/iso/wisc/preview b/share/doc/iso/wisc/preview
new file mode 100755
index 0000000..6069d4e
--- /dev/null
+++ b/share/doc/iso/wisc/preview
@@ -0,0 +1,7 @@
+#! /bin/csh -f
+echo $argv
+set dev=fa
+foreach m ($argv)
+ grn -P$dev $m.grn > $m.nr
+ ditroff -P$dev $m.nr
+end
diff --git a/share/doc/iso/wisc/program.nr b/share/doc/iso/wisc/program.nr
new file mode 100644
index 0000000..dfb3305
--- /dev/null
+++ b/share/doc/iso/wisc/program.nr
@@ -0,0 +1,51 @@
+.\"$Header: program.nr,v 1.1 88/12/05 18:10:57 nhall Exp $
+.\"$Source: /usr/argo/doc/kernel/RCS/program.nr,v $
+.\"
+.\"
+.\" FONT CONVENTIONS
+.\"
+.\" \fIprocedure()\fR
+.\" \fIsyscall()\fR
+.\" \fImanpage(3)\fR
+.\" \fIdata_structure_name\fR
+.\" \fC/file/or/directory/name\fR
+.\" \fC
+.\" section of code
+.\" \fR
+.\"
+.\"
+.\" LOOK FOR ALL CASES OF 'writing' (as in, "at this writing")
+.\" to be sure you've updated everything before distributing this!
+.\"
+.\"This file uses -me and tbl macros.
+.so macros.nr
+.pn 1
+.IC
+.IF
+.(l C
+.sz 16
+Wisconsin ARGO 1.0 Kernel Programmer's Guide for
+Academic Operating Systems 4.3
+.sz 8
+.)l
+.so ../icon/ARGO.nr
+.he 'ARGO 1.0 Kernel Programmer\'s Guide'''
+.fo '%''December 9, 1988'
+.bp
+.so intro.nr
+.so def.nr
+.so trans_serv.nr
+.so net_serv.nr
+.so ipc.nr
+.so addr.nr
+.so trans_design.nr
+.so net_design.nr
+.so eicon.nr
+.so errors.nr
+.so debug.nr
+.so appendix_a.nr
+.\" Leave manual pages out!
+.\".so appendix_b.nr
+.fo ''Table of Contents''
+.bp
+.xp
diff --git a/share/doc/iso/wisc/trans_design.nr b/share/doc/iso/wisc/trans_design.nr
new file mode 100644
index 0000000..6aeb54a
--- /dev/null
+++ b/share/doc/iso/wisc/trans_design.nr
@@ -0,0 +1,1466 @@
+.NC "The Design of the ARGO Transport Entity"
+.sh 1 "Protocol Hooks"
+.pp
+The design of the AOS kernel IPC support to some
+extent mandates the
+design of protocols.
+Each protocol must provide the following
+protocol hooks, which are procedures called through a
+protocol switch table
+(an array of type \fIprotosw\fR as described in
+Chapter Five.
+.ip "pr_input()" 5
+Called when data are to be passed up from a lower layer.
+.ip "pr_output()" 5
+Called when data are to be passed down from a higher layer.
+.ip "pr_init()" 5
+Called when the system is brought up.
+.ip "pr_fasttimo()" 5
+Called every 200 milliseconds by the clock functional unit.
+.ip "pr_slowtimo()" 5
+Called every 500 milliseconds by the clock functional unit.
+.ip "pr_drain()" 5
+This is meant to be called when buffer space is low.
+Each protocol is expected to provide this routine to free
+non-critical buffer space.
+This is not yet called anywhere.
+.ip "pr_ctlinput()" 5
+Used for exchanging information between
+protocols, such as notifying a transport protocol of changes
+in routing or configuration information.
+.ip "pr_ctloutput()" 5
+Supports the protocol-dependent
+\fIgetsockopt()\fR
+and
+\fIsetsockopt()\fR
+options.
+.ip "pr_usrreq()" 5
+Called by the socket code to pass along a \*(lquser request\*(rq -
+in other words a service primitive.
+This call is also used for other protocol functions.
+The functions served by the \fIpr_usrreq()\fR routine are:
+.ip " PRU_ATTACH" 10
+Creates a protocol control block and attaches it to a given socket.
+Called as a result of a \fIsocket()\fR system call.
+.ip " PRU_DISCONNECT" 10
+Called as a result of a
+\fIclose()\fR system call.
+Initiates disconnection.
+.ip " PRU_DETACH" 10
+Disassociates a protocol control block from a socket and recycles
+the buffer space used for the protocol control block.
+Called after PRU_DISCONNECT.
+.ip " PRU_SHUTDOWN" 10
+Called as a result of a
+\fIshutdown()\fR system call.
+If the protocol supports the notion of half-open connections,
+this closes the connection in one direction or both directions,
+depending on the arguments passed to
+\fIshutdown\fR.
+.ip " PRU_BIND" 10
+Gives an address to a socket.
+Called as a result of a
+\fIbind()\fR system call, also
+when
+socket without a bound address is used.
+In the latter case, an unused transport suffix is located and
+bound to the socket.
+.ip " PRU_LISTEN" 10
+Called as a result of a
+\fIlisten()\fR system call.
+Marks the socket as willing to queue incoming connection
+requests.
+.ip " PRU_CONNECT" 10
+Called as a result of a
+\fIconnect()\fR system call.
+Initiates a connection request.
+.ip " PRU_ACCEPT" 10
+Called as a result of an
+\fIaccept()\fR system call.
+Dequeues a pending connection request, or blocks waiting for
+a connection request to arrive.
+In the latter case, it marks the socket as willing to accept
+connections.
+.ip " PRU_RCVD" 10
+The protocol module is expected to have put incoming data
+into the socket's receive buffer, \fIso_rcv\fR.
+When a receive primitive is used
+(\fIrecv(), recvmsg(), recvfrom(),
+read(), readv(), \fRand
+\fIrecvv()\fR system calls)
+the socket code module copies data from the
+\fIso_rcv\fR to the user's
+address space.
+The protocol module may arrange to be informed each time the socket code
+does this, in which case the socket code calls \fIpr_usrreq\fR(PRU_RCVD)
+after the data were copied to the user.
+.ip " PRU_SEND" 10
+This performs the protocol-dependent part of a send primitive
+(\fIsend(), sendmsg(), sendto(), write(), writev(),
+\fRand \fIsendv()\fR system calls).
+The socket code
+(procedures \fIsendit() and \fIsosend()\fR)
+moves outgoing data from the user's
+address space into a chain of \fImbufs\fR.
+The socket code takes as much data from the user as it
+determines will fit into the outgoing socket buffer, so_snd.
+It passes this much data in the form of an mbuf chain to the protocol
+via \fIpr_usrreq\fR(PRU_SEND).
+If there are more data than
+the so_snd can accommodate,
+the socket code, which is running on behalf of a user process,
+puts the user process to sleep.
+The protocol module is expected to wake up the user process when
+more room appears in so_snd.
+.ip " PRU_ABORT" 10
+Called when a socket is closed and that socket
+is accepting connections and has
+queued pending
+connection requests or
+partially open connections.
+.ip " PRU_CONTROL" 10
+Called as a result of an
+\fIioctl()\fR system call.
+.ip " PRU_SENSE" 10
+Called as a result of an
+\fIfstat()\fR system call.
+.ip " PRU_RCVOOB" 10
+Performs the work of receiving \*(lqout-of-band\*(rq data.
+The socket module has already allocated an mbuf into which
+the protocol module is expected to put the incoming
+\*(lqout-of-band\*(rq data.
+The socket code will then move the data from this mbuf
+to the user's address space.
+.ip " PRU_SENDOOB" 10
+Performs the work of sending \*(lqout-of-band\*(rq data.
+The socket module has already moved the data
+from the user's address space into a chain of mbufs,
+which it now passes to the protocol module.
+.ip " PRU_SOCKADDR" 10
+Supports the system call
+\fIgetsockname()\fR.
+Puts the socket's bound address into an mbuf.
+.ip " PRU_PEERADDR" 10
+Supports the system call
+\fIgetpeername\fR().
+Puts the peer's address into an mbuf.
+.ip " PRU_CONNECT2" 10
+This is used in the Unix domain to support pipes.
+It is not generally supported by transport protocols.
+.ip " PRU_FASTTIMO, PRU_SLOWTIMO" 10
+These are superfluous.
+None of the transport protocols uses them.
+.ip " PRU_PROTORCV, PRU_PROTOSEND" 10
+None of the transport protocols uses these.
+.ip " PRU_SENDEOT" 10
+This was added to support TP.
+This indicates that the end of the data sent in this
+send primitive should
+be marked by the protocol as the end of the TSDU.
+.sh 1 "The Interface Between the Transport Entity and Lower Layers"
+.pp
+The transport layer may run over a network layer such as IP
+or the ISO connectionless network layer,
+or it may run over a multi-purpose layer such as the service
+provided by X.25.
+X.25 is viewed as a network layer when
+TP runs over X.25, and as a
+subnetwork layer
+when IP is running over X.25.
+The software interface between data link and network layers differs
+considerably from the software interface between transport and network
+layers in AOS.
+For this reason some modification of the transport-to-lower-layer
+interface is necessary to support the suite of protocols included in
+ARGO.
+.pp
+In AOS it is assumed that the transport layer will run over one
+and only one network layer, and therefore it may call the
+network layer output procedure directly.
+In order to allow TP to run over a set of lower layers,
+all domain-specific functions have been put into a set of routines
+that are called indirectly through a domain-specific switch table.
+The primary reason for this is that the transport and network
+layers share information, mostly information pertaining to addresses.
+The protocol control blocks for different network layers
+differ, so the transport layer cannot just directly
+access the network layer's pcb.
+Similarly, a network layer may not directly access the transport
+pcb because a multitude of transport protocols can run over each
+of the network protocols.
+.pp
+To permit different network-layer protocol control blocks to coexist
+under one transport layer, all transport-dependent control
+information was put into a transport-specific protocol control block.
+A new field, \fIso_tpcb\fR,
+was added to the \fIsocket\fR structure to hold a pointer to
+the transport-layer protocol control block.
+The existing
+field \fCso_pcb\fR is used for the network layer pcb.
+.pp
+The following structure was added to allow domain-specific
+functions to be called indirectly.
+All these functions operate on a network-layer pcb.
+.pp
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct nl_protosw {
+.T&
+l l l l.
++int+nlp_afamily;+/* address family */
++int+(*nlp_putnetaddr)();+/* puts addrs in pcb */
++int+(*nlp_getnetaddr)();+/* gets addrs from pcb */
++int+(*nlp_putsufx)();+/* transp suffix -> pcb */
++int+(*nlp_getsufx)();+/* gets t-suffix */
++int+(*nlp_recycle_suffix)();+/* zeroes suffix */
++int+(*nlp_mtu)();+/* get maximum
++++transmission unit size */
++int+(*nlp_pcbbind)();+/* bind to pcb */
++int+(*nlp_pcbconn)();+/* connect */
++int+(*nlp_pcbdisc)();+/* disconnect */
++int+(*nlp_pcbdetach)();+/* detach pcb */
++int+(*nlp_pcballoc)();+/* allocate a pcb */
++int+(*nlp_output)();+/* emit packet */
++int+(*nlp_dgoutput)();+/* emit datagram */
++caddr_t+nlp_pcblist;+/* list of pcbs
++++for management
++++of connections */
+};
+.TE
+\fR
+.)b
+.lp
+The switch is based on the address family chosen when the
+\fIsocket()\fR system call is made prior to connection establishment.
+This unfortunately ties the address family to the domain,
+but the only alternative is to add an argument to the \fIsocket()\fR
+system call to let the user specify the desired network layer.
+In the case of a connection oriented environment with no multi-homing,
+it would be possible to determine which network layer is to be
+used
+from routing
+information, but to do this requires unrealistic assumptions
+about the environment.
+For these reasons, linking the address family to the network
+layer protocol is seen as the least of the evils.
+The transport suffixes are kept in the network layer's pcb
+as well as in the transport layer because
+full transport address pairs are used to identify a connection
+in the Internet domain.
+.sh 1 "The Architecture of the Transport Protocol Entity"
+.pp
+A set of protocol hooks is required
+by the AOS IPC architecture.
+These hooks are used by the protocol-independent parts of the kernel
+to gain entry to protocol-specific code.
+The protocol code can be entered in one of the following ways:
+.ip "1) " 5
+at boot time, when autoconfiguration
+initializes each protocol through
+the
+\fIpr_init()\fR
+hook,
+.ip "2) " 5
+from above, either
+a user program making a system call, through
+the \fIpr_usrreq()\fR or \fIpr_ctloutput()\fR hooks, or
+from a higher layer protocol using the
+\fIpr_output()\fR hook,
+.ip "3) " 5
+from below, a device interrupt servicing an incoming packet
+through the \fIpr_input()\fR and \fIpr_ctlinput()\fR hooks, and
+.ip "4) " 5
+from a clock interrupt through the \fIpr_slowtimo()\fR
+or the
+\fIpr_fasttimo()\fR hook.
+.\" FIGURE
+.so figs/trans_flow.nr
+.\".so figs/trans_flow.grn
+.pp
+The protocol code can be divided into
+the following modules, which are described in more detail below.
+.CF
+shows the flow of data and control
+among these modules.
+.in +5
+.ip "Timers and References:" 5
+The code executed on behalf of \fIpr_slowtimo()\fR.
+The fast timeout is not used by TP.
+.ip "Driver:" 5
+This is the finite state machine for TP.
+.ip "Input: " 5
+This is the module that decodes incoming packets,
+identifies or creates the pcb for which
+the packet is destined, and creates an "event" to
+pass to the driver.
+.ip "Output:" 5
+This is the module that creates a packet header of a given type
+with fields containing
+values that are appropriate to the connection
+on which the packet is being sent, appends data if necessary,
+and hands a packet
+to the lower layer, according to the transport-to-lower-layer
+interface.
+.ip "Send: " 5
+This module packetizes data from the outbound
+socket buffer, \fIso_snd\fR,
+handles retransmissions of packetized data, and
+drops packetized data from the retransmission queue.
+.ip "Receive:" 5
+This module reorders packets if necessary,
+depacketizes data, passes it to the socket code module,
+and determines when acknowledgments should be sent.
+.in -5
+.sh 1 "Timers and References"
+.pp
+TP identifies sockets by \fIreference numbers\fR, or
+\fIreferences\fR,
+which are \*(lqfrozen\*(rq (may not be reassigned)
+until some locally defined time after
+a connection is broken and its protocol control block
+is discarded.
+An array of \fIreference blocks\fR is maintained by TP.
+The reference number of a reference block is its
+offset in the array.
+When a reference block is in use it contains
+a pointer to the pcb for the socket to which the
+reference applies.
+.pp
+The system clock calls the \fIpr_slowtimo()\fR and
+\fIpr_fasttimo()\fR hooks for each protocol in the protocol switch table
+every 500 and 200 microseconds, respectively.
+Each protocol handles its own timers its own way.
+The timers in TP take two forms
+- those that typically are cancelled and
+those that usually expire.
+The latter form may have more than one instantiation at any given
+time.
+The former may not.
+The two are implemented slightly
+differently for the sake of performance.
+.pp
+The timers that normally expire
+are kept in a queue, their values all relative
+to the value of preceding timer.
+Thus all timer values are decremented by a single
+operation on the value of the first timer.
+The timer is represented by the Ecallout structure:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct Ecallout {
+.T&
+l l l l.
++int+c_time;+/* incremental time */
++int+c_func;+/* function to call */
++u_int+c_arg1;+/* argument to routine */
++u_int+c_arg2;+/* argument to routine */
++int+c_arg3;+/* argument to routine */
++struct Ecallout+*c_next;
+};
+.TE
+\fR
+.)b
+.lp
+When an Ecallout structure migrates to the head
+of the E timer list, and its \fIc_time\fR
+field is decremented to zero,
+the function stored in \fIc_func\fR is
+called, with \fIc_arg1, c_arg2\fR, and \fIc_arg3\fR
+as arguments.
+Setting and cancelling these timers
+are accomplished by a linear search and one
+insertion or deletion from the timer queue.
+This queue is linked to the
+reference block associated with a communication endpoint.
+This form used for the reference timer
+and for the retransmission timers for data TPDUs.
+.pp
+The second form of timer, the type that
+typically is cancelled, is used for several
+timers - the inactivity timer, the sendack timer,
+and the retransmission
+timer for all types of TPDUs except data TPDUs.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct Ccallout {
+.T&
+l l l l.
++int+c_time;+/* incremental time */
++int+c_active;+/* this timer is active? */
+};
+.TE
+\fR
+.)b
+.lp
+All of these timers are stored
+directly
+in the reference block.
+These timers are decremented in one linear scan of
+the reference blocks.
+Cancelling, setting, and both
+cancelling and resetting one of these timers is accomplished by a
+single assignment to an array element.
+.sh 1 "Driver"
+.pp
+This is the finite state machine for TP.
+A connection is managed by the finite state machine (fsm).
+All events that pertain to a connection cause the
+finite state machine driver to be called.
+The driver takes two arguments - the pcb for the connection
+and an event structure.
+The event structure contains a field that discriminates
+the different types of events, and a union of
+structures that are specific to the event types.
+The driver evaluates a set of predicates based on the current
+state of the finite state machine (which is kept in the pcb) and the event type.
+The result of the predicate evaluation determines
+a set of actions to take and a state transition.
+The driver takes the actions and if they complete
+without errors, the driver makes the state transition.
+.pp
+The states, event types, predicates, actions, and state transitions are all
+specified as a \fIxebec transition file\fR.
+\fIXebec\fR is a utility that takes a human-readable description
+of a finite state machine
+and produces a set of tables and C source code for the driver.
+The driver procedure is called \fItp_driver()\fR.
+It is located in a file generated by xebec,
+\fCtp_driver.c\fR.
+For more details about xebec, see the manual page \fIxebec(1)\fR.
+.pp
+The transition file for TP is \fCtp.trans\fR,
+and it is a good place to begin a perusal of the TP
+source code.
+.sh 1 "Input"
+.pp
+This is the module that decodes an incoming packet,
+locates or creates the pcb for which
+the packet is destined, and creates an event to
+pass to the driver.
+The network layer passes a packet up to the appropriate
+transport layer by indirectly calling a transport input
+routine through the protocol switch table for the network
+domain.
+There is one protocol switch entry for TP for each domain in which
+TP will run (Internet, ISO).
+In the Internet domain, the protocol switch field \fIpr_input()\fR
+takes the value \fItpip_input()\fR.
+This procedure accepts a packet from IP, with the IP header
+still intact.
+It extracts the network addresses from the IP header,
+strips the IP header, and calls the domain-independent
+input procedure for TP,
+\fItp_input()\fR.
+\fITp_input()\fR
+decodes a TPDU.
+The multitude of options, the variable-length
+nature of the options, the semantics of the
+options, and the possible combinations of concatenated
+TPDUs make this a
+complex procedure.
+It is sensitive to changes, and from
+the point of view of a software maintenance, it is a
+potential hazard.
+Because it is in the
+critical path of TP however, some compromise
+was made between maintainability and efficiency.
+Multiple copies of sections of code were avoided as much as
+possible,
+not for the sake of saving space, but rather for the sake
+of maintainability.
+Ironically,
+this detracts somewhat from the readability of the code.
+.pp
+Once a TPDU has been decoded and a pcb has been
+identified for the TPDU,
+the appropriate fields of the TPDU
+are extracted and their values are placed in
+an event structure.
+Finally, \fItp_driver()\fR is called with
+the event structure and the pcb as parameters.
+.sh 1 "Output"
+.pp
+This module creates a TPDU header of a given type
+with field values that are appropriate to the connection
+on which the TPDU is being sent, appends data if necessary,
+and hands a TPDU
+to the lower layer according to the transport-to-lower-layer
+interface.
+Whenever a TPDU is to be sent to the peer or prospective peer,
+the function \fItp_emit()\fR
+is called, passing as arguments the pcb a TPDU type and several miscellaneous
+other type-specific arguments, possibly including some data.
+The data are in the form of an mbuf chain.
+\fITp_emit()\fR prepends to the data an mbuf containing a TP header,
+fills in the fields of the header according to the parameters
+given, performs the checksum if appropriate, and
+calls a domain-specific output routine.
+For the Internet domain, this output routine is
+\fItpip_output()\fR, which takes
+as arguments the mbuf chain representing the TPDU,
+and a network level pcb.
+Some protocol errors cannot be associated with
+a connection
+but require that TP issue
+an ER TPDU or a DR TPDU.
+When these errors occur the routine
+\fItp_error_emit()\fR is called.
+This procedure creates the appropriate type of TPDU
+and passes it to a domain-dependent routine for transmitting datagrams.
+In the Internet domain,
+\fItpip_output_dg()\fR is called.
+This takes as arguments an mbuf chain representing the TPDU,
+a source network address, and a destination network address.
+.sh 1 "Send"
+.\" FIGURE
+.so figs/mbufsnd.nr
+.\".so figs/mbufsnd.grn
+.pp
+This module packetizes data from the outbound
+socket buffer, \fIso_snd\fR,
+handles retransmissions of packetized data, and
+drops packetized data from the retransmission queue.
+The major routine in this module is \fItp_send()\fR, which
+takes a range of sequence numbers as arguments.
+For each sequence number in the range,
+it packetizes the an appropriate amount
+of outbound data, and places the resulting TPDU on
+a retransmission control queue subject to the
+constraints imposed by the rules of expedited data,
+maximum packet sizes, and end-of-TSDU markers.
+.pp
+The most complicating factor is that of managing
+expedited data.
+A normal datum may not be sent (for its first time) before the
+acknowledgment of any expedited datum
+that was received from the user after the
+normal datum was received.
+In order to enforce this rule,
+each TPDU must be marked in some way
+so that it will be known which expedited datum
+must be delivered and acknowledged by the peer before this TPDU may be transmitted
+for the first time.
+Markers are placed in \fIso_snd\fR
+when an
+outgoing expedited datum arrives from the user.
+A marker is an mbuf structure with an \fIm_len\fR
+of zero, but with the data area nevertheless containing
+the sequence number of an expedited data TPDU.
+The \fIm_type\fR of a marker is a new type, MT_XPD.
+.pp
+\fITp_send()\fR stops packetizing data when it encounters a marker
+for an unacknowledged expedited datum.
+If it encounters a marker for an expedited TPDU that has already
+been acknowledged, the marker is jettisoned.
+.CF
+illustrates the structure of the sending socket buffer used
+for normal data.
+.pp
+When \fItp_send()\fR moves data from mbufs on \fIso_snd\fR to the retransmission
+control queue, it needs to know
+how many octets of data can be placed in each TPDU.
+The appropriate amount depends on, among other things,
+the maximum transmission unit of the network layer
+on the route the packet will take.
+To determine the maximum transmission unit,
+TP queries the network layer through
+the domain-dependent switch table's field, \fInl_mtu\fR.
+In the Internet domain, this resolves to \fItp_inmtu()\fR.
+The header sizes for the network and transport layers
+also affect the amount of data that can go into a packet,
+and these sizes depend on the connection's characteristics.
+.pp
+Once the maximum amount of data per TPDU is determined,
+\fItp_send()\fR can pull this amount off the \fIso_snd\fR queue to form
+a TPDU,
+assign a TPDU sequence number,
+and place the new TPDU on the
+retransmission control queue.
+The retransmission control queue is a list of mbuf chains.
+Each mbuf chain represents one TPDU, preceded by an
+\fIrtc structure\fR:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct tp_rtc {
+.T&
+l l l l.
++struct tp_rtc+*tprt_next;+/* next rtc struct in list */
++SeqNum+tprt_seq;+/* seq # of this TPDU */
++int+tprt_eot;+/* end of TSDU? */
++int+tprt_octets;+/* # octets in this TPDU */
++struct mbuf+*tprt_data;+/* ptr to the octets of data */
+.\"/* Performance measurment info: */
+.\"int tprt_window; /* in which call to tp_send() was
+.\" * this TPDU formed?
+.\" */
+.\"struct timeval tprt_sess_time; /* time session received the
+.\" * majority of the data for this packet on send;
+.\" * on recv, this is the time it's given to session
+.\" */
+.\"struct timeval tprt_net_time; /* time first copy was given to net layer
+.\" * on send; on receive it's the time received from
+.\" * the network
+.\" */
+};
+.TE
+\fR
+.)b
+.lp
+Once TPDUs are on the retransmission control queue,
+they are retransmitted or dropped by the actions
+of timers.
+The procedure \fItp_sbdrop()\fR
+removes the TPDUs from the retransmission queue.
+It takes a sequence number as an argument and drops
+all TPDUs up to and including the TPDU with that sequence number.
+.pp
+When an AK TPDU arrives, the values from
+its credit and sequence number fields
+are passed to \fItp_goodack()\fR, which
+determines whether or not the AK brought any news with it,
+and therefore whether TP can send more data
+or expedited data.
+If this AK acknowledges something heretofore unacknowledged,
+\fItp_goodack()\fR drops the appropriate TPDU(s) from the retransmission
+control list, computes the smoothed average round trip time
+and standard deviation of the round trip time,
+and updates
+the retransmission timer based on these statistics.
+It sets a flag in the pcb if the TP entity is obliged to
+send the flow control confirmation parameter on its next
+AK TPDU.
+\fITp_goodack()\fR returns true if the AK brought some news with it,
+either with respect to a change in credit or with respect to
+new acknowledgments.
+.pp
+The function \fItp_goodXack()\fR is called when an XAK TPDU
+arrives.
+It takes the XAK sequence number as an argument and
+determines if the XAK acknowledges the last XPD TPDU sent.
+If so, it drops the expedited data from the outgoing
+expedited data buffer.
+By its definition in the TP specification,
+the expedited data stream has a window
+of size 1,
+that is,
+only one expedited datum (packet) can be buffered
+at a time.
+\fITp_goodXack()\fR returns true if the XAK acknowledged
+the last XPD TPDU sent and the data were dropped,
+and it returns false if the acknowledgment caused no action to be taken.
+.\" NEXT FIGURE
+.so figs/mbufrcv.nr
+.\".so figs/mbufrcv.grn
+.sh 1 "Receive"
+.pp
+This module reorders incoming TPDUs if necessary,
+depacketizes data, passes it to the socket code module,
+and determines when acknowledgments should be sent.
+The function
+\fItp_stash()\fR
+takes an DT TPDU as an argument, and if the TPDU is not in
+sequence, it saves the TPDU in a \fItp_rtc\fR structure in
+a list, with the TPDUs
+kept in order.
+When the next expected TPDU arrives, the
+list of out-of-order TPDUs is scanned for
+more TPDUs in sequence, updating
+a field in the pcb, \fItp_rcvnxt\fR which
+always contains the sequence
+number of
+the next expected TPDU.
+If an acknowledgment is to be generated
+at any time, the value of tp_rcvnxt goes into the
+\fIYR-TU-NR\fR\** field of the acknowledgment TPDU.
+.(f
+\**
+This is the name used in ISO 8073 for the field
+which indicates the sequence number of the next expected DT TPDU.
+.)f
+.pp
+\fITp_stash()\fR returns true if an acknowledgment needs to be generated
+immediately, false not.
+The acknowledgment strategy is therefore implemented in this routine.
+Acknowledgments may be generated for one or more of several reasons,
+listed below.
+\fITp_stash()\fR increments a counter for each of these reasons
+for which an acknowledgment is generated, and a counter for TPDUs
+that are not acknowledged immediately.
+.ip "ACK_STRAT_EACH" 5
+The acknowledgment strategy in use calls for acknowledging each
+data packet with an AK TPDU.
+.ip "ACK_STRAT_FULLWIN" 5
+The acknowledgment strategy in use calls for acknowledging
+upon receiving the DT TPDU that represents the upper window
+edge of the last advertised window.
+.ip "ACK_DUP" 5
+A duplicate data TPDU was received.
+.ip "ACK_REORDER" 5
+A DT TPDU arrived in the window but out of order.
+.ip "ACK_EOT" 5
+A DT TPDU arrived, and it had the end-of-TSDU flag set.
+.pp
+Upon receipt of a DT TPDU that is in order, and upon reordering
+DT TPDUs,
+\fItp_stash()\fR
+places the TSDUs into the socket's receive
+socket buffer, \fIso->so_rcv\fR in mbuf chains, with
+TSDUs delimited by mbufs of the \fIm_type\fR MT_EOT,
+which is a new type with the ARGO kernel.
+.CF
+illustrates the structure of the receiving socket buffer used
+for normal data.
+.pp
+A separate socket buffer, \fItpcb->tp_Xrcv\fR,
+is used for
+buffering expedited data.
+Only one expedited data packet may reside in this buffer at a time
+because the TP standard limits the size of the window on expedited flow
+to be 1.
+This means the data structures are straightforward;
+there is no need to distinguish between separate TSDUs in this socket buffer.
+.pp
+Credit is determined
+by dividing the total amount of available
+space in the receive buffer
+by the negotiated maximum TPDU size.
+TP can often offer a larger credit than this if it uses
+an average of the measured actual TPDU sizes.
+This strategy was once an option in the ARGO kernel,
+but it was removed because unless the actual TPDU size
+is constant, it leads to reneging of credit,
+retransmissions, and decreased performance.
+It does not work well when there is any fluctuation in the sizes
+of TPDUs and it carries the penalty of lengthening the critical path
+of the TP entity.
+.sh 1 "Major Data Structures and Types"
+.pp
+In addition to the types commonly used in the kernel,
+such as
+.(b
+\fC
+.TS
+tab(+);
+l l l l.
+ +typedef+unsigned char+u_char;
+ +typedef+unsigned int+u_int;
+ +typedef+unsigned short+u_short;
+.TE
+\fR
+.)b
+TP uses the following types:
+.(b
+\fC
+.TS
+tab(+);
+l l l l.
+ +typedef+unsigned int+SeqNum
+ +typedef+unsigned short+RefNum;
+ +typedef+int+ProtoHook;
+.TE
+\fR
+.)b
+.pp
+Sequence numbers can be either 7 or 31 bits.
+An unsigned integer is used in all cases, and the proper type
+of arithmetic is performed with bit masks.
+Reference numbers are 16 bits.
+ProtoHook is the type of the procedures that are in switch
+tables, which,
+although they are not functions,
+are declared \fIint\fR rather than \fIvoid\fR
+to be consistent with the rest of the kernel.
+.pp
+The following structures are fundamental
+types used throughout TP,
+in addition to those already described in the
+section,
+"The Design of the Transport Entity".
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct tp_ref {
+.T&
+l l l l.
++u_char+tpr_state;+/* REF_FROZEN...*/
++struct Ccallout+tpr_callout[N_CTIMERS];+/* C timers */
++struct Ecallout+tpr_calltodo;+/* E timers list */
++struct tp_pcb+*tpr_pcb;+/* --> PCB */
+};
+.TE
+\fR
+.)b
+.lp
+The reference structure is logically a part of the protocol
+control block and it is linked to a pcb, but it may outlive
+a pcb.
+When a connection is dissolved, the pcb may be recycled
+but the reference structure must remain until the reference
+timer goes off.
+The field \fItpr_state\fR takes the values
+REF_FROZEN (a reference timer is ticking),
+REF_OPEN (in use, has timers and an associated pcb),
+REF_OPENING (has a pcb but no timers), and
+REF_FREE (free to reallocate).
+.pp
+The TP protocol control block is too large to fit into
+one mbuf structure so it comprises two structures
+linked together, the
+\fItp_pcb\fR structure and the.
+\fItp_pcb_aux\fR structure.
+The \fItp_pcb_aux\fR structure contains
+items that are used less frequently than those in
+the former structure, since each access to these
+items requires a second pointer dereference.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct tp_pcb_aux {
+.T&
+l l l s.
+ +struct sockbuf+tpa_Xsnd;+/* for expedited data */
++struct sockbuf+tpa_Xrcv;+/* for expedited data */
++u_char +tpa_vers;+/* protocol version */
++u_char +tpa_peer_acktime;+/* to compute DT TPDU
++++retrans timer value */
++SeqNum+tpa_Xsndnxt;+/* seq # of
++++next XPD to send */
++SeqNum+tpa_Xuna;+/* seq # of
++++unacked XPD */
++SeqNum+tpa_Xrcvnxt;+/* next XPD seq #
++++expect to recv */
++/* addressing */
++u_short+tpa_domain;+/* domain AF_ISO,...*/
++u_short+tpa_fsuffixlen;+/* foreign suffix */
++u_char+tpa_fsuffix[MAX_TSAP_SEL_LEN];+
++u_short+tpa_lsuffixlen;+/* local suffix */
++u_char+tpa_lsuffix[MAX_TSAP_SEL_LEN];+
+.T&
+l s s s.
+ +/* AK subsequencing */
+.T&
+l l l s.
+ +u_short+tpa_s_subseq;+/* next subseq to send */
++u_short+tpa_r_subseq;+/* highest recv subseq */
+};
+.TE
+\fR
+.)b
+.pp
+The major portion of the protocol control block is in the
+\fItp_pcb\fR structure:
+.(b
+\fC
+.TS
+tab(%);
+l s s s.
+struct tp_pcb {
+.\" ***************************************
+.T&
+l l l l.
+.\" The next line sets the spacing for the table: 1+3 17+3 17+3 13+3
+ % % %
+.\"456789 123456789- 123456789 123456-789 123456789 1234567890
+.\"
+ %struct tp_ref%*tp_refp;%
+.T&
+l l l s.
+%%/* reference structure */%
+.\" ***************************************
+.T&
+l l l l.
+ %struct tp_pcb_aux%*tp_aux;%
+.T&
+l l l s.
+ %%/*rest of tpcb (auxiliary struct)*/%
+.\" ***************************************
+.T&
+l l l l.
+ %caddr_t%tp_npcb;%/* to ll pcb */
+%struct nl_protosw%*tp_nlproto;%
+.T&
+l l l s.
+ % %/* domain-dependent routines */%
+.\" ***************************************
+.T&
+l l l l.
+ %struct socket%*tp_sock;%/* back ptr */
+.\" ***************************************
+.T&
+l s s s.
+
+/* local and foreign reference numbers: */
+.T&
+l l l l.
+ %RefNum%tp_lref;%
+%RefNum%tp_fref;%
+.\" ***************************************
+.T&
+l s s s.
+.\"456789 123456789 123456789 123456789 123456789 1234567890
+
+/* Stuff for sequence space arithmetic:
+ * Maintaining 2 sequence spaces is a pain so we set these
+ * values once at connection establishment time. Sequence
+ * number arithmetic is a set of macros which uses these.
+ * Sequence numbers are stored as 32 bits.
+ * tp_seqmask tells which of the 32 bits is used.
+ * tp_seqibt is the lsb that is not used. When set,
+ * it indicates wraparound has occurred.
+ * tp_seqhalf is the value that is half the sequence space.
+ * (or half plus one).
+ */
+.T&
+l l l l.
+%u_int%tp_seqmask;%/* mask */
+%u_int%tp_seqbit;%/* wraparound */
+%u_int%tp_seqhalf;%/* half space */
+.\" ***************************************
+.T&
+l s s s.
+
+/* flags: values are defined in tp_user.h.
+ * Here we keep such info as which options
+ * are in use: checksum, extended format,
+ * flow control in class 2, etc.
+ * See tp(4p) man page.
+ */
+.\" ***************************************
+.T&
+l l l l.
+ %u_short%tp_state;%/* fsm */
+%short%tp_retrans;%
+.T&
+l l l s.
+ % % /* # times to retransmit */%
+.\" ***************************************
+.T&
+l s s s.
+
+/* credit & sequencing info for SENDING: */
+.T&
+l l l s.
+ %u_short%tp_fcredit;%
+ % %/* remote real window */%
+ %u_short%tp_cong_win;%
+ % %/* remote congestion window */%
+.\" ***************************************
+%SeqNum%tp_snduna;%
+.T&
+l l l s.
+ % %/* seq # of lowest unacked DT */%
+.\" ***************************************
+.T&
+l l l l.
+ %struct tp_rtc %*tp_snduna_rtc;%
+.T&
+l l l s.
+ % %/* ptr to mbufs containing lowest%
+%% * unacked TPDUs sent so far%
+%% */%
+.\" ***************************************
+.T&
+l l l l.
+ %SeqNum%tp_sndhiwat;%
+.T&
+l l l s.
+ % %/* highest DT sent yet */%
+.\" ***************************************
+.T&
+l l l l.
+ %struct tp_rtc%*tp_sndhiwat_rtc;%
+.T&
+l l l s.
+ % %/* ptr to mbufs containing the last%
+%% * DT sent - this is the last item %
+%% * on the list that starts%
+%% * at tp_snduna_rtc%
+%% */%
+.\" ***************************************
+.T&
+l l l l.
+ %int %tp_Nwindow;%/* for perf. measmt */
+.\" ***************************************
+.T&
+l s s s.
+
+/* credit & sequencing info for RECEIVING: */
+.\" ***************************************
+.T&
+l l l s.
+ %SeqNum%tp_sent_lcdt;%
+ %%/* cdt according to last AK sent */%
+ %SeqNum%tp_sent_uwe;%
+ % %/* upper window edge, according to%
+%% * the last AK sent %
+%% */*
+ %SeqNum%tp_sent_rcvnxt;%
+ % %/* rcvnxt, according to%
+%% * the last AK sent%
+%% */*
+.\" ***************************************
+.T&
+l l l l.
+ %short%tp_lcredit;%/* local */
+.\" ***************************************
+.T&
+l l l l.
+ %SeqNum%tp_rcvnxt;%
+.T&
+l l l s.
+ % %/* next DT seq# we expect to recv */%
+.\" ***************************************
+.T&
+l l l l.
+ %struct tp_rtc%*tp_rcvnxt_rtc;%
+.T&
+l l l s.
+ % %/* ptr to mbufs containing unacked %
+%% * DTs received out of order, and %
+%% * which we haven't acknowledged%
+%% */%
+.\" ***************************************
+.TE
+.TS
+tab(%);
+l s s s.
+/* Items kept in the aux structure: */
+
+.\" ***************************************
+.T&
+l s s l.
+#define tp_vers%tp_aux->tpa_vers
+#define tp_peer_acktime%tp_aux->tpa_peer_acktime
+#define tp_Xsnd%tp_aux->tpa_Xsnd
+#define tp_Xrcv%tp_aux->tpa_Xrcv
+#define tp_Xrcvnxt%tp_aux->tpa_Xrcvnxt
+#define tp_Xsndnxt%tp_aux->tpa_Xsndnxt
+#define tp_Xuna%tp_aux->tpa_Xuna
+#define tp_domain%tp_aux->tpa_domain
+#define tp_fsuffixlen%tp_aux->tpa_fsuffixlen
+#define tp_fsuffix%tp_aux->tpa_fsuffix
+#define tp_lsuffixlen%tp_aux->tpa_lsuffixlen
+#define tp_lsuffix%tp_aux->tpa_lsuffix
+#define tp_s_subseq%tp_aux->tpa_s_subseq
+#define tp_r_subseq%tp_aux->tpa_r_subseq
+.\" ***************************************
+.T&
+l s s s.
+ % % %
+/* parameters per-connection controllable by user: */
+.\" ***************************************
+.T&
+l l l l.
+ %struct%tp_conn_param%_tp_param;
+ % % %
+.\" ***************************************
+.T&
+l s s l.
+#define tp_Nretrans%_tp_param.p_Nretrans
+#define tp_dr_ticks%_tp_param.p_dr_ticks
+#define tp_cc_ticks%_tp_param.p_cc_ticks
+#define tp_dt_ticks%_tp_param.p_dt_ticks
+#define tp_xpd_ticks%_tp_param.p_x_ticks
+#define tp_cr_ticks%_tp_param.p_cr_ticks
+#define tp_keepalive_ticks%_tp_param.p_keepalive_ticks
+#define tp_sendack_ticks%_tp_param.p_sendack_ticks
+#define tp_refer_ticks%_tp_param.p_ref_ticks
+#define tp_inact_ticks%_tp_param.p_inact_ticks
+#define tp_xtd_format%_tp_param.p_xtd_format
+#define tp_xpd_service%_tp_param.p_xpd_service
+#define tp_ack_strat%_tp_param.p_ack_strat
+#define tp_rx_strat%_tp_param.p_rx_strat
+#define tp_use_checksum%_tp_param.p_use_checksum
+#define tp_tpdusize%_tp_param.p_tpdusize
+#define tp_class%_tp_param.p_class
+#define tp_winsize%_tp_param.p_winsize
+#define tp_netservice%_tp_param.p_netservice
+#define tp_no_disc_indications%_tp_param.p_no_disc_indications
+#define tp_dont_change_params%_tp_param.p_dont_change_params
+.\" ***************************************
+.TE
+.\" ***************************************
+.\" ***************************************
+.\" ***************************************
+.TS
+tab(%);
+l l l l.
+.\" The next line sets the spacing for the table: 1+3 17+3 17+3 13+3
+.\"456789 123456789- 123456789 123456-789 123456789 1234567890
+.\"
+.T&
+l l l s.
+ %%/* log2(the negotiated max size) */%
+.T&
+l l l l.
+ %int%tp_l_tpdusize;%/* # bytes */
+.\" ***************************************
+ %struct timeval%tp_rtt;%
+.T&
+l l l s.
+ % %/* smoothed avg round-trip time */%
+ %struct timeval%tp_rtv;%
+ % %/* std deviation of round-trip time */%
+%struct timeval%tp_rttemit[ TP_RTT_NUM + 1 ];%
+%%/* times that the last TP_RTT_NUM %
+%% * DT_TPDUs were transmitted %
+%% */%
+.\" ***************************************
+ %unsigned % %
+% tp_sendfcc:1,%/* shall next ack %
+% %include flow control conf. param? */%
+.\" ***************************************
+.T&
+l l l s.
+ % tp_trace:1,%/* is this pcb being traced?%
+%% * (not used yet) %
+%% */%
+.\" ***************************************
+% tp_perf_on:1,%/* statistics being kept? */%
+.\" ***************************************
+% tp_reneged:1,%/* have we reneged on credit%
+%% * since the last AK TPDU was sent? %
+%% */%
+% tp_decbit:4,%/* congestion experienced? */%
+% tp_flags:8,%/* see #defines below */%
+.\" ***************************************
+% tp_unused:16;%%
+.T&
+l s s l.
+#define TPF_XPD_PRESENT%TPFLAG_XPD_PRESENT
+#define TPF_NLQOS_PDN%TPFLAG_NLQOS_PDN
+#define TPF_PEER_ON_SAMENET%TPFLAG_PEER_ON_SAMENET
+%%%
+.\" ***************************************
+.T&
+l l l l.
+ %struct tp_pmeas%*tp_p_meas;%
+.T&
+l l l s.
+ % %/* ptr to mbuf to hold the perf.%
+%% * statistics structure %
+%% */%
+.\" ***************************************
+};
+.TE
+\fR
+.\"
+.\" end of tpcb structure (thank you)
+.\"
+.)b
+.fi
+.sh 1 "Sequence Number Arithmetic"
+.pp
+Sequence numbers in TP can be either 7 bits
+(\*(lqnormal format\*(rq)
+or 31 bits
+(\*(lqextended format\*(rq).
+Sequence numbers are unsigned integers,
+regardless of their format.
+Three fields are kept in the pcb to manage the sequence
+number arithmetic:
+.(b
+\fC
+.TS
+tab(+);
+l l l l.
+ +u_int+tp_seqmask;+/* mask for seq space */
+ +u_int+tp_seqbit;+/* bit for seq # wraparound */
+ +u_int+tp_seqhalf;+/* half the seq space */
+.TE
+\fR
+.)b
+.lp
+\fITp_seqmask\fR
+is a bit mask indicating which bits are legitimate
+for a sequence number of either format.
+It takes the value 0x7f if 7-bit sequence numbers are in use,
+and 0x7fffffff if 31-bit sequence numbers are in use.
+\fITp_seqbit\fR
+is the bit that becomes set when a sequence number wraps around
+while being incremented.
+Its value is 0x80 for normal format, 0x80000000 for extended format.
+\fITp_seqhalf\fR
+takes the value which is in the middle of the sequence space,
+0x40 for normal format,
+and
+0x40000000 for extended format.
+.(b
+.nf
+The macro
+.fi
+\fC
+.TS
+tab(+);
+l l l l.
+ SEQ(tpcb, x)
+.TE
+\fR
+.)b
+.lp
+extracts a sequence number from the location
+in which it is stored.
+.pp
+The macros
+.(b
+\fC
+.TS
+tab(+);
+l l s s l.
+ +SEQ_GT(tpcb, seq, t)+is seq > t?
+ +SEQ_GEQ(tpcb, seq, t)+is seq >= t?
+ +SEQ_LT(tpcb, seq, t)+is seq < t?
+ +SEQ_LEQ(tpcb, seq, t)+is seq <= t?
+ +SEQ_INC(tpcb, seq)+seq\+\+
+ +SEQ_DEC(tpcb, seq)+seq--
+ +SEQ_SUB(tpcb, seq, amt)+seq -= amt
+ +SEQ_ADD(tpcb, seq, amt)+seq \+= amt
+.TE
+\fR
+.)b
+.lp
+perform the indicated comparisons and arithmetic
+on their arguments.
+.pp
+An example of how these macros
+are used is as follows.
+To determine if a sequence
+number \fIseq\fR is in a receive window
+bounded by
+\fIlwe\fR and \fIuwe\fR,
+we define the
+macro
+.(b
+\fC
+.TS
+tab(+);
+l l.
+#define+IN_RWINDOW(tpcb, seq, lwe, uwe)\\
++( SEQ_GEQ(tpcb, seq, lwe) && SEQ_LT(tpcb, seq, uwe) )
+.TE
+\fR
+.)b
+.sh 1 "TP Implementation Options"
+.pp
+The transport protocol specification leaves several
+things to the discretion of the implementor,
+some of which may affect the performance
+of individual connections and
+aggregate performance.
+Wherever different strategies are likely to favor
+the performance of
+individual connections to the detriment of aggregate performance
+or vice versa, the
+various strategies are under the control of options via the
+\fIgetsockopt()\fR and
+\fIsetsockopt()\fR system calls (see the manual pages
+\fIgetsockopt(2)\fR,
+\fIsetsockopt(2)\fR
+and
+\fItp(4p)\fR
+for details).
+In some cases the preferred strategies differ for the different
+subnetworks, so the strategies chosen will be determined
+by the subnetwork in use.
+.sh 2 "TPDU size"
+.pp
+The limitation of the maximum TPDU size to a power of two is
+unfortunate in the LAN environment.
+For example, if the maximum NSDU size is around 1500, as in the case of an
+Ethernet,
+using a maximum TPDU size of 1024 reduces
+the possible throughput by approximately 30%.
+TP negotiates a maximum TPDU size of 2048 and
+generates TPDUs of size around 1500.
+Obviously this works well only when the peer is known to be
+using the same scheme (so that the peer
+doesn't send TPDUs of size 2048 and cause its
+network layer to fragment the TPDUs).
+This is likely to be the case in a LAN where
+all protocol entities are under the same administrative
+control.
+The maximum TPDU size negotiated is under the control of the user,
+so
+it is possible to prevent this scheme from being used
+by default
+when the peer is not on the same LAN, by
+setting the \fItp.tpdusize\fR parameter in the ARGO directory service
+file to
+something less than the network's maximum transmission
+unit.
+.\"***********************************************************
+.sh 2 "Congestion Window Strategy"
+.pp
+The congestion window strategy from the
+DoD Internet
+was adapted for use with TP.
+The strategy is intended to minimize the
+adverse effect
+of transport's retransmission on an
+already congested network.
+.pp
+A TP entity keeps two notions of the peer's window:
+the real window, which is that advertised by the peer
+in AK TPDUs, and the congestion window, which is a locally
+controlled window.
+TP uses the smaller of the two windows when transmitting.
+The congestion window starts small, which keeps a
+new connection from overloading the network with a sudden
+burst of packets
+immediately after connection establishement.
+This is called \fIslow start\fR.
+For each successful acknowledgment received, the congestion
+window grows by one, until eventually the real window
+is the one in use.
+If a retransmission timer expires, the congestion window
+is reset to size one.
+.pp
+The congestion window strategy is used for class 4 unless
+the transport user requests that it not be used.
+The slow start strategy is used for traffic over a PDN
+unless
+the transport user requests that it not be used.
+Slow start is not used for traffic over a LAN unless
+its use is requested by the transport user.
+.\"***********************************************************
+.sh 2 "Retransmission strategies"
+.pp
+A retransmission timer is invoked for each set of DT TPDUs
+sent in one send operation (call to \fItp_send()\fR).
+This set of packets is called the \fIsend window\fR for the purpose
+of this discusssion.
+.pp
+The number of TPDUs
+in a send window
+depends on the remote credit and the amount of data
+in the local send buffers.
+When a retransmission timer goes off, the lower
+window edge
+is reevaluated but the upper window edge is not reevaluated.
+.pp
+There are several retransmission strategies implemented in
+ARGO TP.
+The choice of strategies is the user's, and is made with the
+\fIsetsockopt()\fR system call.
+The strategies are summarized here:
+.ip "Retransmit LWE TPDU only:" 5
+Only the TPDU representing the new lower window edge
+is retransmitted.
+This is the default retransmission strategy.
+.ip "Retransmit whole send window:" 5
+Retransmission begins with the new lower window edge
+and continues up to the old upper window edge.
+.pp
+The value of the data retransmission timer
+adapts to the average round trip time and the standard deviation of
+the round trip time.
+A round trip time is the time that passes between
+the moment of a packet's first transmission and
+the moment it is first acknowledged.
+The average round trip time
+is kept by the sending side of TP, using
+a formula for
+smoothing the average:
+.(b
+\fC
+.TS
+tab(+);
+l l l l.
+#define+TP_RTT_ALPHA+3
+#define+TP_RTV_ALPHA+2
++++
+#define+SMOOTH(alpha, old, new) \\
++(((new-old) >> alpha ) \+ (old) )
+.TE
+\fR
+.)b
+.lp
+The times included in the average are chosen as follows.
+The time of
+each packet's initial transmission is kept (for the last
+\fIN\fR packets, where \fIN\fR is a defined constant).
+When an AK TPDU arrives, ARGO TP subtracts the initial transmission
+time for the lowest unacknowledged sequence number that was
+acknowledged by this AK TPDU from the current time,
+and apply the resulting time to the average.
+Hence, not all packets are included in this average,
+which is as it should be since
+the purpose of this measurement is
+to find a good value for the retransmission timer.
+.pp
+Each time part of a window is retransmitted,
+the retransmission timer for that window is increased.
+This does not affect the retransmission timers for other windows.
+.\"***********************************************************
+.sh 2 "Acknowledgment strategies"
+.pp
+The transport protocol specification
+requires acknowledgments to be sent immediately
+upon receipt
+of CC TPDUs (in class 4), XPD TPDUs, and DT TPDUs containing an
+EOT marker, and at other times as required for flow control,
+otherwise acknowledgments may be delayed.
+In addition to the times when an acknowledgment is required,
+ARGO TP transmits an AK TPDU whenever the user receives some data,
+thereby increasing the size of the window.
+For those times when
+immediate acknowledgment is optional,
+ARGO TP offers two acknowledgment strategies:
+.ip " Acknowledge each TPDU" 10
+Upon receipt of a DT TPDU and AK TPDU is sent.
+.ip " Acknowledge full window" 10
+Acknowledgment is issued
+upon receipt of enough data to
+consume the last advertised credit.
+.pp
+The latter strategy
+requires a timer to trigger an acknowledgment
+in case the peer doesn't send the entire window
+quickly.
+This timer is called the
+\fIsendack timer\fR.
+The upper bound on the value of this timer
+is called the \fIlocal acknowledgment time\fR.
+The local acknowledgment time may be "advertised" to the
+peer during connection establishment, and the
+peer may choose to use this value to
+adjust its retransmission timers.
+The ARGO TP entity advertises its local acknowledgment time
+on a CR TPDU, but it is not
+constrained by
+the remote acknowledge time, should the peer
+advertise it.
+Instead,
+ARGO TP adapts its sendack timer
+to the behavior of the connection.
+.pp
+Under the assumption that the round trip time is
+often
+symmetric,
+and lacking
+a method to measure
+the round trip time in the other direction,
+ARGO TP uses the measured average round trip time
+to adjust the the sendack timer.
+.pp
+The choice of strategies is made with the
+\fIsetsockopt()\fR system call.
+The default strategy is
+to
+delay acknowledgments until the most recently advertised window is filled.
diff --git a/share/doc/iso/wisc/trans_serv.nr b/share/doc/iso/wisc/trans_serv.nr
new file mode 100644
index 0000000..462186e
--- /dev/null
+++ b/share/doc/iso/wisc/trans_serv.nr
@@ -0,0 +1,692 @@
+.NC "Transport Service Interface"
+.sh 1 "General"
+.pp
+It is assumed that the reader is acquainted with the
+set of system calls and library routines that
+compose the
+Berkeley
+Unix interprocess communication service (IPC).
+To every extent possible
+the ARGO transport service is provided by the same IPC mechanisms
+that support
+the transport-level services
+included in the
+AOS distribution.
+In some instances, the interface
+provided by AOS does not support
+the services required by ISO 8073,
+so system calls were added to support these services.
+It is felt that this is superior to modifying
+existing system calls, in order to avoid the
+recoding of existing Unix utilities.
+.pp
+What follows is a description of the system calls
+that are used to provide the transport service.
+According to Unix custom,
+the return value of a system call is 0
+if the call succeeds and -1 if
+the call fails for any reason.
+In the latter case,
+the global variable
+\fIerrno\fR contains more information
+about the error that caused the failure.
+In the descriptions of all the system calls for which
+this custom is followed,
+the return value is named
+\fIstatus\fR.
+.sh 1 "Connection establishment"
+.pp
+Establishing a TP connection is similar to
+establishing a connection using any other
+transport protocol supported by Unix.
+The same system calls are used, and the passive open
+is required.
+Some of the parameters to the system calls differ.
+.pp
+The following call creates a communication endpoint called a
+\fIsocket\fR.
+It returns
+a positive integer called a
+\fIsocket descriptor\fR,
+which
+will be a parameter in all communication primitives.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+s = socket( af, type, protocol )
+.T&
+l l l.
+ +int+s,af,type,protocol;
+.TE
+\fR
+.)b
+.pp
+The \fIaf\fR parameter describes the format of addresses
+used in this communication.
+Existing formats include AF_INET (DoD Internet addresses),
+AF_PUP (Xerox PUP-I Internet addresses), and AF_UNIX
+(addresses are Unix file names, for intra-machine IPC only).
+TP runs in either the Internet domain or the ISO domain (AF_ISO).
+When using the Internet domain, the network layer is the DoD Internet IP
+with Internet-style addresses. The ISO domain uses the ISO
+network service and ISO-style addresses\**.
+.(f
+\**ISO/DP 8348/DAD2 Addendum to the Network
+Service Definition Covering Network Layer Addressing.
+.)f
+Regardless of the address family used, an address takes the
+general form,
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct sockaddr {
+.T&
+l l l l.
+ +short+sa_family;+/* address family */
+ +char+sa_data[14];+/* space for an address */
+}+
+.TE
+\fR
+.)b
+.sp 1
+When viewed as an Internet address, it takes the form
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct sockaddr_in {
+.T&
+l l l l.
+ +short+sin_family;+/* address family */
+ +u_short+sin_port;+/* internet port */
+ +struct in_addr+sin_addr;+/* network addr A.B.C.D */
+ +char+sin_zero[8];+/* unused */
+}
+.TE
+\fR
+.)b
+.sp 1
+When viewed as an ISO address, it takes the form
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+struct sockaddr_iso {
+.T&
+l l l l.
+ +short+siso_family;+/* address family */
+ +u_short+siso_tsuffix;+/* transport suffix */
+ +struct iso_addr+siso_addr;+/* ISO NSAP addr */
+ +char+siso_zero[2];+/* unused */
+}
+.TE
+\fR
+.)b
+The address described by a \fIsockaddr_iso\fR structure
+is a TSAP-address (transport service access point address).
+It is made of an NSAP-address (network service access point address)
+and a TSAP selector (also called a transport suffix or
+transport selector, hereafter called a TSEL).
+The structure \fIsockaddr_iso\fR contains a 2-byte TSEL.
+This is for compatibility with Internet addressing.
+ARGO supports
+TSELs of length 1-64 bytes.
+TSELs of any length other than 2
+are called \*(lqextended TSELs\*(rq.
+They are described in detail in the section \fB\*(lqExtended TSELs\*(rq\fR.
+If extended TSELs are not requested, 2-byte TSELs are used by default.
+.pp
+Refer to Chapter Five for more information about ISO NSAP-addresses.
+.pp
+The \fItype\fR parameter in the \fIsocket()\fR call
+distinguishes
+datagram protocols, stream protocols, sequenced
+packet protocols, reliable datagram protocols, and
+"raw" protocols (in other words, the absence of a transport protocol).
+Unix provides manifest named constants for each of these types.
+TP supports the sequenced packet protocol abstraction, to which
+the manifest constant SOCK_SEQPACKET applies.
+.pp
+The \fIprotocol\fR
+parameter is an integer that identifies the protocol to be used.
+Unix provides a database of protocol names and their associated
+protocol numbers.
+Unix also provides user-level tools
+for searching the database.
+The tools take the form of library routines.
+A protocol number for TP has been chosen
+by the Internet NIC to allow TP to run in the Internet domain, and this
+has been added to the Unix network protocol database.
+The standard Internet database tools that serve TCP users
+can
+also serve user of TP
+in the Internet domain, if the TP protocol number is added to the
+proper Internet database file,
+\fC/etc/protocols\fR.
+This change must be made for TP to run in either the Internet or
+in the ISO domain.
+The ARGO package contains a set of tools and a database
+for use with TP in the ISO domain.
+This set of tools is described in the manual pages
+\fIisodir(5)\fR and
+\fIisodir(3)\fR.
+.pp
+When a socket is created, it is not given an address.
+Since a socket cannot be reached by a remote entity unless it has an address,
+the user must request that a socket be given an address by
+using the \fIbind()\fR system call:
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = bind( s, addr, addrlen )
+.T&
+l l l.
+ +int+s;
+ +struct sockaddr+*addr;
+ +int+addrlen;
+.TE
+\fR
+.)b
+.pp
+The address is expected to be in the format specified by the
+\fIaf\fR parameter to the \fIsocket()\fR
+call that yielded the socket descriptor \fIs\fR.
+If the user
+passes an address parameter with a zero-valued transport suffix,
+the transport layer
+assigns an unused 2-byte transport selector.
+This is a 4.3 Unix convention; it is not part of any ISO standard.
+.pp
+The \fIconnect()\fR system call effects an active open.
+It is used to establish a connection with an entity that is
+passively waiting for connection requests, and whose
+transport address is known.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = connect( s, addr, addrlen )
+.T&
+l l l.
+ +int+s;
+ +struct sockaddr+*addr;
+ +int+addrlen;
+.TE
+\fR
+.)b
+.pp
+The first parameter is a socket descriptor.
+The \fIaddr\fR parameter is a transport address in the format
+specified by the \fIaf\fR parameter to the \fIsocket()\fR
+call that yielded the socket descriptor \fIs\fR.
+.pp
+A passive open is accomplished with two system calls,
+\fIlisten()\fR followed by \fIaccept()\fR.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = listen( s, queuelen )
+.T&
+l l l.
+ +int+s;
+ +int+queuelen;
+.TE
+\fR
+.)b
+.pp
+The \fIqueuelen\fR argument specifies the maximum
+number of pending connection
+requests that will be queued for acceptance by this user.
+Connections are then accepted by the
+system call \fIaccept()\fR.
+There is no way to refuse connections.
+The functional equivalent of connection
+refusal is accomplished by accepting a connection and immediately
+disconnecting.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+new_s = accept( s, addr, addrlen )
+.T&
+l l l.
+ +int+new_s, s;
+ +struct sockaddr+*addr;
+ +int+addrlen;
+.TE
+\fR
+.)b
+.pp
+The \fIaccept()\fR call completes the connection
+establishment. If a connection request from a prospective peer
+is pending on the socket described by \fIs\fR, it is removed and
+a new socket is created for use with this connection.
+A socket descriptor for the new socket is returned by the
+system call.
+If no connection requests are pending, this call blocks.
+If the \fIaccept()\fR call fails, -1 is returned.
+The transport address of the entity requesting the connection
+is returned in the \fIaddr\fR parameter, and the length
+of the address is returned in the \fIaddrlen\fR parameter.
+The address associated with the new socket is inherited
+from the socket on which the \fIlisten()\fR and \fIaccept()\fR were performed.
+.pp
+It is possible for the \fIaccept()\fR call to be interrupted
+by an asynchronous event such as the arrival of expedited
+data.
+When system calls are interrupted, Unix returns the value -1
+to the caller and puts the constant
+EINTR in the global variable \fIerrno\fR.
+This can create problems with the system call \fIaccept()\fR.
+In the case of incoming expedited data, the interruption does
+not indicate a problem, but the data may have arrived before
+the caller has received the new socket descriptor, which is the
+socket descriptor on which the expedited data are to be received.
+In order to prevent this problem from occurring, the caller must
+prevent the issuance of asynchronous indications until the
+\fIaccept()\fR
+call has returned.
+Asynchronous indications are discussed below, in
+the section titled
+"Indications from the transport layer to the transport user".
+.pp
+It is possible to discover the
+address bound to a
+socket with the
+\fIgetsockname()\fR system call.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = getsockname( s, addr, addrlen )
+.T&
+l l l.
+ +int+s;
+ +struct sockaddr+*addr;
+ +int+addrlen;
+.TE
+\fR
+.)b
+.pp
+If the socket has a peer, that is, it is connected,
+the system call
+\fIgetpeername()\fR
+is used to discover the peer's address.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = getpeername( s, addr, addrlen )
+.T&
+l l l.
+ +int+s;
+ +struct sockaddr+*addr;
+ +int+addrlen;
+.TE
+\fR
+.)b
+.lp
+The names returned by
+\fIgetsockname()\fR and \fIgetpeername()\fR
+do not contain extended TSELs.
+Extended TSELs can be retrieved with
+the \fIgetsockopt()\fR and
+\fIsetsockopt()\fR system calls, described below.
+.pp
+Unix supports several protocol-independent options
+and protocol-specific options
+associated with sockets.
+These options can be inspected and changed by using
+the \fIgetsockopt()\fR and
+\fIsetsockopt()\fR system calls.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = getsockopt( s, level, option, value, valuelen )
+.T&
+l l l.
+ +int+s, level, option;
+ +char+*value;
+ +int+*valuelen;
+.TE
+\fR
+.)b
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = setsockopt( s, level, option, value, valuelen )
+.T&
+l l l.
+ +int+s, level, option;
+ +char+*value;
+ +int+valuelen;
+.TE
+\fR
+.)b
+.pp
+The \fIlevel\fR argument may indicate
+either
+that this option applies to sockets or that it applies to
+a specific protocol.
+The constants SOL_SOCKET, SOL_TRANSPORT, and SOL_NETWORK
+are possible values for the \fIlevel\fR argument.
+The \fIoption\fR argument is an integer that identifies
+the option chosen.
+.\" LIST THE OPTIONS HERE
+The options available to TP users provide the
+user with the ability to control various TP protocol options
+including but not limited to
+TP class, TPDU size negotiated, TPDU format used,
+acknowledgment and retransmission strategies.
+For a detail list of the options, see the manual page \fItp(4p)\fR.
+.sh 1 "Extended TSELs"
+.pp
+ARGO supports TSELs
+of length 1 byte - 64 bytes for sockets bound to addresses in the
+AF_ISO address family.
+The ARGO user program uses the
+\fIgetsockopt()\fR
+and
+\fIsetsockopt()\fR
+system calls to
+discover and assign extended TSELs.
+.pp
+To create a socket with an extended TSEL,
+the process
+.ip \(bu 5
+opens a socket with \fCsocket(AF_ISO, SOCK_SEQPACKET, ISOPROTO_TP)\fR
+.ip \(bu 5
+binds an NSAP-address to the socket with \fIbind()\fR.
+The address bound may contain a 2-byte selector (\fIiso_tsuffix\fR).
+.ip \(bu 5
+uses \fIsetsockopt()\fR with the command TPOPT_MY_TSEL,
+to assign a TSEL to the socket.
+.ip \(bu 5
+calls \fIlisten(), connect()\fR, or any other appopriate system calls
+to use the socket as desired.
+.lp
+To connect to a transport entity that is bound to a TSAP-address with
+an extended TSEL, the
+process
+.ip \(bu 5
+opens a socket with \fCsocket(AF_ISO, SOCK_SEQPACKET, ISOPROTO_TP)\fR
+.ip \(bu 5
+uses \fIsetsockopt()\fR, with the command TPOPT_PEER_TSEL,
+to assign a PEER TSEL to the socket.
+This TSEL is used by the transport entity
+for all subsequent connect requests made on this socket,
+unless the peer TSEL is changed by another call to
+\fIsetsockopt()\fR employing the command TPOPT_PEER_TSEL.
+.lp
+To discover the TSEL of the peer of a connected socket,
+the process
+.ip \(bu 5
+uses \fIgetsockopt()\fR with the command TPOPT_PEER_TSEL.
+.lp
+To discover the TSEL of socket's own address,
+the process
+.ip \(bu 5
+uses \fIgetsockopt()\fR with the command TPOPT_MY_TSEL.
+.sh 1 "Data transfer"
+.pp
+The system calls provided by AOS for data transfer have
+semantics that are unsuitable for TP,
+and in fact they are seriously deficient for the correct
+operation of any user program that uses out-of-band or expedited
+data in any way except to cause the program to abort.
+The problem lies in the manner in which the kernel
+handles interrupted system calls.
+The send and receive primitives
+may be interrupted by signals.
+A signal is the mechanism used to indicate
+the presence of expedited data or out-of-band data.
+If the send or receive primitive is interrupted before completion,
+the user needs to know how many octets of data were sent or received.
+The existing system call interface does not provide this
+information, nor does it permit TP to provide
+this information.
+All forms of the existing interface
+(\fIsend()\fR,
+\fIrecv()\fR,
+\fIsendmsg()\fR,
+\fIrecvmsg()\fR,
+\fIsendto()\fR,
+\fIrecvfrom()\fR,
+\fIwrite()\fR,
+\fIread\fR,
+\fIwritev()\fR,
+and \fIreadv()\fR system calls)
+return an octet count
+when the system call completes, and return an error
+indication (-1, \fIerrno\fR == EINTR) if the system call is interrupted.
+To change the semantics
+of these calls would create havoc with existing user-level software.
+Instead two new system calls are provided to support data transfer.
+(The existing interface may be used if the user does not need the additional
+service provided by the new system calls.)
+.pp
+The two new system calls are patterned after
+\fIreadv()\fR and \fIwritev()\fR,
+the scatter-gather or "vectored"
+versions of \fIread()\fR and \fIwrite()\fR.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+cc = sendv( s, iov, iovlen, flags )
+.T&
+l l l.
+ +int+s:
+ +io_vector+iov;
+ +int+iovlen;
+ +unsigned int+*flags;
+.TE
+\fR
+.)b
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+cc = recvv( s, iov, iovlen, flags )
+.T&
+l l l.
+ +int+s:
+ +io_vector+iov;
+ +int+iovlen;
+ +unsigned int+*flags;
+.TE
+\fR
+.)b
+.pp
+The \fIiov\fR argument is an \fIio_vector\fR,
+an array of pointers and lengths that
+describe the areas from (or to) which the data will be gathered (or scattered).
+The \fIiovlen\fR argument is an integer that tells how many parts are in
+the io_vector.
+The \fIflags\fR parameter serves several purposes.
+The TP specification requires that TSDUs be unlimited in size.
+System calls cannot pass unlimited amounts of data between the user
+and the kernel, so
+there cannot be a one-to-one correspondence between TSDUs and
+system calls.
+The \fIflags\fR
+parameter is used to mark the end-of-TSDU on both sending and
+receiving.
+This way one TSDU can span several system calls.
+When sending,
+the user sets
+this flag
+to indicate that this request completes a TSDU.
+When receiving,
+TP sets this flag when
+the end of a TSDU is reached.
+In the latter case, the end of the data received by the transport user
+with a given system call
+coincides with the end of the TSDU
+if
+the TP has set the end-of-TSDU bit
+in the \fIflags\fR parameter of the \fIrecv()\fR system call.
+It is possible for the peer to send an empty TPDU with the end-of-TSDU
+flag set, in which case the transport user
+may receive zero octets with the end-of-TSDU flag set.
+See the manual pages
+\fIrecvv(2)\fR
+and
+\fIsendv(2)\fR
+for details.
+.pp
+The \fIflags\fR parameter also serves to distinguish data transfer primitives
+from expedited data transfer primitives.
+The flag bit MSG_OOB is provided for "out of band data" in the
+DoD Internet protocols. It is also used to provide the expedited data service
+of the ISO protocols.
+The transport layer will deliver one expedited datum (there will be a
+one-to-one correspondence between expedited TSDUs and XPD TPDUs)
+at a time.
+The user must receive the datum before the transport
+layer will accept more expedited data.
+Each expedited datum my contain up to 16 octets.
+.pp
+.sh 1 "Disconnection"
+.pp
+The \fIclose\fR system call will disconnect any association
+between two TP entities.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+status = close( s )
+.T&
+l l l.
+ +int+s;
+.TE
+\fR
+.)b
+.pp
+The argument \fIs\fR is a socket descriptor.
+If a Unix user process terminates, Unix will close all files and
+sockets associated with the process, which means all transport
+connections associated with the process will be disconnected.
+.sh 1 "Indications from the transport layer to the transport user"
+.pp
+While the above set of system calls allows you to establish
+a connection, transfer data, and disconnect,
+several elements of the transport service are not supported
+by these system calls alone.
+These system calls do not support
+any way to indicate to the
+to the transport user
+the
+presence of expedited data or
+a disconnection initiated by the peer or by one of the
+cooperating TP entities.
+.pp
+The Unix signal mechanism is used to provide these
+service elements.
+When an expedited data TSDU arrives, the TP interrupts
+the user with a SIGURG signal ("urgent condition present on socket").
+The user must have previously registered a procedure to handle
+the signal by using the \fIsigvec()\fR system call or the
+\fIsignal()\fR library routine provided for that purpose.
+The signal handler takes the form
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+int sighandler( signal_number)
+.T&
+l l l.
+ +int+signal_number;
+.TE
+\fR
+.)b
+.pp
+The \fIsignal_number\fR argument will be the well-known constant SIGURG.
+There are two reasons for
+the transport layer to issue
+a SIGURG:
+expedited data
+are present or
+disconnection was initiated by a transport entity or by the peer.
+Should the user have more than one transport connection open,
+another system call is used to determine to which socket(s)
+the urgent condition applies.
+This is the \fIselect()\fR system call, described below.
+.pp
+When the SIGURG indicates a disconnection, there may be
+user data from the peer present.
+TP
+discards all queued normal data and expedited data.
+It saves the disconnect data for the user to receive via the
+\fIgetsockopt()\fR system call.
+Unfortunately, the socket is already considered closed
+by the kernel, so there is no way
+for the user to read the incoming disconnect data, so receipt
+of disconnect data is not supported.
+.\"
+.\"If the user does not receive the disconnect data before the
+.\"reference timer expires, the data will be discarded and the
+.\"socket will be closed.
+.pp
+Transport service users may use more than one transport
+connection at a time.
+The \fIselect()\fR system call facilitates this.
+.(b
+\fC
+.TS
+tab(+);
+l s s s.
+#include <sys/types.h>
++
+nfound = select( num_to_scan, recvmask, sendmask,
++exceptmask, timeout )
+.T&
+l l l.
+ +int+nfound, num_to_scan;
+ +fd_set+*recvmask, *sendmask, *exceptmask;
+ +time+timeout;
+.TE
+\fR
+.)b
+.pp
+This system call takes as parameters a set of masks
+that specify a subset of the socket descriptors that are in
+use by the user program.
+\fISelect()\fR inspects the sockets to see if they have data
+to be received, can service a send without blocking, or
+have an exceptional condition pending, respectively.
+The masks will be set upon return to indicate the socket descriptors
+for which the respective conditions exist.
+The \fInum_to_scan\fR argument limits the number of sockets that are
+inspected.
+The call will return within the amount of time given in the
+\fItimeout\fR parameter, or, if the parameter is zero, \fIselect()\fR
+will block indefinitely.
+.\" FIGURE
+.so figs/TS_primitives.nr
+.pp
+.CF
+summarizes the mapping of the transport service primitives
+to Unix facilities.
diff --git a/share/doc/iso/wiscman/arp.4p b/share/doc/iso/wiscman/arp.4p
new file mode 100644
index 0000000..f0fe2a0
--- /dev/null
+++ b/share/doc/iso/wiscman/arp.4p
@@ -0,0 +1,118 @@
+.\" Copyright (c) 1983 Regents of the University of California.
+.\" All rights reserved. The Berkeley software License Agreement
+.\" specifies the terms and conditions for redistribution.
+.\"
+.\" @(#)arp.4p 6.2 (Berkeley) 5/15/86
+.\"
+.TH ARP 4P "May 15, 1986"
+.UC 5
+.SH NAME
+arp \- Address Resolution Protocol
+.SH SYNOPSIS
+.B "pseudo-device ether"
+.SH DESCRIPTION
+ARP is a protocol used to dynamically map between DARPA Internet
+and 10Mb/s Ethernet addresses. It is
+used by all the 10Mb/s Ethernet interface drivers.
+It is not specific to Internet protocols or to 10Mb/s Ethernet,
+but this implementation currently supports only that combination.
+.PP
+ARP caches Internet-Ethernet address mappings. When an interface
+requests a mapping for an address not in the cache, ARP queues the
+message which requires the mapping and broadcasts
+a message on the associated network requesting the address mapping.
+If a response is provided, the new mapping is cached and any pending
+message is transmitted.
+ARP will queue
+at most one packet while waiting for a mapping request to be responded to;
+only the most recently ``transmitted'' packet is kept.
+.PP
+To facilitate communications with systems which do not use ARP,
+.IR ioctl \^s
+are provided to enter and delete entries in the Internet-to-Ethernet tables.
+Usage:
+.LP
+.nf
+.ft B
+ #include <sys/ioctl.h>
+ #include <sys/socket.h>
+ #include <net/if.h>
+ struct arpreq arpreq;
+
+ ioctl(s, SIOCSARP, (caddr_t)&arpreq);
+ ioctl(s, SIOCGARP, (caddr_t)&arpreq);
+ ioctl(s, SIOCDARP, (caddr_t)&arpreq);
+.fi
+.ft R
+Each ioctl takes the same structure as an argument.
+SIOCSARP sets an ARP entry, SIOCGARP gets an ARP entry, and SIOCDARP
+deletes an ARP entry. These ioctls may be applied to any socket descriptor
+.I s,
+but only by the super-user.
+The
+.I arpreq
+structure contains:
+.LP
+.RS
+.ta \w'#define\ \ 'u +\w'ATF_USETRAILERS\ \ 'u +\w'0x08\ \ \ \ 'u
+.nf
+/*
+ * ARP ioctl request
+ */
+struct arpreq {
+ struct sockaddr arp_pa; /* protocol address */
+ struct sockaddr arp_ha; /* hardware address */
+ int arp_flags; /* flags */
+};
+/* arp_flags field values */
+#define ATF_COM 0x02 /* completed entry (arp_ha valid) */
+#define ATF_PERM 0x04 /* permanent entry */
+#define ATF_PUBL 0x08 /* publish (respond for other host) */
+#define ATF_USETRAILERS 0x10 /* send trailer packets to host */
+.fi
+.RE
+.LP
+The address family for the
+.I arp_pa
+sockaddr must be AF_INET; for the
+.I arp_ha
+sockaddr it must be AF_UNSPEC.
+The only flag bits which may be written are ATF_PERM, ATF_PUBL
+and ATF_USETRAILERS.
+ATF_PERM causes the entry to be permanent if the ioctl call succeeds.
+The peculiar nature of the ARP tables may cause the ioctl to fail if more
+than 8 (permanent) Internet host addresses hash to the same slot.
+ATF_PUBL specifies that the ARP code should respond to ARP requests for the
+indicated host coming from other machines. This allows a host to act as an
+``ARP server,'' which may be useful in convincing an ARP-only machine to talk
+to a non-ARP machine.
+.PP
+ARP is also used to negotiate the use of trailer IP encapsulations;
+trailers are an alternate encapsulation used to allow efficient packet
+alignment for large packets despite variable-sized headers.
+Hosts which wish to receive trailer encapsulations so indicate
+by sending gratuitous ARP translation replies along with replies
+to IP requests; they are also sent in reply to IP translation replies.
+The negotiation is thus fully symmetrical, in that either or both hosts
+may request trailers.
+The ATF_USETRAILERS flag is used to record the receipt of such a reply,
+and enables the transmission of trailer packets to that host.
+.PP
+ARP watches passively for hosts impersonating the local host (i.e. a host
+which responds to an ARP mapping request for the local host's address).
+.SH DIAGNOSTICS
+.B "duplicate IP address!! sent from ethernet address: %x:%x:%x:%x:%x:%x."
+ARP has discovered another host on the local network which responds to
+mapping requests for its own Internet address.
+.SH SEE ALSO
+ec(4), de(4), il(4), inet(4F), arp(8C), ifconfig(8C)
+.br
+``An Ethernet Address Resolution Protocol,'' RFC826, Dave Plummer,
+Network Information Center, SRI.
+.br
+``Trailer Encapsulations,'' RFC893, S.J. Leffler and M.J. Karels,
+Network Information Center, SRI.
+.SH BUGS
+ARP packets on the Ethernet use only 42 bytes of data; however, the smallest
+legal Ethernet packet is 60 bytes (not including CRC).
+Some systems may not enforce the minimum packet size, others will.
diff --git a/share/doc/iso/wiscman/clnp.4p b/share/doc/iso/wiscman/clnp.4p
new file mode 100644
index 0000000..07efd1a
--- /dev/null
+++ b/share/doc/iso/wiscman/clnp.4p
@@ -0,0 +1,91 @@
+.TH CLNP 4P "9 December 1988"
+.ds ]W Wisconsin ARGO 1.0
+.UC 4
+.SH NAME
+clnp \- Connectionless-Mode Network Protocol
+.SH SYNOPSIS
+.B #include <sys/socket.h>
+.br
+.B #include <netargo/iso.h>
+.br
+.B #include <netargo/clnp.h>
+.PP
+.B s = socket(AF_ISO, SOCK_RAW, 0);
+.SH DESCRIPTION
+CLNP is the connectionless-mode network protocol used by the
+connectionless-mode network service. This protocol is specified in
+ISO 8473.
+It may be accessed
+through a \*(lqraw socket\*(rq for debugging purposes only.
+CLNP sockets are connectionless,
+and are normally used with the
+.I sendto
+and
+.I recvfrom
+calls, though the
+.IR connect (2)
+call may also be used to fix the destination for future
+packets (in which case the
+.IR read (2)
+or
+.IR recv (2)
+and
+.IR write (2)
+or
+.IR send (2)
+system calls may be used).
+.PP
+Outgoing packets automatically have a CLNP header prepended to
+them. Incoming packets received by the user contain the full CLNP header.
+The following \fIsetsockopt\fR options apply to CLNP:
+.TP
+CLNPOPT_FLAGS
+Sets the flags which are passed to clnp when sending a datagram.
+Valid flags are:
+.nf
+.br
+CLNP_NO_SEG-Do not allow segmentation
+CLNP_NO_ER-Suppress ER pdus
+CLNP_NO_CKSUM-Do not generate the CLNP checksum
+.br
+.fi
+.TP
+CLNPOPT_OPTS
+Sets CLNP options. The options must be formatted exactly as specified by
+ISO 8473, section 7.5 "Options Part." Once an option has been set, it will
+be sent on all packets until a different option is set.
+.SH DIAGNOSTICS
+A socket operation may fail with one of the following errors returned:
+.TP 15
+[EISCONN]
+when trying to establish a connection on a socket which
+already has one, or when trying to send a datagram with the destination
+address specified and the socket is already connected;
+.TP 15
+[ENOTCONN]
+when trying to send a datagram, but
+no destination address is specified, and the socket hasn't been
+connected;
+.TP 15
+[ENOBUFS]
+when the system runs out of memory for
+an internal data structure;
+.TP 15
+[EADDRNOTAVAIL]
+when an attempt is made to create a
+socket with a network address for which no network interface
+exists;
+.TP 15
+[EHOSTUNREACH]
+when trying to send a datagram, but no route to the destination
+address exists.
+.TP 15
+[EINVAL]
+when specifying unsupported options.
+.SH SEE ALSO
+send(2), recv(2), intro(4N), iso(4F)
+.SH BUGS
+Packets are sent with the type code of 0x1d (technically an invalid
+packet type) for lack of a better way to identify raw CLNP packets.
+.PP
+No more than MLEN bytes of options can be specified.
diff --git a/share/doc/iso/wiscman/cons.4 b/share/doc/iso/wiscman/cons.4
new file mode 100644
index 0000000..73bd3fc
--- /dev/null
+++ b/share/doc/iso/wiscman/cons.4
@@ -0,0 +1,241 @@
+.\"
+.\" 5799-WZQ (C) COPYRIGHT IBM CORPORATION 1986,1987,1988
+.\" LICENSED MATERIALS - PROPERTY OF IBM
+.\" REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083
+.\"
+.\"$Header:cons.4_ca 11.3$
+.\"$ACIS:cons.4_ca 11.3$
+.\"$Source: /ibm/acis/usr/man/man4/RCS/cons.4_ca,v $
+.\" This file uses -man macros.
+.TH CONS 4 "Sept 1988" "Space overwritten by .AC macro" " "
+.AC 1 0
+.SH NAME
+cons \- keyboard and console display interface
+.SH DESCRIPTION
+The keyboard and various possible displays combine to
+provide a terminal-like
+interface to the system. Internally, these are separate devices which
+software combines to emulate a normal terminal. See the appropriate manual
+pages for information about each display and the keyboard.
+.PP
+The keyboard adapter also supports the speaker, which is activated
+when the ASCII character \fBbel\fP (\fB^G\fP)
+is sent to the display with software.
+For additional information on speaker control, see \fIspeaker\fP(4).
+.PP
+.B Console Device Control
+.PP
+The display devices,
+\fI/dev/ttyaed\fR, \fI/dev/ttyap16\fR, \fI/dev/ttyap8c\fR,
+\fI/dev/ttyapa8\fR, \fI/dev/ttyega\fR, \fI/dev/ttymono\fR,
+\fI/dev/ttympel\fR, \fI/dev/ttyvga\fR, and \fI/dev/tty8514\fR are all
+minor devices under
+\fI/dev/console\fR, and are all capable of displaying console output.
+Unique to this system is the fact that you may have one or more of these
+displays on your workstation at a time and any one can act as a console.
+With only one keyboard and system mouse, the console driver
+multiplexes these input devices to the many displays.
+All of the displays may have simultaneous logins and the user
+can ``hot key'' between each display.
+At first, this
+``input focus''
+is on
+the first device in the above sequence to
+be found at initialization time. The input focus
+can be manually switched to the next available display by pressing the
+default ``hot key'' <Alt><Scroll Lock>.
+When the
+input focus
+is on a display, all keyboard and mouse data are sent to the process(es)
+that read from that display.
+.PP
+If no other console tty device is open, and only the default input
+emulator is used (see \fIkbdemul\fP(4)), the input focus is set to
+\fI/dev/console\fP. In this case, <Alt><Scroll Lock> only switches
+which display gets console output.
+In the case where one or more tty devices are open, or the default input
+emulator changes, \fI/dev/console\fP gets no input. It tries to send output
+to the currently focused device. A user can redirect these console messages
+to any tty devices with the TIOCCONS ioctl.
+.PP
+To support the many displays and the multiplexing between them, an
+emulator package was developed to work with the console driver.
+This package allows different types of emulation on input and output to
+be written independently of device.
+.PP
+The display devices \fI/dev/aed\fP, \fI/dev/apa16\fP, \fI/dev/apa8c\fP,
+\fI/dev/apa8\fP, \fI/dev/ega\fR, \fI/dev/mono\fP,
+\fI/dev/mpel\fR, \fI/dev/vga\fR, and \fI/dev/ibm8514\fR
+are also minor devices to
+\fI/dev/console\fP. They are typically used by window managers and other
+graphic applications. When the focus is pointed to one of these display
+devices, the console messages are put in a circular buffer
+(see \fIbufemul\fP(4))
+unless redirected with the TIOCCONS ioctl.
+The buffer is flushed to the screen upon closing the display device.
+.PP
+The following are generic console \fIioctls\fP defined in \fIscreen_cousf.u\fP:
+.TP 20
+CON_SELECT_SCREEN
+Output focus is set to display number (arg > 0) or
+to next display in list (arg < 0). Previous display number is returned.
+.TP 20
+CON_GET_SCREEN
+Just returns the current output focus display number.
+.TP 20
+EIGETD
+Gets the number of the current input emulator for this display.
+.TP 20
+EOGETD
+Gets the number of the current output emulator for this display.
+.TP 20
+EISETD
+Sets the input emulator and returns the previous for this display.
+.TP 20
+EOSETD
+Sets the output emulator and returns the previous for this display.
+.TP 20
+CON_INIT_SCREEN
+Initializes the specified display (arg >=0) or this display
+(arg < 0).
+.TP 20
+CON_GET_FOCUS_CODE
+Gets the current keyboard code for setting the console
+focus (affects xemul only).
+.TP 20
+CON_SET_FOCUS_CODE
+Sets the current keyboard code for setting the console
+focus (affects xemul only), and return the previous code.
+.PP
+All of the above commands take integer arguments.
+.PP
+The following are generic console \fIioctls\fP defined in \fIconsio.h\fP:
+.TP 20
+SCRIOCGETF
+Gets the screen control flags for the given display number.
+.TP 20
+SCRIOCSETC
+Sets the screen control flags for the given display number.
+.PP
+.in +10
+SCRIOCGETF and SCRIOCSETC use the following structure:
+.DT
+.nf
+struct screen_control {
+ int device; /* which screen/display to control */
+ int switches; /* Flags for this screen */
+};
+.fi
+.sp 2
+.RS 6
+.TP 20
+CONSDEV_PRESENT
+Display is present on this system.
+This bit cannot be changed by SCRIOSETC.
+.TP 20
+CONSDEV_KERNEL
+Display is available to the kernel.
+.TP 20
+CONSDEV_USER
+Display is available to the user.
+.TP 20
+CONSDEV_INIT
+Display has been initialized for output.
+.TP 20
+CONSDEV_TTY
+Diplay has been initialuzed for output.
+This bit cannot be changed by SCRIOSETC.
+.TP 20
+CONSDEV_GRA
+Graphics display has been opened directly by minor device number.
+This bit cannot be changed by SCRIOSETC.
+.TP 20
+CONSDEV_NOINPUT
+Prevents the "round-robin" console focus-switching from finding this
+display. This flag is cleared when \fIbuf_emul\fP is closed.
+.TP 20
+SCRSETNIP
+Sets the no-input bit in the screen control flags for the
+display's current file description.
+.TP 20
+SCRCLRNIP
+Clears the no-input bit in the screen control flags for the
+display's current file description.
+.RE
+.PP
+The following \fIioctl\fP is defined in \fIbufemul.h\fP:
+.TP 20
+BUFDISPINFO
+\fIArg\fP returns the following information about the display:
+.PP
+.RS 6
+.TP 20
+BUF_IS_ATR(arg)
+True when the CPU is an IBM 6152 Academic System.
+.TP 20
+BUF_IS_RTPC(arg)
+True when the CPU is an IBM RT PC.
+.TP 20
+BUF_GET_PCCODE(x)
+Get PC-Code version/type byte (IBM 6152 only).
+.bp
+.TP 20
+BUF_GET_VGA(arg)
+Get the type of display connected to the VGA.
+0=none, 1=color, 2=gray. Valid only for the IBM 6152 Academic System.
+.TP 20
+BUF_GET_8514(arg)
+Get the type of display connected to the IBM 8514/A.
+0=none, 1=color, 2=gray. Valid only for the IBM 6152 Academic System.
+.TP 20
+BUF_GET_EGA(arg)
+Returns the value of the switches on the EGA display. Valid only for the IBM RT PC with an EGA card installed.
+.RE
+.PP
+All of the above \fIioctl\fP system calls are device-independent controls
+for dealing with the emulators.
+.PP
+Each emulator has its own set of \fIioctls\fP for its own emulation purposes.
+These other \fIiotls\fP are used in window-manager emulators for operations
+such as passing/positioning the mouse locator for/on the display.
+See the man page for any particular emulator for more information.
+.PP
+.SH NOTE
+On the IBM RT PC, the kernel flashes ``98'' on the LEDs if it cannot find any
+configured display during initialization, and then proceeds.
+.SH DIAGNOSTICS
+None.
+.SH FILES
+.PP
+For the IBM RT PC:
+.br
+/dev/console
+.br
+/dev/aed
+.br
+/dev/apa16
+.br
+/dev/apa8c
+.br
+/dev/apa8
+.br
+/dev/ega
+.br
+/dev/mono
+.br
+/dev/mpel
+.br
+.PP
+For the IBM 6152 Academic System:
+.br
+/dev/vga
+.br
+/dev/ibm8514
+.SH "SEE ALSO"
+bufemul(4), bus(4), ibm5081(4), ibm5151(4), ibm6153(4), ibm6154(4),
+ibm6155(4), ibm8514(4), ibmaed(4), ibmemul(4), kbdemul(4),
+speaker(4), stdemul(4), tty(4), vga(4), xemul(4), setscreen(8)
+.br
+``IBM/4.3 Console Emulators'', in Volume II, Supplementary Documents
+
+
diff --git a/share/doc/iso/wiscman/cons.4p b/share/doc/iso/wiscman/cons.4p
new file mode 100644
index 0000000..c8b152b
--- /dev/null
+++ b/share/doc/iso/wiscman/cons.4p
@@ -0,0 +1,196 @@
+.TH CONS 4P "9 December 1988"
+.ds ]W Wisconsin ARGO 1.0
+.UC 4
+.SH NAME
+CONS \- Connection Oriented Network Service
+.SH SYNOPSIS
+For use as a network service (CONS):
+.nf
+.sp
+\fB#include <sys/socket.h>\fR
+\fB#include <sys/mbuf.h>\fR
+\fB#include <netargo/iso.h>\fR
+\fB#include <netargo/cons.h>\fR
+\fB#include <netargo/iso_errno.h>\fR
+.sp
+\fBint cons_output(isop, m, len, isdatagram)\fR
+.sp
+or for use as a subnetwork service (COSNS):
+.sp
+\fB#include <sys/socket.h>\fR
+\fB#include <sys/mbuf.h>\fR
+\fB#include <netargo/iso.h>\fR
+\fB#include <net/if.h>\fR
+\fB#include <netargo/cons.h>\fR
+\fB#include <netargo/iso_errno.h>\fR
+.sp
+\fBint cosns_output(ifp, m, dst)
+.fi
+.SH DESCRIPTION
+.PP
+The Connection Oriented Network Service (CONS) implemented for the AOS R2
+at the University of Wisconsin - Madison
+supports transport protocols, acting as a network service,
+and it also supports other network protocols, acting as a subnetwork
+service or link-layer service.
+Several software modules are combined to provide these services.
+.TP 10
+X.25
+The CCITT X.25 packet layer and link layer protocols run on
+a coprocessor (the EICON Network Adapter), which serves as a DTE.
+.TP 10
+Ecn driver
+A device driver manages the interaction between
+the coprocessor and the PC/RT.
+.TP 10
+CONS "glue"
+A software module implements portions of the OSI CONS (ISO 8878),
+which describes a way to use the X.25 protocols to support the
+OSI connection-oriented network service.
+.PP
+The OSI CONS contains several "service elements"
+that ARGO does not use or support.
+Expedited data,
+quality of service maintenance,
+call collision resolution,
+permanent virtual circuits,
+user data on connect and release,
+user-level acknowledgement
+("receipt confirmation" in CCITT/ISO argot), and reset/resynchronize
+are not supported.
+Several of the service primitives for connection establishment
+and release are not supported, and
+numerous parameters to other primitives specified in the OSI CONS
+are not supported.
+The CONS glue does provide all the support necessary to run
+ISO transport classes 0 and 4 over X.25, and ISO CLNP (also called
+ISO IP) over X.25.
+The subnetwork dependent convergence functions implemented in the glue
+permit interoperability with
+OSINET and EAN at this writing.
+Interoperability with other networks will be established in the future.
+.PP
+The coprocessor that implements the X.25 link and packet layers
+is the Eicon Technologies Access/X.25 Stand-Alone Network Adaper
+(see \fIecn(4)\fR).
+.PP
+The glue module provides two interfaces to higher layers:
+a "subnetwork service" (COSNS) used by network layer protocols, which
+has a typical BSD kernel device driver interface
+and
+a "network service" (CONS) used by transport protocols, which has
+a procedure call interface similar to that of IP and CLNP.
+.PP
+The network service is reliable and sequenced but does not
+provide a graceful close service; it provides only an abort service.
+.PP
+The subnetwork service is neither reliable nor sequenced.
+The subnetwork service implemented by the glue hides the
+connection-oriented aspects of the protocols; nevertheless,
+we call it the "connection-oriented subnetwork service" (COSNS)
+here, for lack of a better name.
+.SS "LIBRARIES
+No libraries are needed to use the CONS, however,
+the numerous error values returned by X.25 cannot be accommodated
+by the standard \fIperror()\fR in the C library.
+The ISO library
+.nf
+.sp
+.in +5
+\fC/usr/argo/lib/libisodir.a\fR
+.in -5
+.sp
+.fi
+provides an expanded perror() to handle the additional error return codes.
+.SS "ERROR VALUES
+.PP
+The error codes returned by the CONS are taken from
+the diagnostic code of the X.25 level 3 packets, as
+descibed in figure 14-B of ISO 8208 (the ISO standard which
+is equivalent to CCITT X.25).
+The actual error value returned in
+\fIerrno\fR
+is the X.25 diagnostic code in the lower 10 bits
+logically "or"ed with the hexadecimal value 0x8400 (bits
+10 and 15 set, counting from zero at the the least significant bit).
+The error values can be found in
+the file
+.nf
+.in +5
+.sp
+\fC<netargo/iso_errno.h>\fR
+.sp
+.in -5
+.fi
+.SS "PROTOCOL IDENTIFICATION
+.PP
+The purpose of this section is to describe how incoming packets
+are forwarded from the glue to the various higher
+layers (ISO transport, CLNP), how
+routes are chosen from the higher layers to the glue, and
+how NSAP-addresses are related to all this.
+.SS Outgoing path:
+The ARGO transport entity routes packets either to
+the CONS glue, to the CLNP module, or to the DARPA Internet IP
+module, based on the value of the network service parameter
+given to the transport layer by the user.
+The \fInetserv\fR property of records in the ARGO
+directory service database
+can be used to determine the network service to be used by the
+transport layer. See also \fIisodir(5)\fR and \fIisodir(3)\fR.
+.PP
+The connectionless network layer entity routes packets to the
+COSNS based on the routing table entries in the connectionless network layer.
+This means that any type of NSAP-address supported by the kernel
+may be used with a CLNP packet
+that is routed over X.25.
+.PP
+When the glue creates an X.25 Call Request packet, it
+places an X.121 address (DTE address)
+in both the Calling and Called DTE address fields.
+The X.121 addresses are extracted from the \fISNPA cache\fR,
+a table that maps NSAP-addresses to SNPA-addresses, and
+is maintained by the ES-IS protocol module of the OSI network layer.
+In addition to placing a DTE address in the X.25 packet,
+the "glue" may
+uses the 1984 Called Address Extension facility to convey the
+NSAP-addresses.
+Whether or not this is done depends on the compile-time option -DX25_1984.
+.SS Incoming path:
+The X.25 Call Request User Data field and the
+1984 X.25 Address Extension Facility are used
+to determing the incoming path through the network layer.
+The NSAP addresses passed up along with the packet are taken from the
+Address Extension facility, if present.
+If the facility is absent, the glue creates two type-37 NSAP-addresses,
+filling in the X.121 address from the called and
+calling DTE-addresses on the Call Request packet, if present.
+The glue then requests of the ES-IS module to add an entry to the
+SNPA cache to associate the calling DTE address with its
+derived NSAP-address.
+These cache entries have a holding of 5 minutes, and get
+refreshed as long as there is activity on the virtual circuit
+resulting from the call request.
+.PP
+If a Call Request packet contains a protocol identifier
+as described in ISO PTDR 9577, this protocol identifier is used
+to route the packet to the higher layers.
+If there is no protocol identifier, the higher layer is assumed to be ISO
+transport.
+.SH "BUGS
+.PP
+If an incoming X.25 Call Request contains no DTE-addresses and
+no NSAP-addresses (in the Address Extension facility)
+the kernel panics.
+.SH "SEE ALSO
+.PP
+isodir(3),
+ecn(4),
+clnp(4),
+tp(4),
+isodir(5),
+isoroute(8),
+ifconfig(8),
+netstat(1),
+xstat(8),
+"ARGO 1.0 Kernel Programmer's Manual"
diff --git a/share/doc/iso/wiscman/if.4n b/share/doc/iso/wiscman/if.4n
new file mode 100644
index 0000000..ca6884c
--- /dev/null
+++ b/share/doc/iso/wiscman/if.4n
@@ -0,0 +1,136 @@
+#
+# 5799-WZQ (C) COPYRIGHT IBM CORPORATION 1988
+# LICENSED MATERIALS - PROPERTY OF IBM
+# REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083
+#
+.\"# $Header:if.4n_ca 1.5$
+.\"# $ACIS:if.4n_ca 1.5$
+.\"# $Source: /ibm/acis/usr/man/man4/RCS/if.4n_ca,v $
+.\" @(#)if.4n 1.2 87/08/23 3.2/4.3NFSSRC
+.\" @(#)if.4n 1.2 87/02/10 NFSSRC
+.\" @(#)if.4n 1.1 86/09/25 SMI;
+.TH IF 4N "Sept 1988" "Space overwritten" " "
+.AC 1 0
+.SH NAME
+if \- general properties of network interfaces (NFS only)
+.SH DESCRIPTION
+.IX "if device" "" "\fLif\fP \(em network interface general properties" "" PAGE START
+Each network interface in a system corresponds to a
+path through which messages may be sent and received. A network
+interface usually has a hardware device associated with it, but
+certain interfaces, such as the loopback interface
+.IR lo (4),
+do not.
+.LP
+At boot time each interface which has underlying hardware support
+makes itself known to the system during the autoconfiguration
+process. Once the interface has acquired its address it is
+expected to install a routing table entry so that messages may
+be routed through it. Most interfaces require some part of
+their address specified with an SIOCSIFADDR ioctl before they
+will allow traffic to flow through them. On interfaces where
+the network-link layer address mapping is static, only the
+network number is taken from the ioctl; the remainder is found
+in a hardware specific manner. On interfaces which provide
+dynamic network-link layer address mapping facilities (for example,
+10Mb/s Ethernets using
+.IR arp (4P),),
+the entire address specified in the ioctl is used.
+.LP
+The following
+.I ioctl
+calls may be used to manipulate network interfaces. Unless
+specified otherwise, the request takes an
+.I ifreq
+structure as its parameter. This structure has the form
+.RS
+.nf
+struct ifreq {
+ char ifr_name[16]; /* name of interface (e.g. "ec0") */
+ union {
+ struct sockaddr ifru_addr;
+ struct sockaddr ifru_dstaddr;
+ short ifru_flags;
+ } ifr_ifru;
+#define ifr_addr ifr_ifru.ifru_addr /* address */
+#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
+#define ifr_flags ifr_ifru.ifru_flags /* flags */
+};
+.fi
+.RE
+.IP SIOCSIFADDR 5
+.IX "ioctls for sockets" "SIOCSIFADDR" "\fLioctl\fP's for sockets" "\fLSIOCSIFADDR\fP \(em set ifnet address"
+.IX "SIOCSIFADDR set ifnet address" "" "\fLSIOCSIFADDR\fP \(em set ifnet address"
+.IX set "ifnet address ioctl \(em \fLSIOCSIFADDR\fP"
+.IX "network interface ioctls" SIOCSIFADDR "network interface \fLioctl\fP's" "\fLSIOCSIFADDR\fP \(em set ifnet address"
+Set interface address. Following the address
+assignment, the ``initialization'' routine for
+the interface is called.
+.IP SIOCGIFADDR
+.IX "ioctls for sockets" "SIOCGIFADDR" "\fLioctl\fP's for sockets" "\fLSIOCGIFADDR\fP \(em get ifnet address"
+.IX "SIOCGIFADDR get ifnet address" "" "\fLSIOCGIFADDR\fP \(em get ifnet address"
+.IX get "ifnet address \fLioctl\fP \(em \fLSIOCGIFADDR\fP"
+.IX "network interface ioctls" SIOCGIFADDR "network interface \fLioctl\fP's" "\fLSIOCGIFADDR\fP \(em get ifnet address"
+Get interface address.
+.IP SIOCSIFDSTADDR
+.IX "ioctls for sockets" "SIOCSIFDSTADDR" "\fLioctl\fP's for sockets" "\fLSIOCSIFDSTADDR\fP \(em set p-p address"
+.IX "SIOCSIFDSTADDR set p-p address" "" "\fLSIOCSIFDSTADDR\fP \(em set p-p address"
+.IX set "p-p address ioctl \(em \fLSIOCSIFDSTADDR\fP"
+.IX "network interface ioctls" SIOCSIFDSTADDR "network interface \fLioctl\fP's" "\fLSIOCSIFDSTADDR\fP \(em set p-p address"
+Set point to point address for interface.
+.IP SIOCGIFDSTADDR
+.IX "ioctls for sockets" "SIOCGIFDSTADDR" "\fLioctl\fP's for sockets" "\fLSIOCGIFDSTADDR\fP \(em get p-p address"
+.IX "SIOCGIFDSTADDR get p-p address" "" "\fLSIOCGIFDSTADDR\fP \(em get p-p address"
+.IX get "p-p address \fLioctl\fP \(em \fLSIOCGIFDSTADDR\fP"
+.IX "network interface ioctls" SIOCGIFDSTADDR "network interface \fLioctl\fP's" "\fLSIOCGIFDSTADDR\fP \(em get p-p address"
+Get point to point address for interface.
+.IP SIOCSIFFLAGS
+.IX "ioctls for sockets" "SIOCSIFFLAGS" "\fLioctl\fP's for sockets" "\fLSIOCSIFFLAGS\fP \(em set ifnet flags"
+.IX "SIOCSIFFLAGS set ifnet flags" "" "\fLSIOCSIFFLAGS\fP \(em set ifnet flags"
+.IX set "ifnet flags ioctl \(em \fLSIOCSIFFLAGS\fP"
+.IX "network interface ioctls" SIOCSIFFLAGS "network interface \fLioctl\fP's" "\fLSIOCSIFFLAGS\fP \(em set ifnet flags"
+Set interface flags field. If the interface is marked down,
+any processes currently routing packets through the interface
+are notified.
+.IP SIOCGIFFLAGS
+.IX "ioctls for sockets" "SIOCGIFFLAGS" "\fLioctl\fP's for sockets" "\fLSIOCGIFFLAGS\fP \(em get ifnet flags"
+.IX "SIOCGIFFLAGS get ifnet flags" "" "\fLSIOCGIFFLAGS\fP \(em get ifnet flags"
+.IX get "ifnet flags \fLioctl\fP \(em \fLSIOCGIFFLAGS\fP"
+.IX "network interface ioctls" SIOCGIFFLAGS "network interface \fLioctl\fP's" "\fLSIOCGIFFLAGS\fP \(em get ifnet flags"
+Get interface flags.
+.IP SIOCGIFCONF
+.IX "ioctls for sockets" "SIOCGIFCONF" "\fLioctl\fP's for sockets" "\fLSIOCGIFCONF\fP \(em get ifnet list"
+.IX "SIOCGIFCONF get ifnet list" "" "\fLSIOCGIFCONF\fP \(em get ifnet list"
+.IX get "ifnet list \fLioctl\fP \(em \fLSIOCGIFCONF\fP"
+.IX "network interface ioctls" SIOCGIFCONF "network interface \fLioctl\fP's" "\fLSIOCGIFCONF\fP \(em get ifnet list"
+Get interface configuration list. This request takes an
+.I ifconf
+structure (see below) as a value-result parameter. The
+.I ifc_len
+field should be initially set to the size of the buffer
+pointed to by
+.IR ifc_buf .
+On return it will contain the length, in bytes, of the
+configuration list.
+.RS
+.nf
+/*
+ * Structure used in SIOCGIFCONF request.
+ * Used to retrieve interface configuration
+ * for machine (useful for programs which
+ * must know all networks accessible).
+ */
+struct ifconf {
+ int ifc_len; /* size of associated buffer */
+ union {
+ caddr_t ifcu_buf;
+ struct ifreq *ifcu_req;
+ } ifc_ifcu;
+#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
+#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */
+};
+.RE
+.fi
+.IX "if device" "" "\fLif\fP \(em network interface general properties" "" PAGE END
+.SH "SEE ALSO
+arp(4P), ec(4S), lo(4)
diff --git a/share/doc/iso/wiscman/iso.4f b/share/doc/iso/wiscman/iso.4f
new file mode 100644
index 0000000..5e7ca88
--- /dev/null
+++ b/share/doc/iso/wiscman/iso.4f
@@ -0,0 +1,87 @@
+.TH ISO 4F "9 December 1988"
+.ds ]W Wisconsin ARGO 1.0
+.UC 4
+.SH NAME
+iso \- ISO protocol family
+.SH SYNOPSIS
+.B #include <sys/types.h>
+.br
+.B #include <netargo/iso.h>
+.SH DESCRIPTION
+The ISO protocol family is a collection of protocols
+that uses the ISO address format.
+The ISO family provides protocol support for the
+SOCK_SEQPACKET abstraction through the TP protocol (ISO 8073),
+and for the SOCK_RAW abstraction
+by providing direct access (for debugging) to the
+CLNP (ISO 8473) network layer protocol.
+.SH ADDRESSING
+ISO addresses are based upon ISO 8348/AD2,
+"Addendum to the Network Service Definition Covering Network Layer Addressing."
+.PP
+Sockets bound to the OSI protocol family use
+the following address structure:
+.sp 1
+.nf
+._f
+struct sockaddr_iso {
+ short siso_family;
+ u_short siso_tsuffix;
+ struct iso_addr siso_addr;
+};
+.sp 1
+.fi
+.PP
+This fields of this structure are:
+.TP 10
+\fIsiso_family:\fR
+Identifies the domain: AF_ISO or AF_INET.
+.TP 10
+\fIsiso_tsuffix:\fR
+The transport part of the address, described below.
+.TP 10
+\fIsiso_addr:\fR
+The network part of the address, described below.
+.SS TRANSPORT ADDRESSING
+.PP
+The above structure describes a simple form of
+ISO \fItransport\fR addresses.
+An ISO transport address is similar to an Internet address in that
+it contains a network-address portion and a portion that the
+transport layer uses to multiplex its services among clients.
+In the Internet domain, this portion of the address is called a \fIport\fR.
+In the ISO domain, this is called a \fItransport selector\fR
+(also known at one time as a \fItransport suffix\fR).
+While ports are always 16 bits,
+transport selectors may be
+of (almost) arbitrary size.
+ARGO supports two forms of transport selectors:
+"normal" or 16-bit selectors, and
+"extended" selectors, or selectors that may be from 1-64 bytes
+in length.
+The default mode of operation is to use 16-bit transport selectors.
+These addresses can be represented with the above structure.
+When transport selectors of any other size are used, the transport
+selector is kept in a separate structure.
+See the manual page \fItp(4p)\fR.
+.SS NETWORK ADDRESSING
+.PP
+ISO network addresses are limited to 20 bytes in length.
+ISO network addresses can take any format.
+ARGO 1.0 supports three formats.
+See \fIisodir(3)\fR and \fIisodir(5)\fR.
+.SH PROTOCOLS
+The ARGO 1.0 implementation of the
+ISO protocol family comprises
+the Connectionless-Mode Network Protocol (CLNP),
+and the Transport Protocol (TP), classes 4 and 0,
+and X.25.
+TP is used to support the SOCK_SEQPACKET
+abstraction.
+A raw interface to CLNP is available
+by creating an ISO socket of type SOCK_RAW.
+This is used for CLNP debugging only.
+.SH SEE ALSO
+tp(4P), cons(4p), clnp(4P), isodir(3), iso(4f), isodir(5),
+"The ARGO 1.0 Kernel Programmer's Guide",
+"Installing ARGO 1.0 on Academic Operating Systems 4.3 Release 2"
diff --git a/share/doc/iso/wiscman/rvd.4p b/share/doc/iso/wiscman/rvd.4p
new file mode 100644
index 0000000..44d7e84
--- /dev/null
+++ b/share/doc/iso/wiscman/rvd.4p
@@ -0,0 +1,90 @@
+.\"
+.\" 5799-WZQ (C) COPYRIGHT IBM CORPORATION 1986,1987,1988
+.\" LICENSED MATERIALS - PROPERTY OF IBM
+.\" REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083
+.\"
+.\"$Header:rvd.4p_ca 11.0$
+.\"$ACIS:rvd.4p_ca 11.0$
+.\"$Source: /ibm/acis/usr/man/man4/RCS/rvd.4p_ca,v $
+.\"This file contains -man macros.
+.TH RVD 4P "July 1987" "Space overwritten by .AC macro" " "
+.AC 1 0
+.SH NAME
+rvd \- Remote Virtual Disk protocol
+.SH DESCRIPTION
+RVD
+is a network service which allows several
+physical machines to share one
+physical mass storage device such as a hard disk. The basic
+concept is to have the machine to which the device is physically attached
+act as a server to read and write blocks for all the other
+machines desiring use of the resource.
+.PP
+The server program apportions the
+physical blocks into \*(lqvirtual disk packs\*(rq based on a
+table maintained with
+.IR vddb (8).
+The packs can then be used separately by clients. There are
+three modes of use: read-only, shared, and exclusive.
+Exclusive mode is used for
+read-write access, while read-only mode is as it sounds.
+Shared mode is not supported under IBM/4.3.
+If a disk pack is \*(lqspun up\*(rq in read-only mode,
+several clients may share the pack and read its information. In
+exclusive mode, one client has exclusive use of the disk pack.
+.PP
+Packs are \*(lqspun up\*(rq and \*(lqspun down\*(rq with the
+.I up
+and
+.I down
+commands (see
+.IR up (1)).
+This can be done
+at reboot time within
+.I /etc/rc.local
+(see
+.IR rc (8))
+or
+at login time within
+.I ~/.login
+(see
+.IR csh (1)).
+Once a pack is spun up, it behaves like a disk physically attached to
+the local machine (excepting network latency).
+The client can do anything desired with the pack;
+both MS-DOS and UNIX operating system file systems have
+been used on the same physical
+drive at the same time (on separate packs, of course).
+.PP
+RVD
+is implemented in two parts: server code and client code. The server
+code is written as a
+.IR "user process" ,
+i.e. it does not require any special
+privileges beyond read/write access to the disks it manages. The server
+opens a network socket and listens for UDP connections. It also accepts
+all
+RVD
+packets and acts on them.
+RVD is a protocol different from both
+UDP and TCP,
+although similar in nature to the former.
+.PP
+The client code is implemented as a pseudo-device and corresponding
+device driver in the kernel. It can handle up to 10
+remote virtual disks
+simultaneously, which are associated with the pseudo-devices below.
+.SH FILES
+.DT
+/dev/vd[0-9]a block special file pseudo-device
+.br
+/dev/rvd[0-9]a character special file pseudo-device
+.SH "SEE ALSO"
+up(1), rvddb(5), rvdtab(5),
+rvdflush(8), rvdchlog(8), rvddown(8),
+rvdexch(8), rvdflush(8), rvdlog(8), rvdsend(8), rvdshow(8),
+rvdshut(8), rvdsrv(8), savervd(8),
+spinup(8), vddb(8), vdstats(8)
+.br
+``The Remote Virtual Disk System'' in Volume II, Supplementary Documents
+
diff --git a/share/doc/iso/wiscman/tp.4p b/share/doc/iso/wiscman/tp.4p
new file mode 100644
index 0000000..64dbf2f
--- /dev/null
+++ b/share/doc/iso/wiscman/tp.4p
@@ -0,0 +1,609 @@
+.TH TP 4P "9 December 1988"
+.ds ]W Wisconsin ARGO 1.0
+.UC 4
+.SH NAME
+TP \- ISO Transport Protocol
+.SH SYNOPSIS
+.nf
+\fB#include <sys/socket.h>\fR
+\fB#include <netargo/iso_errno.h>\fR
+\fB#include <netargo/tp_param.h>\fR
+\fB#include <netargo/tp_user.h>\fR
+.PP
+\fBs = socket( [ AF_INET, AF_ISO ] , SOCK_SEQPACKET, 0);\fR
+.SH DESCRIPTION
+.PP
+The ISO Transport Protocol implemented for AOS R2
+at the University of Wisconsin - Madison
+includes classes 0 and 4
+of the ISO transport protocols
+as specified in
+the September 1984 version of DIS 8073.
+Class 4 of the protocol provides reliable, sequenced,
+flow-controlled, two-way
+transmission of data packets with an alternate stop-and-wait data path called
+the "expedited data" service.
+Class 0 is essentially a null transport protocol, which is used
+when the underlying network service provides reliable, sequenced,
+flow-controlled, two-way data transmission.
+Class 0 does not provide the expedited data service.
+The protocols are implemented as a single transport layer entity
+that coexists with the Internet protocol suite.
+Class 0 may be used only in the ISO domain.
+Class 4 may be used in the Internet domain as well as in the ISO domain.
+.PP
+The user interface to this protocol is the Berkeley interprocess communication
+interface (see \fIsocket(2)\fR.)
+Two new system calls for sending and receiving
+were added to this interface to
+to permit the support the end-of-transport-service-data-unit (EOTSDU)
+indication.
+See \fIsendv(2)\fR and \fIrecvv(2)\fR.
+If the EOTSDU is not needed, the Berkeley 4.3BSD interface
+can be used.
+See \fIsend(2)\fR and \fIrecv(2)\fR.
+.PP
+Through the
+\fIgetsockopt\fR and \fIsetsockopt\fR
+system calls,
+TP supports several options
+to control such things as negotiable options
+in the protocol and protocol strategies.
+.\"These system calls are used
+.\"to submit data for inclusion on connect and disconnect TPDUs.
+The options are defined in \fB<netargo/tp_user.h>\fR,
+and are described below.
+.\".PP
+.\"The options marked with a percent sign ( \fB%\fR )
+.\"are limited to use by the super-user.
+.PP
+In the tables below,
+the options marked with a pound sign ( \fB#\fR )
+may be used
+with \fIsetsockopt()\fR
+after a connection is established.
+Others must be used before the connection
+is established, in other words,
+before calling
+\fIconnect()\fR or
+\fIaccept()\fR.
+All options may be used
+with \fIgetsockopt()\fR
+before or
+after a connection is established.
+.\"
+.\" .PP
+.\" The options marked with an exclamation point ( \fB!\fR )
+.\" may be used after a connection is released,
+.\" but before
+.\" the TP reference timer (which generally
+.\" has a value in minutes) expires, and before
+.\" a \fIclose()\fR system call.
+.\" In other words, these commands may be used when the peer closes
+.\" a connection (possibly causing a disconnect indication), as long as the command
+.\" is issued "soon" after the disconnection occurred.
+.\" Disconnect data may be sent by the side initiating the close
+.\" but not by the passive side ("passive" with respect to the closing
+.\" of the connection), so there is no need to read disconnect data
+.\" after calling \fIclose()\fR.
+.\" .PP
+.\" The implementation of data on connect and disconnect is incomplete
+.\" and is not supported.
+.sp 1
+.TP 25
+\fBName\fR
+\fBValue [default]\fR
+.IP
+\fBDescription\fR
+.\".TP 25
+.\"TPOPT_CONN_DATA
+.\"(char *) [none]
+.\".IP
+.\"Data to send on \fIconnect()\fR.
+.\".TP 25
+.\"TPOPT_DISC_DATA\fB # !\fR
+.\"(char *) [none]
+.\".IP
+.\"Data to send on \fIclose()\fR.
+.\".TP 25
+.\"TPOPT_CDDATA_CLEAR\fB #\fR
+.\"No associated value.
+.\".IP
+.\"Erase outgoing connect or disconnect data.
+.TP 25
+TPOPT_MY_TSEL\fB \fR
+1-64 bytes.
+.IP
+An "extended" transport selector (tsel) for this socket.
+This option is used to set or get the local tsel.
+When this option is used to set a tsel,
+the default the 2-byte tsel
+that may have been allocated by \fIbind()\fR
+is retained, but this "extended" tsel is the
+tsel that is transmitted in a connection request
+When this option is used to get a tsel,
+it will return whatever transport tsel exists;
+if no "extended" tsel was given to this socket,
+the 2-byte tsel is returned.
+.TP 25
+TPOPT_PEER_TSEL\fB \fR
+1-64 bytes.
+.IP
+An "extended" transport selector (tsel) for the
+peer transport entity.
+This option is used to get the peer's tsel after
+a connection is established.
+When used before a connection
+is established, this option can set the tsel that
+will be transmitted as the "called" tsel
+in a connection request.
+.TP 25
+TPOPT_PERF_MEAS\fB #\fR
+Boolean.
+.IP
+When \fBtrue\fR, performance measurements will be kept
+for this connection.
+When set before a connection is established, the
+active side will use a locally defined parameter on the
+connect request packet; if the peer is another ARGO
+implementation, this will cause performance measurement to be
+turned on
+on the passive side as well.
+See \fItpperf(8)\fR.
+.TP 25
+TPOPT_PSTATISTICS\fB\fR
+No associated value on input.
+On output, struct tp_pmeas.
+.IP
+This command is used to read the performance statistics accumulated
+during a connection's lifetime.
+It can only be used with \fIgetsockopt()\fR.
+The structure it returns is described in \fB<netargo/tp_stat.h>\fR.
+See \fItpperf(8)\fR.
+.TP 25
+TPOPT_FLAGS
+unsigned integer. [ 0x0 ]
+.IP
+This command can only be used with \fIgetsockopt()\fR.
+See the description of the flags below.
+.TP 25
+TPOPT_PARAMS\fB\fR
+struct tp_conn_param.
+.IP
+Used to get or set a group parameters for a connection.
+The struct tp_conn_param is the argument used with the
+\fIgetsockopt()\fR or \fIsetsockopt()\fR system call.
+It is described in
+\fB<netargo/tp_user.h>\fR.
+.PP
+The fields of the \fItp_conn_param\fR structure are
+described below.
+.nf
+.sp 1
+\fIValues for TPOPT_PARAMS:\fR
+.fi
+.TP 25
+\fBField\fR
+\fBValue [default]\fR
+.IP
+\fBDescription\fR
+.\" ******************8
+.TP 25
+p_Nretrans
+nonzero short integer [ 1 ]
+.IP
+Number of times a TPDU will be retransmitted before the
+local TP entity closes a connection.
+.\" ******************8
+.TP 25
+p_dr_ticks
+nonzero short integer [ various ]
+.IP
+Number of clock ticks between retransmissions of disconnect request TPDUs.
+.\" ******************8
+.TP 25
+p_dt_ticks
+nonzero short integer [ various ]
+.IP
+Number of clock ticks between retransmissions of data TPDUs.
+This parameter applies only to class 4.
+.\" ******************8
+.TP 25
+p_cr_ticks
+nonzero short integer [ various ]
+.IP
+Number of clock ticks between retransmissions of connection request TPDUs.
+.\" ******************8
+.TP 25
+p_cc_ticks
+nonzero short integer [ various ]
+.IP
+Number of clock ticks between retransmissions of connection confirm TPDUs.
+This parameter applies only to class 4.
+.\" ******************8
+.TP 25
+p_x_ticks
+nonzero short integer [ various ]
+.IP
+Number of clock ticks between retransmissions of expedited data TPDUs.
+This parameter applies only to class 4.
+.\" ******************8
+.TP 25
+p_sendack_ticks
+nonzero short integer [ various ]
+.IP
+Number of clock ticks that the local TP entity
+will wait before sending an acknowledgment for normal data
+(not applicable if the acknowlegement strategy is TPACK_EACH).
+This parameter applies only to class 4.
+.\" ******************8
+.TP 25
+p_ref_ticks
+nonzero short integer [ various ]
+.IP
+Number of clock ticks for which a reference will
+be considered frozen after the connection to which
+it applied is closed.
+This parameter applies to classes 4 and 0 in the
+ARGO implementation, despite the fact that
+the frozen reference function is required only for
+class 4.
+.\" ******************8
+.TP 25
+p_inact_ticks
+nonzero short integer [ various ]
+.IP
+Number of clock ticks without an incoming packet from the peer after which
+TP close the connection.
+This parameter applies only to class 4.
+.\" ******************8
+.TP 25
+p_keepalive_ticks
+nonzero short integer [ various ]
+.IP
+nonzero short integer [ various ]
+Number of clock ticks between acknowledgments that are sent
+to keep an inactive connection open (to prevent the peer's
+inactivity control function from closing the connection).
+This parameter applies only to class 4.
+.\" ******************8
+.TP 25
+p_winsize
+short integer between 128 and 16384. [4096 bytes]
+.IP
+The buffer space limits in bytes for incoming and outgoing data.
+There is no way to specify different limits for incoming and outgoing
+paths.
+The actual window size at any time
+during the lifetime of a connection
+is a function of the buffer size limit, the negotiated
+maximum TPDU size, and the
+rate at which the user program receives data.
+This parameter applies only to class 4.
+.\" ******************8
+.TP 25
+p_tpdusize
+unsigned char between 0x7 and 0xd.
+[ 0xc for class 4 ] [ 0xb for class 0 ]
+.IP
+Log 2 of the maximum TPDU size to be negotiated.
+The TP standard (ISO 8473) gives an upper bound of
+0xd for class 4 and 0xb for class 0.
+The ARGO implementation places upper bounds of
+0xc on class 4 and 0xb on class 0.
+.\" ******************8
+.TP 25
+p_ack_strat
+TPACK_EACH or TPACK_WINDOW. [ TPACK_WINDOW ]
+.IP
+This parameter applies only to class 4.
+Two acknowledgment strategies are supported:
+.IP
+TPACK_EACH means that each data TPDU is acknowledged
+with an AK TPDU.
+.IP
+TPACK_WINDOW
+means that upon receipt of the packet that represents
+the high edge of the last window advertised, and AK TPDU is generated.
+.\" ******************8
+.TP 25
+p_rx_strat
+4 bit mask
+[ TPRX_USE_CW | TPRX_FASTSTART over
+connectionless network protocols ]
+[ TPRX_USE_CW over
+connection-oriented network protocols ]
+.IP
+This parameter applies only to class 4.
+The bit mask may include the following values:
+.IP
+TPRX_EACH: When a retransmission timer expires, retransmit
+each packet in the send window rather than
+just the first unacknowledged packet.
+.IP
+TPRX_USE_CW: Use a "congestion window" strategy borrowed
+from Van Jacobson's congestion window strategy for TCP.
+The congestion window size is set to one whenever
+a retransmission occurs.
+.IP
+TPRX_FASTSTART: Begin sending the maximum amount of data permitted
+by the peer (subject to availability).
+The alternative is to start sending slowly by
+pretending the peer's window is smaller than it is, and letting
+it slowly grow up to the real peer's window size.
+This is to smooth the effect of new connections on a congested network
+by preventing a transport connection from suddenly
+overloading the network with a burst of packets.
+This strategy is also due to Van Jacobson.
+.\" ******************8
+.TP 25
+p_class
+5 bit mask
+[ TP_CLASS_4 | TP_CLASS_0 ]
+.IP
+Bit mask including one or both of the values TP_CLASS_4 and TP_CLASS_0.
+The higher class indicated is the preferred class.
+If only one class is indicated, negotiation will not occur
+during connection establishment.
+.\" ******************8
+.TP 25
+p_xtd_format
+Boolean.
+[ false ]
+.IP
+Boolean indicating that extended format shall be negotiated.
+This parameter applies only to class 4.
+.\" ******************8
+.TP 25
+p_xpd_service
+Boolean.
+[ true ]
+.IP
+Boolean indicating that
+the expedited data transport service will be negotiated.
+This parameter applies only to class 4.
+.\" ******************8
+.TP 25
+p_use_checksum
+Boolean.
+[ true ]
+.IP
+Boolean indicating the the use of checksums will be negotiated.
+This parameter applies only to class 4.
+.\" ******************8
+.TP 25
+p_use_nxpd
+Reserved for future use.
+.\" ******************8
+.TP 25
+p_use_rcc
+Reserved for future use.
+.\" ******************8
+.TP 25
+p_use_efc
+Reserved for future use.
+.\" ******************8
+.TP 25
+p_no_disc_indications
+Boolean.
+[ false ]
+.IP
+Boolean indicating that the local TP entity shall not issue
+indications (signals) when a TP connection is disconnected.
+.\" ******************8
+.TP 25
+p_dont_change_params
+Boolean.
+[ false ]
+.IP
+If \fBtrue\fR the TP entity will not override
+any of the other values given in this structure.
+If the values cannot be used, the TP entity will drop, disconnect,
+or refuse to establish the connection to which this structure pertains.
+.\" ******************8
+.TP 25
+p_netservice
+One of { ISO_CLNS, ISO_CONS, ISO_COSNS, IN_CLNS }.
+[ ISO_CLNS ]
+.IP
+Indicates which network service is to be used.
+.IP
+ISO_CLNS indicates the connectionless network service provided
+by CLNP (ISO 8473).
+.IP
+ISO_CONS indicates the connection-oriented network service provided
+by X.25 (ISO 8208) and ISO 8878.
+.IP
+ISO_COSNS indicates the
+connectionless network service running over a
+connection-oriented subnetwork service : CLNP (ISO 8473) over X.25 (ISO 8208).
+.IP
+IN_CLNS indicates the
+DARPA Internet connectionless network service provided by IP (RFC 791).
+.\" ******************8
+.TP 25
+p_dummy
+Reserved for future use.
+.sp 1
+.PP
+The TPOPT_FLAGS option is used for obtaining
+various boolean-valued options.
+Its meaning is as follows.
+The bit numbering used is that of the PC/RT, which means that bit
+0 is the most significant bit, while bit 8 is the least significant bit.
+.nf
+.sp 1
+\fIValues for TPOPT_FLAGS:\fR
+.fi
+.TP 10
+\fBBits\fR
+\fBDescription [Default]\fR
+.TP 10
+0
+TPFLAG_NLQOS_PDN : set when the quality of the
+network service is
+similar to that of a public data network.
+.TP 10
+1
+TPFLAG_PEER_ON_SAMENET : set when the peer TP entity
+is considered to be on the same network as the local
+TP entity.
+.TP 10
+2
+Not used.
+.TP 10
+3
+TPFLAG_XPD_PRES : set when expedited data are present
+[ 0 ]
+.TP 10
+4..7
+Reserved.
+.\".TP 10
+.\"4
+.\"Reserved.
+.\".TP 10
+.\"5
+.\"TPFLAG_DISC_DATA_IN : read only flag, if set indicates that
+.\"data from a disconnect TPDU are present.
+.\".TP 10
+.\"6
+.\"Reserved.
+.\".TP 10
+.\"7
+.\"TPFLAG_CONN_DATA_IN : read only flag, if set indicates that
+.\"data from a connect TPDU are present.
+.SH "LIBRARIES
+.PP
+The new system calls \fIrecvv\fR and \fIsendv\fR are supported by a
+library, \fIlibtp.a\fR (rather than a modified C library).
+Also in this
+library are new optional interfaces to the \fIconnect\fR and \fIaccept\fR
+system calls. See LIBTP(3).
+.SH FILES
+.PP
+The following files in have entries necessary for the correct operation
+of the TP utilities.
+.nf
+\fC
+ /etc/isodir
+ /etc/protocols
+\fR
+.fi
+.PP
+The symbolic link is needed for users to write programs using IPC
+with TP:
+.nf
+\fC
+ /usr/include/netargo@ -> /sys/netargo
+\fR
+.fi
+.PP
+The following utilities have changed:
+.nf
+ netstat
+ ifconfig
+ config
+.fi
+.PP
+The following are new utilities and daemons:
+.nf
+ isoroute
+ rlogin.iso, rcp.iso, rsh.iso, isod, rlogind
+ tpdiscard
+ tpping
+ tppt (for maintenance and debugging)
+ bark (for maintenance and debugging)
+ tpfileget, tpfileput (for debugging)
+ tpstat, tpmon
+ tpset
+ tppkt
+ viid
+.fi
+.PP
+In the kernel source, many files have changed or been added.
+For a list of these, see the installation guide,
+"Installing Wisconsin ARGO 1.0 on Academic Operating System 4.3
+Release 2".
+.SH "ERROR VALUES
+.PP
+The TP entity returns \fIerrno\fR error values as defined in
+\fB<sys/errno.h>\fR
+and
+\fB<netargo/iso_errno.h>\fR.
+User programs may print messages associated with these value by
+using an expanded version of \fIperror()\fR
+found in the ISO library, \fIlibisodir.a\fR.
+.PP
+If the TP entity encounters asynchronous events
+that will cause a transport connection to be closed,
+such as
+timing out while retransmitting a connect request TPDU,
+or receiving a DR TPDU,
+the TP entity issues a SIGURG signal, indicating that
+disconnection has occurred.
+If the signal is issued during a
+a system call, the system call may be interrupted,
+in which case the
+\fIerrno\fR value upon return from the system call is EINTR.
+If the signal SIGURG
+is being handled by reading
+from the socket, and it was a \fIaccept()\fR that
+timed out, the read may result in ENOTSOCK,
+because the \fIaccept()\fR call had not yet returned a
+legitimate socket descriptor when the signal was handled.
+ETIMEDOUT (or a some other errno value appropriate to the
+type of error) is returned if SIGURG is blocked
+for the duration of the system call.
+A user program should take one of the following approaches:
+.IP "Block SIGURG." 5
+If the program is servicing
+only one connection, it can block or ignore SIGURG during connection
+establishment.
+The advantage of this is that the \fIerrno\fR value
+returned is somewhat meaningful.
+The disadvantage of this is that
+if ignored, disconnection and expedited data indications could be
+missed.
+For some programs this is not a problem.
+.IP "Handle SIGURG." 5
+If the program is servicing more than one connection at a time
+or expedited data may arrive or both, the program must
+service SIGURG.
+It can use the \fIgetsockopt(...TPOPT_FLAGS...)\fR system
+call to see if the signal
+was due to the arrival of expedited data or due to a disconnection.
+In the latter case,
+\fIgetsockopt()\fR
+will return ENOTCONN.
+.SH BUGS
+.PP
+When running TP over the token ring, if checksumming
+is NOT used, the TP entity sents packets to the lan driver faster than
+the driver can reasonably handle them.
+A bug in the lan driver causes it to reorder the packets in this
+situation, causing an overall degradation of TP performance.
+In general, this is not a problem because very few applications
+will actually be able to send packets this fast.
+Nevertheless,
+in order to prevent this reordering,
+one may induce a delay in the TP entity by setting the 1-byte
+value
+\fItp_delay\fR
+to 1
+using the debugger.
+Hit the <pause> key, then
+type \fB/b tp_delay\fR followed by the <enter key>.
+The debugger will print the value 00.
+You then type \fB1\fR followed by the <enter key>.
+Then type \fBend\fR <enter key>.
+Then type \fBgo\fR <enter key>.
+.SH SEE ALSO
+.PP
+tcp(4P), sendv(2), recvv(2), libtp(3),
+isodir(3), isodir(5), netstat(1),
+iso(4F), clnp(4P), viid(8)
+tppt(8), tpstat(8), bark(8), tppkt(8), tpset(8), tpperf(8)
+isoroute(8), ifconfig(8), isod(8), rlogin.iso(1),
+"Installing Wisconsin ARGO 1.0 on Academic Operating System 4.3
+Release 2",
+"ARGO 1.0 Kernel Programmer's Manual"
OpenPOWER on IntegriCloud