diff options
Diffstat (limited to 'share/doc/iso/wisc/net_design.nr')
-rw-r--r-- | share/doc/iso/wisc/net_design.nr | 1139 |
1 files changed, 1139 insertions, 0 deletions
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. |