Sync usage with man page.
[netbsd-mini2440.git] / share / doc / iso / wisc / net_design.nr
blobb9e3039dec7f23909a3751c8fd4c19c29b666d84
1 .\"     $NetBSD$
2 .\"
3 .NC "The Design of the ARGO Network Layer"
4 .sh 1 "Connectionless Network Layer
5 .pp
6 The following sections describe the design of the ARGO
7 connectionless network layer (CLNL).
8 The connectionless network service is provided by several
9 network-layer protocols: ES-IS (ISO 9542), 
10 CLNP (ISO 8348), and (ISO 8208) X.25.
11 The protocol CLNP is the primary connectionless network layer
12 protocol.
13 It is supported by X.25 when X.25 is used as a subnetwork layer.
14 X.25 can also be viewed as a link layer protocol in this context.
15 The ES-IS protocol supports CLNP by providing the following functions:
16 .ip \(bu 5
17 automatic mapping of NSAP-addresses to SNPA addresses,
18 .ip \(bu 5
19 automatic configuration of networks of end systems and intermediate
20 systems,  and
21 .ip \(bu 5
22 redirection of network-layer traffic in response to 
23 configuration changes.
24 .pp
25 The rest of this chapter describes the design of 
26 CLNP, the design of  ES-IS,
27 and the design of the connection-oriented
28 network layer, including the connection-oriented subnetwork service (X.25).
29 .pp
30 CLNP has two subsets defined: the Inactive Network Layer 
31 protocol subset and the Non-Segmenting protocol subset. 
32 The Inactive Network Layer subset is a null-function subset 
33 in which the CLNP is not needed, and the 
34 protocol consists of sending
35 a 1-byte header containing the value zero. 
36 This "subset" is not supported in ARGO.
37 .pp
38 The Non-Segmenting protocol subset permits simplification of the DT NPDU
39 header when it is known that segmentation of the DT NPDU is not required.
40 ARGO supports this subset.
41 When this subset is used, 
42 the segmentation part of the DT NPDU (data packet) header is not present, 
43 and the \fIdon't segment\fR bit is set in the 
44 fixed part of the header. 
45 This subset is chosen by setting the bit
46 \fICLNP_NO_SEG\fR in the \fIflags\fR argument to \fIclnp_output()\fR.
47 .pp
48 Throughout the remainder of this
49 document,
50 following definitions apply:
51 .(b
52 \(bu DT NPDU: data transfer NPDU.
53 \(bu ER NPDU: error report NPDU.
54 \(bu NPDU: either an ER or DT NPDU.
55 .)b
56 .sh 2 "DT NPDU Output"
57 .pp
58 A CLNP DT NPDU is transmitted by calling \fIclnp_output()\fR. 
59 .so figs/clnp_output.nr
60 .\" FIGURE
61 .CF
62 outlines the sequence of steps taken by \fIclnp_output()\fR when
63 transmitting an NPDU. 
64 The solid lines indicate normal flow of control. The
65 dashed lines indicate possible error returns (with associated
66 error code).
67 .pp
68 \fIClnp_output()\fR will automatically cache (in the \fIisopcb\fR)
69 the header of each packet it sends. This cached copy of the header
70 is used on subsequent sends reducing the amount of time spent generating
71 the header. Therefore, the first action \fIclnp_output()\fR takes is to
72 examine the cached header (if any). If the header is still valid (see below)
73 then it is used. Otherwise, a new header is built.
74 .sh 3 "When The Cached Header Is Invalid"
75 .pp
76 Before any resources are allocated, the options to be sent with the packet
77 are examined. If any unsupported options are present, the error \fIEINVAL\fR
78 is returned.
79 Next, the length of the source and destination 
80 NSAP addresses (taken from the \fIisopcb\fR)
81 are checked. The source address length may be zero. This
82 indicates that \fIclnp_output()\fR should compute the source address based upon
83 the route taken, in which case CLNP calls
84 the function \fIclnp_srcroute()\fR.
85 Source routing 
86 will be discussed in detail later in this section.
87 If, in the process of checking
88 the address lengths, an invalid length is detected, the error
89 \fIENAMETOOLONG\fR is returned.
90 .pp
91 After checking the lengths of the addresses, 
92 CLNP allocates an \fImbuf\fR in which the DT NPDU header will be constructed. 
93 If an \fImbuf\fR cannot be found, the error
94 \fIENOBUFS\fR is returned. Once the \fImbuf\fR is allocated, 
95 the fixed part of the DT NPDU header is copied into the \fImbuf\fR.
96 .pp
97 The next step is to route the DT NPDU. This is accomplished by the
98 \fIclnp_route()\fR function. 
99 It is necessary to route the datagram early in the output process because
100 in many cases, the source address will not be known until the route
101 has been created.
102 When a system is multi-homed it has several source addresses. 
103 The source address to choose depends on the
104 network interface (thus, the route) used.
106 The address part of the DT NPDU follows the fixed part. 
107 Since appending the address part is the next task, 
108 the source address must be determined.
109 Therefore the route must be determined.
111 After appending the address part to the fixed part of the
112 NPDU header, CLNP
113 appends any options given in the arguments to 
114 \fIclnp_output()\fR.
115 The options are specified in a
116 separate \fImbuf\fR stored in the \fIiso_pcb\fR.
117 If this \fImbuf\fR
118 pointer is not null, a copy of the \fImbuf\fR is made, and this copy is 
119 chained (appended) to the
120 \fImbuf\fR in which the
121 NPDU header resides. The options \fImbuf\fR linked in with the DT packet
122 must be a copy of the options \fImbuf\fR passed to \fIclnp_output()\fR. If
123 this was not done, then
124 the options \fImbuf\fR passed would be freed by the interface
125 driver after the NPDU had been transmitted.
126 Since a copy must be made, it is possible for \fIclnp_output()\fR to
127 return \fIENOBUFS\fR at this time.
128 A later section of this chapter describes
129 the handling of options in greater detail.
131 User data for the packet are passed to 
132 \fIclnp_output()\fR as an \fImbuf\fR chain.
133 This \fImbuf\fR chain is appended to the DT NPDU header chain. 
134 At this point, the DT NPDU is ready for transmission. 
135 If header caching has not been disabled, a cache entry is made in the 
136 \fIisopcb\fR.
137 If the size of the entire packet 
138 is less than the maximum transmission unit (MTU) of the 
139 network interface to be used,
140 the packet is placed on the queue for that network interface,
141 otherwise \fIclnp_fragment()\fR is invoked to
142 break up the packet into smaller packets, called
143 "derived NPDUs", and transmit the derived NPDUs.
144 .sh 3 "When A Cached Header Exists"
146 In this case, \fIclnp_output()\fR updates the segmentation part of the
147 header (if segmenting is permitted), computes the checksum, and transmits
148 (or fragments) the packet.
150 The cached CLNP header is stored in the \fIstruct isopcb\fR. The field
151 \fIisop_clnpcache\fR within the \fIisopcb\fR points to an \fImbuf\fR
152 which contains a \fIstruct clnp_cache\fR:
156 tab(+);
157 l s s.
158 struct clnp_cache {
160 l l l l.
161 +u_short+cni_securep;+/* ptr to security option */
162 +struct iso_addr+clc_dst;+/* destination of packet */
163 +struct mbuf+*clc_options;+/* ptr to options mbuf */
164 +int+clc_flags;+/* flags passed to clnp_output */
165 +int+clc_segoff;+/* offset of seg part of header */
166 +struct sockaddr+*clc_firsthop;+/* first hop of packet */
167 +struct ifnet+*clc_ifp;+/* ptr to interface */
168 +struct mbuf+*clc_hdr;+/* cached pkt hdr (finally)! */
173 The first three fields \fIclc_dst, clc_options\fR and \fIclc_flags\fR
174 are used to check the validity of the cache entry. The cache is considered
175 valid if:
176 .ip \(bu 5
177 The options mbuf has not changed.
178 .ip \(bu 5
179 The destination of the packet has not changed.
180 .ip \(bu 5
181 The route still exists and is up.
182 .ip \(bu 5
183 The flags have not changed.
185 If all these conditions are met, then the bulk of the \fIclnp_output()\fR
186 processing is avoided. The fields \fIclc_segoff, clc_firsthop,\fR 
187 and \fIclc_ifp\fR are used by \fIclnp_output()\fR to transmit the packet.
188 The field \fIclc_ifp\fR contains the actual cached header which is copied
189 and then enqueued on the outgoing interface.
190 .sh 2 "NPDU Input"
192 .\" FIGURE
193 .so figs/clnp_input.nr
194 All CLNP NPDUs are processed by \fIclnp_input()\fR. 
196 outlines
197 the flow of control within \fIclnlintr()\fR and \fIclnp_input()\fR. 
198 The solid lines
199 indicate normal flow of control. The dashed lines indicate 
200 possible error returns.
202 \fIClnlintr()\fR is invoked by a software interrupt. 
203 This interrupt is posted by a device driver whenever a 
204 packet is placed in CLNL's input queue 
205 \fIclnlintrq()\fR, and the queue is empty. 
206 It is the responsibility of \fIclnlintr()\fR, when invoked, 
207 to process all packets present on the input queue. 
208 Thus, to begin the task of processing a packet, \fIclnlintr()\fR
209 removes the next packet from the queue. 
210 When an error is discovered during processing, the packet is discarded and
211 \fIclnlintr()\fR begins afresh.
213 Once removed, the type of the NPDU is checked. If the NPDU is an
214 ES-IS packet, then \fIesis_input()\fR is called. If the NPDU is a CLNP
215 packet, then \fIclnp_input()\fR is called. Other packets are silently
216 discarded.
217 The function \fIclnp_hdr_ck()\fR checks the NPDU for consistency. 
218 Before checking consistency, \fIclnp_hdr_ck()\fR insures
219 that the entire NPDU header is located
220 contigiously in a single \fImbuf\fR (\fIm_pullup()\fR\** performs this task).
222 \** If the NPDU header is larger than \fIMLEN\fR (currently 256), then
223 \fIm_pullup()\fR will allocate a cluster \fImbuf\fR.
225 After "pulling" the header into a single \fImbuf\fR, \fIclnp_hdr_ck()\fR
226 checks for the proper CLNP version and protocol identification. 
227 It also checks that the lifetime field is greater than zero.
228 After checking header consistency, the NPDU checksum is computed.\**
230 \** If the checksum value is zero, the checksum is not computed. 
231 The value zero is reserved to mean \*(lqdo not use checksum\*(rq.
233 If the checksum is valid, \fIclnp_data_ck()\fR is called to insure
234 that the amount of data in the \fImbuf\fR chain corresponds to the
235 amount indicated in the NPDU header.
237 Once the consistency of the NPDU has been assured, the various parts of the
238 packet are extracted. 
239 Care is taken with each extraction to insure that an attempt is not made
240 to address data that does not really exist. (Such an attempt could
241 result in a kernel trap).
243 Next, the options part of the NPDU, if present, is checked for validity.
244 If unsupported options are found, the packet is discarded. 
245 See the section \*(lqNPDU options\*(rq for details of options processing.
247 Finally, after the preceding checks and extractions have been made, the
248 destination address is examined. 
249 If the address indicates that the packet's destination is not this
250 system, the packet is forwarded by calling \fIclnp_forward()\fR. 
251 See the section \*(lqDT NPDU Forwarding\*(rl for details of packet forwarding.
252 If this end system is the
253 packet's destination, processing continues.
255 If the packet is not complete, it is passed to \fIclnp_reass()\fR for
256 reassembly. 
257 See the section \*(lqDT NPDU Reassembly\*(rq
258 for details of packet reassembly.
260 At this point, a complete NPDU is in hand. 
261 If the NPDU is a DT NPDU, it is given to the transport layer
262 by calling the TP input routine. 
263 Otherwise, it is give to the ER NPDU processing function, 
264 \fIclnp_er_input()\fR.
265 .sh 3 "DT NPDU Forwarding"
267 Packet forwarding is accomplished by \fIclnp_forward()\fR. 
268 This is performed regardless of the system's type (end or intermediate).
269 The task of
270 forwarding a packet is fairly straight-forward. First, the lifetime
271 field of the datagram is decremented. 
272 If this operation changes the value to zero, the packet is discarded.
274 If the source route option is present, and the address at the top of the list
275 matches an address of one of the system's network interfaces, then
276 the next-source-route-to-be-used offset is adjusted in the option.
277 Next, the packet is routed by \fIclnp_route()\fR
278 or \fIclnp_srcroute()\fR. 
279 If the record route option is present, the address of the outgoing 
280 network interface is recorded by \fIclnp_dooptions()\fR.
282 Finally the packet is dispatched. 
283 If the size of the entire packet is less than the MTU of the output 
284 network interface, the packet is enqueued for that interface, 
285 otherwise \fIclnp_fragment()\fR is invoked to
286 fragment the packet and enqueue the derived NPDUs.
287 .sh 2 "NPDU Options"
289 The options section of an NPDU consists of a series of triplets:
290 \fIoption identification\fR, \fIoption length\fR, 
291 and \fIoption value\fR. 
292 These triplets are checked each time the options are examined or changed. 
293 To avoid repeated parsing of the options, the ARGO CLNP
294 maintains an index. 
295 This index is organized as a \fIclnp_optidx\fR structure. 
296 This structure is shown below.
300 tab(+);
301 l s s.
302 struct clnp_optidx {
304 l l l l.
305 +u_short+cni_securep;+/* ptr to security option */
306 +char+cni_secure_len;+/* length of security option */
307 +u_short+cni_srcrt_s;+/* offset of src rt option */
308 +u_short+cni_srcrt_len;+/* length of src rt option */
309 +u_short+cni_recrtp;+/* ptr to head of recrt option */
310 +char+cni_recrt_len;+/* length of recrt option */
311 +char+cni_priorp;+/* ptr to priority option */
312 +u_short+cni_qos_formatp;+/* ptr to format of qos option */
313 +char+cni_qos_len;+/* length of qos option */
314 +char+cni_er_reason;+/* reason from ER pdu option */
318 This index allows CLNP quickly to discover the existence 
319 and value of an option. 
320 For example, if a security option is present, the \fIcni_securep\fR
321 field of the option index is non-zero and the value of
322 \fIcni_securep\fR is an offset to the beginning of the 
323 security option. 
324 The function \fIclnp_opt_sanity()\fR 
325 parses the options and computes the index.
326 While parsing, it also verifies that the 
327 options are valid and correctly structured.
328 If an error occurs while parsing an option, 
329 \fIclnp_opt_sanity()\fR returns an error code. 
330 The following sections describe how options are processed
331 during the send, forward and receive operations.
332 .sh 3 "Sending Options"
334 Options to be sent with a datagram are passed to \fIclnp_output()\fR as
335 two arguments. An option index is passed along with an \fImbuf\fR
336 containing the options. 
337 The options in the \fImbuf\fR must be formatted
338 exactly as specified by CLNP. 
339 If the security, quality of service, or
340 priority options are specified, \fIclnp_output()\fR will not transmit the
341 datagram and \fIEINVAL\fR is returned.
342 The system call \fIsetsockopt()\fR is used to set the CLNP options 
343 to be sent on a datagram. 
344 See \fIclnp(4)\fR for more information about setting CLNP options.
346 If a source route is specified, 
347 the normal CLNP routing function \fIclnp_route()\fR is not used, and 
348 \fIclnp_srcroute()\fR is invoked.
350 When the DECBIT config option is specified, \fIclnp_output\fR will
351 automatically add the globally unique quality of service option to the packet.
352 The sequencing preferred and low delay bits in this option are set.
353 .sh 3 "Forwarding Options"
355 During packet forwarding, the padding, security,
356 and priority options are ignored. If record route is selected, the
357 function \fIclnp_dooptions()\fR logs the current network
358 interface address in the record route list.
360 If a source route is specified, 
361 the normal CLNP routing function \fIclnp_route()\fR is not used, and 
362 \fIclnp_srcroute()\fR is invoked.
363 .sh 4 "The Congestion Experienced Bit"
365 If a packet is forwarded containing the globally unique quality of
366 service option, and the interface through which the packet will be 
367 transmitted has a queue length greater than \fIcongest_threshold\fR,
368 then the congestion experienced bit is set in the quality of service option.
370 The threshold value stored in \fIcongest_threshold\fR may be changed
371 with the \fIclnlutil\fR utility.
372 .sh 3 "Receiving Options"
374 On receipt, all CLNP options are ignored except the security 
375 and globally unique quality of service option.
376 If the security option is found, the packet is discarded.
377 If the globally unique quality of service option is present, and the
378 congestion experienced bit is set, then the transport congestion
379 control function \fItpclnp_ctlinput(PRC_QUENCH2, addr)\fR is called.
380 The following table summarizes the CLNP option processing.
383 allbox, tab(+);
384 l l l l.
385 Option+Send+Forward+Receive
387 Padding+may be set+-+-
388 Security+reject+ignore+discard
389 Source Route+\fIclnp_srcroute()\fR+\fIclnp_srcroute()\fR+-
390 Record Route+-+\fIclnp_dooptions()\fR+-
391 QOS+added+congestion bit set+tpclnp_ctlinput()
392 Priority+reject+ignore+-
395 .sh 2 "DT NPDU Segmentation"
397 Segmentation is the process by which initial NPDUs are segmented into 
398 smaller derived NPDUs when the initial NPDU is too large for transmission
399 on a network interface.
400 Segmentation is accomplished by \fIclnp_fragment()\fR. 
401 This function chops the NPDU into pieces and individually places the pieces
402 in the appropriate network interface's output queue. 
403 Each piece is made as large as possible. 
404 Note: The phrase "fragmentation" is used synonymously with "segmentation"
405 throughout this prose and the CLNP fragmentation code. This is due to 
406 this author's familiarity with the DoD Internet Protocol which uses
407 the term "fragment."
408 .sh 2 "DT NPDU Reassembly"
410 Derived NPDUs are put back together by the process called 
411 reassembly. 
412 Reassembly is performed only at the destination end system.
413 When a derived NPDU arrives, it is passed to \fIclnp_reass()\fR. 
414 This function scans a linked list of NPDUs awaiting reassembly. 
415 Each packet in the list is represented by a fragment list
416 descriptor, which is stored in an \fImbuf\fR:
420 tab(+);
421 l s s s.
422 struct clnp_fragl {
424 l l l l.
425 +struct iso_addr+cfl_src;+/* source */
426 +struct iso_addr+cfl_dst;+/* destination */
427 +u_short+cfl_id;+/* id of the pkt */
428 +u_char+cfl_ttl;+/* time to live */
429 +u_short+cfl_last;+/* offset of last 
430 +++byte of packet */
431 +struct mbuf +*cfl_orighdr;+/* ptr to 
432 +++original header */
433 +struct clnp_frag+*cfl_frags;+/* linked list 
434 +++of fragments */
435 +struct clnp_fragl+*cfl_next;+/* next pkt be-
436 +++ing reassembled */
441 The fields \fIcfl_src\fR, \fIcfl_dst\fR, and \fIcfl_id\fR are used to
442 match an incoming derived NPDU with a fragment list. 
443 \fICfl_orighdr\fR contains a copy of the NPDU header of the first fragment received. 
444 The linked list of fragments pertaining to the packet is stored in the
445 \fIcfl_frags\fR field. 
446 Each NPDU fragment represented by a \fIclnp_frag\fR structure, 
447 stored in an \fImbuf\fR:
451 tab(+);
452 l s s s.
453 struct clnp_frag {
455 l l l l.
456 +u_int+cfr_first;+/* offset of 
457 +++first byte of this frag */
458 +u_int+cfr_last;+/* offset of last 
459 +++byte of this frag */
460 +u_int+cfr_bytes;+/* bytes to shave */
461 +struct mbuf+*cfr_data;+/* ptr to data */
462 +struct clnp_frag+*cfr_next;+/* next frag */
467 The fields \fIcfr_first\fR and \fIcfr_last\fR indicate the first and
468 last octet of the fragment. 
469 \fICfr_data\fR points to an mbuf chain
470 which contains the data for the fragment.
472 If \fIclnp_reass()\fR finds a \fIclnp_fragl\fR structure matching the
473 incoming derived NPDU, \fIclnp_insert_frag()\fR is called to create
474 a \fIclnp_frag\fR structure and insert it in the linked list of
475 packet fragments. 
476 If no \fIclnp_fragl\fR structure is found, 
477 \fIclnp_newpkt()\fR is invoked to create a new fragment list structure.
479 The last task \fIclnp_reass()\fR performs is to check if the fragment
480 that just arrived completes the reassembly of the initial NPDU. 
481 If it does, the reassembled NPDU is rearranged to 
482 look like it just arrived intact.
483 It accomplishes this by linking the \fImbuf\fRs holding
484 the fragments into one \fImbuf\fR chain that represents the initial
485 NPDU.
486 A pointer to this \fImbuf\fR chain is returned by \fIclnp_reass()\fR.
488 If the newly arrived fragment does not complete an initial NPDU, 
489 \fIclnp_reass()\fR returns NULL.
490 .sh 3 "Reassembly Lifetime Control"
492 One function of the CLNP is to prevent
493 a proliferation of fragments awaiting reassembly from
494 consuming buffers in an end system for indefinite periods of time.
495 This function is called reassembly lifetime control.
496 It is accomplished by 
497 periodic traversal of
498 the list of \fIclnp_fragl\fR structures, decrementing the 
499 \fIcfl_ttl\fR field. 
500 This field is a copy of the NPDU time-to-live
501 field. If \fIcfl_ttl\fR reaches zero, all resources associated with the
502 fragment are released.
503 The procedure
504 \fIclnp_slowtimo()\fR, which is called by the system
505 clock every 500 milliseconds (every half-second),
506 performs the CLNP reassembly lifetime control.
507 .sh 2 "ER NPDU"
509 An ER NPDU is sent to the originator of a packet when a DT NPDU is
510 discarded and the error report function is not suppressed. Suppression
511 of the error report function is accomplished by setting the "no ER"
512 bit in the CLNP header.
513 A packet is discarded by \fIclnp_discard()\fR. 
514 Before it
515 returns the \fImbufs\fR used to store the 
516 the discarded packet to the \fImbuf\fR free list,
517 \fIclnp_discard()\fR 
518 determines if the error report function is suppressed. 
519 If not, 
520 an ER NPDU will be sent to the originator of the discarded packet by
521 calling \fIclnp_emit_er()\fR.
523 \fIClnp_emit_er()\fR will create an ER NPDU, address it to the 
524 originator of the discarded packet, route the NPDU, 
525 and transmit it, sending the header of the discarded NPDU as data. 
526 ER NPDUs may not be segmented. 
527 If the ER NPDU is too large for the outgoing network interface, 
528 the packet is truncated.
529 .sh 2 "Raw CLNP"
531 In order to test CLNP in isolation from higher layer
532 protocols, ARGO provides a \*(lqraw\*(rq interface to CLNP.
533 This raw interface is selected with the \fISOCK_RAW\fR parameter to
535 \fIsocket()\fR
536 system call.
537 When a \*(rqraw\*(rq socket is open,
538 and CLNP receives an NPDU,
539 CLNP must determine whether the incoming NPDU is destined for
540 the 
541 \*(rqraw\*(rq interface or for the interface to the 
542 OSI transport protocol entity.
543 ARGO addresses this problem by using non-standard NPDU types
544 for packets sent on \*(rqraw\*(rq sockets.
545 The type field in the CLNP NPDU header
546 is set to \fICLNP_RAW\fR (hex 1d) rather than \fICLNP_DT\fR
547 in NPDUs that originate from 
548 \*(rqraw\*(rq sockets.
549 This non-standard type value is used by \fIclnp_input()\fR
550 to decide which upper layer protocol should receive the packet.
551 See \fIclnptest(8)\fR for more information about the.
552 \*(rqraw\*(rq CLNP interface.
553 .sh 2 "CLNP Echo"
555 In the DoD world, ICMP supports an \fIecho\fR service. 
556 This allows one to \*(lqping\*(rq a distant gateway and 
557 to receive an echo response (a packet in return) if the gateway is working.
558 There is no counterpart to \*(lqecho\*(rq in ISO 8473 (CLNP). 
559 ARGO provides this non-standard feature in its connectionless
560 network layer.
562 Like raw CLNP, implementing an echo function requires a non-standard
563 NPDU type value to allow
564 \fIclnp_input()\fR to differentiate between a DT NPDU to be forwarded
565 or passed to a higher layer protocol, and an NPDU that is to be echoed.
566 When requesting an echo, 
567 the CLNP type field is set to \fICLNP_EC\fR (hex 1E) rather
568 than CLNP_DT. 
569 When \fIclnp_input()\fR receives a packet with type
570 \fICLNP_EC\fR, 
571 it swaps the source and destination addresses, sets the
572 type field to \fICLNP_ECR\fR (hex 1F) and forwards
573 the packet back to the sender. 
574 See also \fIclnpping(8)\fR.
575 .sh 2 "Timers"
577 The only timer used by CLNP is the 
578 500 millisecond timer, which is 
579 user for reassembly lifetime control.
580 See the section \*(lqReassembly Lifetime Control.\*(rq
581 .sh 1 "End System to Intermediate System Routing Protocol (ES-IS)"
582 .\" ROB
583 .sh 2 "Overview"
585 This section describes the implementation of the ES-IS routing protocol.
586 This protocol is used primarily to resolve NSAP address to SNPA address 
587 translations. It is also used to identify end systems
588 and intermediate systems on
589 the local subnetwork. 
590 All of this work is accomplished by transmitting
591 packets of the type End System Hello (ESH), Intermediate System Hello (ISH)
592 and Request Redirect (RD).
594 For the purpose of this section, the following definitions of end system (ES)
595 and intermediate system (IS) apply.
596 .ip \(bu 5
597 An \fIend system\fR is an open system that
598 is an OSI end system in the standard OSI sense
599 (that it supports a full OSI protocol suite in addition to the network layer)
600 and that
601 implements the functions of the
602 the ES-IS protocol that are mandatory for end systems,
603 such as the Query Configuration function and the Record Redirect
604 function,
605 but that does not implement
606 the functions of the ES-IS protocol that are for intermediate systems.
607 .ip \(bu 5
608 An \fIintermediate system\fR is an open system that
609 is an OSI intermediate system in the standard OSI sense
610 (that it performs packet routing in the network layer)
611 and that
612 implements the functions of the
613 the ES-IS protocol that are mandatory for intermediate systems,
614 such as the Request Redirect function, 
615 but not the functions of the ES-IS protocol that are for end systems.
617 While system may be an ES or an IS or both according to the
618 standard OSI definitions, this is not the case in the context of
619 the ES-IS protocol.
621 An ARGO system is by default an end system, by the definitions given above.
622 An ARGO system can be made to function as an intermediate system
623 instead of an end system with the \fIclnlutil\fR program. 
624 See \fIclnlutil(8)\fR for more information.
625 .sh 2 "Report Configuration Function"
627 The report configuration function is used by end systems and intermediate
628 systems to inform each other of their reachability and current subnetwork
629 addresses. 
630 This function is invoked whenever the configuration timer
631 expires. 
632 This timer fires at a frequency of once every
633 \fIesis_config_time\fR seconds. 
634 By default, this value is 60 (seconds), 
635 but it may be changed with the \fIclnlutil\fR program.
637 The report configuration function is contained in the C function 
638 \fIesis_config()\fR. Called every \fIesis_config_time\fR seconds, 
639 \fIesis_config()\fR searches the list of active network interfaces
640 calling \fIesis_shoutput\fR for each interface that is up, has
641 broadcast ability and has an ISO address configured.
643 The function \fIesis_shoutput()\fR has the responsibility of building and 
644 transmitting ESH and ISH packets.
645 It takes several arguments, including  a pointer to a network interface
647 a packet type (ESH or ISH).
648 If the packet type is ESH, then
649 each NSAP address configured on the specified interface is added to
650 the ESH NPDU. ISH NPDUs may only contain a single NSAP address\**.
652 \** Actually, ISH packets contain Network Entity Titles (NETs). ARGO
653 does not make a distinction between NETs and NSAPs.
655 After the packet is built, it is transmitted on the subnetwork. ESH packets
656 are sent to the multicast address \fIall intermediate systems\fR, whereas
657 ISH packets are sent to the multicast address \fIall end systems\fR.
659 Each ISH and ESH NPDU contains 
660 a holding timer setting. This setting (specified 
661 in seconds) is used by the receiver of the NPDU to set its
662 holding timer. When its holding timer expires, the information from
663 the NPDU is erased. The holding timer value sent on each ISH and ESH NPDU
664 is contained in the variable \fIesis_holding_time\fR. By default, this
665 timer setting is 120 seconds. This value may be changed with the 
666 \fIclnlutil\fR utility program.
667 .sh 2 "Record Configuration Function"
669 The Record Configuration function receives ESH or ISH NPDUs, extracts the
670 configuration information, and updates kernel-resident tables. 
671 The two functions \fIesis_eshinput()\fR and \fIesis_ishinput()\fR 
672 process incoming ESH and ISH NPDUs, respectively.
674 The ES-IS entity maintains a table that
675 associates a SNPA-addresses with NSAP-addresses.
676 This table is called the \fISNPA cache\fR.
678 Whenever an ESH or ISH NPDU is received, 
679 an entry is made in the SNPA cache
680 via the \fIsnpac_add()\fR function. 
681 This entry is kept in the cache until the holding timer expires. 
682 In addition to adding an entry to the SNPA cache, \fIsnpac_add()\fR creates
683 a default ISO route toward the sender of the ISH.
684 One such route is kept so that the ES-IS entity has at most one
685 route to an IS at any time.
686 Note that ISHs from different sources will 
687 cause the route to the source of the earlier ISH to be 
688 overwritten.
689 The default route
690 will be removed when the ISH holding timer expires.
692 If, at the time an ESH or ISH NPDU is received, the SNPA cache
693 contains no entry for the NSAP address in the NPDU just received, 
694 an ESH or ISH (depending on the system type) NPDU is
695 transmitted to the sender of the NPDU just received.
696 .sh 2 "Resolving NSAP addresses to SNPA addresses: Query Configuration Function"
698 Whenever a device driver needs to resolve an NSAP address to 
699 an SNPA address, it calls \fIiso_snparesolve()\fR. This function first looks
700 up the NSAP address in the SNPA cache. If a match is found, the
701 corresponding SNPA address is returned. If a match is not found and the
702 system is an end system, and there is a known intermediate system, then
703 the SNPA address of the intermediate system is returned. It is assumed that
704 the intermediate system will forward the packet and transmit a redirect back
705 (see "Redirection Generation", below).
706 If a match is not found and the system is an end system, but there is no
707 known intermediate system, then \fIiso_snparesolve()\fR will return 
708 the multicast address \fIall end systems\fR. 
709 In all other cases, \fIiso_snparesolve()\fR will return an error.
710 This is known as the query configuration function. 
711 .sh 3 "Configuration Response Function"
713 In order for the query configuration function to be effective, the network
714 entity that receives a CLNP DT sent to the \fIall end system\fR
715 multicast address must transmit an ESH back to the sender of the DT.
716 This is called the configuration response function and is accomplished by
717 calling \fIsh_output()\fR from within \fIclnp_input()\fR.
718 .sh 2 "Redirection Generation"
720 When an intermediate system forwards a packet onto the same interface 
721 upon which 
722 the packet arrived, a redirect (RD) NPDU is generated. This NPDU is
723 transmitted by calling \fIesis_rdoutput()\fR from within \fIclnp_forward()\fR.
724 Note that end systems may forward packets but they do not generate RD PDUs.
725 .sh 2 "Redirection Receipt"
727 RD NPDUs direct an end system to create an SNPA cache entry 
728 for an NSAP address, or, if such an entry exists, to change
729 the SNPA address associated with the NSAP address.
730 The receipt of RD NPDUs is handled by \fIesis_rdinput()\fR. 
731 This function
732 parses the RD NPDU and adds an entry to the SNPA cache for the corresponding
733 destination NSAP address.
734 If the redirect is toward an intermediate system,
735 meaning that the RD NPDU contains an SNPA address
736 of an intermediate system (gateway),
737 a route is created for the destination NSAP with the intermediate system as
738 the first hop, or gateway, in the route.
739 .sh 2 "Multicast Addresses"
741 As specified by the December 1987 NBS agreements, the address
742 \fIall end systems\fR is {0x09, 0x00, 0x2B, 0x00, 0x00, x04} and the address
743 \fIall intermediate systems\fR is {0x09, 0x00, x02B, 0x00, 0x00, 0x05}. 
744 These multicast addresses are only used on the 802.3 subnetwork (baseband).
745 Broadcast addresses are used on the 802.5 subnetwork (token ring). See
746 the comment in \fC/sys/netargo/iso_snpac.c\fR for more information on 
747 multicast addresses.
748 .sh 1 "Connection Oriented Network Service and Subnetwork Service"
750 The following sections describe the design of the Connection Oriented 
751 Network Service (CONS) and the Connection Oriented Subnetwork Service
752 (COSNS).
753 The CONS and COSNS are provided by two functionally separate but related
754 modules, a connection manager and the ISO 8208 (X.25) protocols.
755 The connection manager is also known in OSI terminology as a 
756 subnetwork dependent convergence function, or SNDCF.
757 In ARGO it is used for more than an SNDCF, and it is a sort of 
758 "glue" that binds a transport service, a network service, a
759 subnetwork service, and a device driver together, so 
760 hereinafter it is called "the glue".
761 This code performs the some of the functions of ISO 8878,
762 which specifies how ISO 8208 (X.25) can be used to provide the OSI 
763 connection oriented network service.
764 The X.25 protocols are implemented in a coprocessor
765 made by Eicon Technology, Inc.
766 The device driver \fBecn\fR is the Unix kernel interface to this
767 coprocessor.
768 The sections that follow describe the glue and the \fBecn\fR device
769 driver.
770 .sh 2 "The Glue"
772 The glue provides 
773 services to several modules in the kernel:
774 .ip "Subnetwork service" 5
775 is provided to other network layer protocols, such as CLNP (ISO 8473).
776 The ARGO CLNP uses this service.  
777 The Internet IP could be made to use this service with 
778 minimal effort, because this service interface is made to look
779 like a standard Unix BSD link layer service (it has
780 a device driver interface).
781 .ip "Network service" 5
782 is provided to transport layer protocols, such as TP (ISO 8073).
783 This service interface looks like a standard Unix BSD 
784 network service (a procedure call interface).
785 .ip "Transport service" 5
786 could be provided to the socket module. 
787 While this is not provided with the ARGO software, the glue 
788 is designed to permit
789 such a service to be provided with little additional programming effort.
791 Higher layer protocols 
792 that use a connection-oriented
793 network or subnetwork service need to manage virtual
794 circuits in a similar fashion. 
795 Rather than put connection management functions into each higher
796 layer protocol (HLP) entity
797 that uses the CONS or COSNS,
798 in ARGO the connection management is in one module, the glue.
799 Other alternatives exist, for example in the OSI world,
800 one may place in the TP entity the function of connection management for TP,
801 and implement a network connection management subprotocol
802 of the transport layer (ISO 8073 DAD1, NCMS). 
803 In addition, connection management for CLNP may be implemented as part of 
804 the CLNP entity.
805 A subnetwork dependent convergence protocol (ISO 8878/A) may
806 be implemented to support connection management for CLNP.
807 The approach taken in ARGO is different from those suggested in ISO
808 for two reasons.
809 First, ARGO aims to minimize the amount of code written to perform a given
810 task.
811 Second, ARGO has several coexisting paths through the network layer,
812 which the ISO approach does not address.
813 For example, in both ISO 8878/A and in NCMS it is assumed that if
814 an incoming call arrives from NSAP \(*b 
815 while a call to NSAP \(*b is being placed,
816 the two calls are resolved to one virtual circuit.
817 This is not feasible in the ARGO scenario, since it may not be known
818 until after
819 the calls are established and higher level packets are exchanged 
820 whether the two calls are to be used
821 for the same path and for the same higher layer protocols.
822 A possible alternative approach is to use an NSAP-address for each path
823 through the network layer
824 (or protocol suite).
825 This was rejected in the ARGO design because it puts the burden
826 on the calling application entity or network entity to 
827 determine the proper NSAP-address to use to determine the protocol
828 suite to be used to reach the destination end system.
829 For this reason, none of the approaches suggested in ISO is adopted
830 here.
832 The glue provided in the ARGO
833 kernel does not provide the full OSI network service.
834 It provides that subset of the network service that is used
835 by ARGO TP and by ARGO CLNP.
836 The OSI connection-oriented network service elements that are
837 are provided are described in Chapter Four,
838 in the section titled "Connection Oriented Network Service".
840 Each module using the glue has its own service
841 interface to the glue.
842 .\" When X.25 is used as a 
843 .\"transport service, the standard protocol switch table is used, and the procedure
844 .\"\fIcons_usrreq()\fR is the protosw entry for a
845 .\"service in the iso protosw table that provides the 
846 .\"SOCK_STREAM abstraction in the AF_ISO address family,
847 .\"with protocol ISOPROTO_X25.
848 .\"This service is called XTS in the glue code and hereafter
849 .\"in this document.
850 .\".pp
851 When the transport layer uses the glue as a network service,
852 the interface is the procedure
856 tab(+);
857 l s s s.
858 error = cons_output( isop, m, len, isdgm )
860 l l l.
861  +struct isopcb +*isop;
862  +struct mbuf +*m;
863  +int+error, len, isdgm;
868 When the network layer uses the glue as a subnetwork service
869 the interface is the device driver-like procedure
873 tab(+);
874 l s s s.
875 error = cosns_output( ifp, m, dst )
877 l l l.
878  +struct ifnet +*ifp;
879  +struct mbuf +*m;
880  +struct sockaddr_iso +*dst;
881  +int+error;
886 When the glue is used as a connection-oriented service 
887 (i.e., by TP 0, and by TP 4 during the transport 
888 connection establishment phase, during which
889 it is not yet known whether class 0 or class 4 will be used)
890 the following procedures are used:
894 tab(+);
895 l s s s.
896 error = cons_openvc( copcb, dstaddr, so )
898 l l l.
899  +struct cons_pcb +*copcb;
900  +struct sockaddr_iso +*dstaddr;
901  +struct socket+*so;
903 l s s s.
904  +++
905 error = cons_netcmd( cmd, isop, vc, isdgm )
907 l l l.
908  +int+cmd;
909  +struct isopcb +*isop;
910  +int+channel, isdgm;
915 The procedure \fIcons_openvc()\fR places a call.
916 The procedure \fIcons_netcmd()\fR accepts, rejects, or clears
917 a call. 
918 There is no incoming call indication, because
919 the glue uses the passive open model for accepting calls.
920 The HLP simply sees a new incoming packet, and is given
921 a virtual circuit number (channel) along with the incoming packet.
922 If the HLP chooses to reject the call
923 it may do so, which will cause the virtual circuit (VC) to be cleared.
925 The glue may reject (clear) an incoming call for its own reasons.
926 The following table lists the reasons that the glue may
927 clear a call and the ISO 8208 diagnostic code used on the X.25 clear packet
928 in each case.
929 For a complete list of the permissible diagnostic codes, see
930 Figure 14-B of ISO 8208.
931 .in -5
934 center expand box tab(+);
935 l l.
936 Reason+Diagnosic code
938 The VC was opened for use with CLNP +Higher level initiated reset
939 or TP 4 and has been idle for the   +user resynchronization
940 maximum inactivity time.            +(0xfa)
942 The HLP closed                      +Higher level initiated disconnection
943 this network connection.            +- normal (0xf1)
945 The HLP rejected                    +Higher level initiated connection
946 this network connection.            +rejection - transient condition (0xf4)
948 The X.25 call packet contained      +Higher level initiated connection
949 facilities that are not supported   +rejection - incompatible
950 by the glue, or did not contain     +information in user data (0xf8)
951 necessary information, e.g. calling +     
952 or called DTE address.              +
954 The X.25 call packet contained      +Higher level initiated connection
955 call user data that does not        +rejection - unrecognizable protocol
956 indicate any HLP supported by ARGO  +identifier in user data
957 HLP supported by ARGO               +(0xf9)
959 The given destination               +OSI Network service problem: NSAP
960 NSAP-address is not supported       +address unknown (permanent
961                                                             +condition) (0xeb)
963 The X.25 packet or a facility       +Packet not allowed-
964 therein was too long                +packet too long. (0x27)
967 .in +5
969 The glue provides several functions common to all 
970 modules (HLPs) that use the glue.
971 Regardless of the HLP,
972 the DTE addresses and NSAP addresses are associated in the same 
973 manner.
974 One same network layer protocol identification scheme
975 (ISO PDTR 9577) for all HLPs.
976 Several different HLPs need to close inactive X.25
977 virtual circuits after a timer expires.
978 The glue insulates the 
979 device driver interface to the X.25 coprocessor 
980 from the HLP.
982 TP class 0 connections
983 .\" and the X.25 "transport service" 
984 do not share X.25 VCs
985 .\" with each other or among transport service-level circuits (sockets), 
987 .\" these two modules need to keep X.25
988 the glue needs to maintain 
989 a 1-1 correspondence between VCs
990 and sockets.
991 .\" For use by TP 0 and XTS,
992 For use by TP 0, 
993 one network-level pcb is needed for each socket, and that is a
994 \fIcons_pcb\fR, described below.
996 TP class 4 connections may share VCs, 
997 and TP 4 makes no correspondence between sockets and VCs.
998 CLNP regards VCs similarly to TP 4.
999 A given VC may be used simultaneously for many higher level connections,
1000 but all higher level connections using a given VC must use the same
1001 path or protocol suite.
1002 In other words, a TP4 connection running over CONS may not share a
1003 VC with a TP4 connection running over CLNS/COSNS.
1005 To manage VCs and to maintain the separation of sharable and non-sharable
1006 VCs, the glue uses the following protocol control block:
1010 tab(+);
1011 l s s s.
1012 struct cons_pcb {
1014 l l l.
1015  +struct isopcb+_co_isopcb;
1016 +u_short+co_state; 
1017 +u_char+co_flags; 
1018 +u_short+co_ttl;
1019 +u_short+co_init_ttl;
1020 +int+co_channel;
1021 +struct ifnet+*co_ifp;
1022 +struct protosw+*co_proto; 
1023 +struct dte_addr+co_peer_dte;
1024 +struct ifqueue+co_pending;
1027 l l s.
1028 #define co_next+_co_isopcb.isop_next
1029 #define co_prev+_co_isopcb.isop_prev
1030 #define co_head+_co_isopcb.isop_head
1031 #define co_laddr+_co_isopcb.isop_laddr
1032 #define co_faddr+_co_isopcb.isop_faddr
1033 #define co_lport+_co_isopcb.isop_laddr.siso_tsuffix
1034 #define co_fport+_co_isopcb.isop_faddr.siso_tsuffix
1035 #define co_route+_co_isopcb.isop_route
1036 #define co_socket+_co_isopcb.isop_socket
1042 The \fIcons_pcb\fR contains
1043 an \fIisopcb\fR so that TP 0 
1044 .\" and XTS 
1045 may use the routines that manipulate \fIisopcb\fR structures for allocating
1046 and 
1047 deallocating PCBs, binding addresses to PCBs,
1048 and finding routes.
1050 A CONS PCB has states CLOSED, LISTENING, CLOSING, 
1051 CONNECTING, ACKWAIT, and  OPEN.
1052 This represents the state of the VC to the degree necessary to the glue.
1053 The glue uses the passive open model for opening VCs.
1054 The coprocessor device driver always accepts
1055 incoming calls and passes an indication to the glue when
1056 a call is accepted by the coprocessor.
1057 If the user of the glue (the HLP) or the glue itself decides
1058 that the VC is not desired, the VC is cleared.
1060 The \fIcons_pcb\fR contains a bit mask, \fIco_flags\fR, with values:
1064 tab(+);
1065 l l l l.
1066 #define+CONSF_OCRE+0x40+/* created on OUTPUT */
1067 #define+CONSF_ICRE+0x20+/* created on INPUT */
1068 #define+CONSF_DGM+0x04+/* for datagram use only */
1073 The flag 
1074 CONSF_DGM means that the VC is being used to provide a
1075 datagram (connectionless, unreliable, unsequenced) 
1076 service to the higher layer, and that requests for additional VCs
1077 from the same higher layer entity
1078 may be served by this VC, effectively 
1079 multiplexing higher layer connections on this VC.
1080 When this flag is set in a \fIcons_pcb\fR, there is no associated
1081 \fIco_socket\fR pointer.
1082 When CONSF_DGM is not set, there is an associated
1083 \fIco_socket\fR pointer, and the VC is being used for
1084 TP 0.
1086 The flag 
1087 CONSF_ICRE means that the VC was created by 
1088 and incoming call indication.
1089 The flag 
1090 CONSF_OCRE means that the VC was created 
1091 on behalf of an outgoing call request.
1093 The \fIstruct dte_addr\fR field, \fIco_peer_dte\fR,
1094 contains the peer's DTE address.
1095 The glue locates VCs by searching the list of protocol control
1096 blocks for a PCB with a DTE matching that desired.
1098 The glue is given an NSAP-address by the HLP entity.
1099 The glue finds the desired DTE address by searching the
1100 ES-IS SNPA cache for an SNPA-address (DTE address) associated
1101 with the NSAP-address given by the HLP entity.
1102 This means that to use the CONS, an entry for each desired
1103 peer must appear in the SNPA cache.
1104 ARGO does not provide the ES-IS protocol for use with ISO 8208, so
1105 "permanent" or static entries must be placed in this cache by hand,
1106 using the utility program \fIclnlutil\fR.
1108 When an incoming call is accepted, the peer's DTE address is
1109 placed in the SNPA cache along with
1110 an NSAP address generated as follows:
1112 If the incoming call contained the peer's NSAP-address
1113 in an Address Extension Facility (AEF, available with 1984 X.25),
1114 this NSAP-address is used, otherwise
1116 the glue creates a "type-37" address (the format defined by AFI 37
1117 in ISO 8348/AD 2).
1119 TP 4 can have its outgoing packets sent on more than one VC.
1120 The glue presently contains no mechanism for fanning outgoing
1121 packets onto several VCs, however,
1122 it does not prohibit packets arriving for TP 4 on any VC that 
1123 opened with the protocol identifier for TP.
1125 The glue has the ability to generate AEFs on outgoing calls, but
1126 this ability is turned off,
1127 since the public data network on which ARGO runs at Wisconsin
1128 does not support 1984 X.25, and so it rejects packets containing
1129 AEFs.
1130 The use of AEFs can be reinstated by making a kernel with the 
1131 option \fBX25_1984\fR or by adding the line
1133 .in +5
1135 #define X25_1984
1137 .in -5
1139 at the top of the file
1140 \fC/sys/netargo/if_cons.c\fR
1141 and rebuilding the kernel.