|
|
1.1 root 1: % run this through LaTeX with the appropriate wrapper
2:
3: \chapter {Association Control}\label{libacsap}
4: The \man libacsap(3n) library implements the Association Control Service
5: (ACS).
6: Logically,
7: one views an application to consist of several {\em application service
8: elements\/} (ASE's).
9: Although these ASEs cooperate,
10: each performs a different function for the application.
11: The Association Control Service Element (ACSE) is concerned with the task of
12: ``starting'' and ``stopping'' the network for the application.
13: That is,
14: an application uses the ACSE to establish a connection,
15: termed an {\em association}, between two users.
16: The association {\em binds\/} the two users,
17: which are referred to as
18: the {\em initiator\/} and the {\em responder}.
19: This association, once established is used by other ASEs
20: (e.g., the remote operations service element).
21: Later,
22: the ACSE is called upon to release the association,
23: either gracefully (perhaps with some negotiation),
24: or abruptly (with possible loss of information).
25:
26: Like most models of OSI services,
27: the underlying assumption is one of an asynchronous environment:
28: the service provider may generate events for the service user without the
29: latter entity triggering the actions which led to the event.
30: For example,
31: in a synchronous environment,
32: an indication that data has arrived usually occurs only when the service user
33: asks the service provider to read data;
34: in an asynchronous environment,
35: the service provider may interrupt the service user at any time to announce
36: the arrival of data.
37:
38: The \verb"acsap" module in this release presents a synchronous interface.
39: However once the association is established,
40: an asynchronous interface may be selected.
41: The \verb"acsap" module itself is naive as to the interface being used:
42: the particular application service element which is responsible for
43: transferring data will manage the association once the ACSE has established it.
44:
45: All of the routines in the \man libacsap(3n) library are integer-valued.
46: They return the manifest constant \verb"OK" on success,
47: or \verb"NOTOK" otherwise.
48: In some circumstances,
49: failures are fatal and cause (or are caused by) the association being released.
50: Section~\ref{acs:errors} describes how such failures may be distinguished.
51:
52: \section {An Important Note}\label{acs:note}
53: In the current release
54: there are several ways to establish an association.
55: This is due to recent changes in the OSI application layer,
56: and a desire to remain compatible with previous work.
57: Users are strongly encouraged to use the new facilities described herein,
58: as the older facilities will eventually be removed.
59:
60: Here are the new facilities available:
61: \[\begin{tabular}{|l|l|l|}
62: \hline
63: \multicolumn{1}{|c|}{\bf Desired Service}&
64: \multicolumn{1}{c|}{\bf Association Primitives}&
65: \multicolumn{1}{c|}{\bf Section(s)}\\
66: \hline
67: Remote Operations& {\sf A-ASSOCIATE}& \ref{acs:associations}\\
68: \ (complete discipline)&
69: {\sf A-RELEASE}& \ref{ros:underlying}\\
70: \ \cite{ISO.ROS.Service,CCITT.ROS.Service}&
71: {\sf A-ABORT}& \\[0.1in]
72: \hline
73: Remote Operations& {\sf RT-OPEN}& \ref{rts:associations}\\
74: \ (complete discipline& {\sf RT-CLOSE}& \ref{ros:underlying}\\
75: \ \ with reliable transfer)&& \\
76: \ \cite{ISO.ROS.Service,CCITT.ROS.Service}&
77: & \\[0.1in]
78: \hline
79: Reliable Transfer& {\sf RT-OPEN}& \ref{rts:associations}\\
80: \ \cite{ISO.RTS.Service,CCITT.RTS.Service}&
81: {\sf RT-CLOSE}& \\
82: \hline
83: \end{tabular}\]
84: \clearpage %%% yikes!
85:
86: Here are the old facilities available:
87: \[\begin{tabular}{|l|l|l|}
88: \hline
89: \multicolumn{1}{|c|}{\bf Desired Service}&
90: \multicolumn{1}{c|}{\bf Association Primitives}&
91: \multicolumn{1}{c|}{\bf Section}\\
92: \hline
93: Remote Operations& {\sf RO-BEGIN}& \ref{ros:old-style}\\
94: \ (basic discipline)& {\sf RO-END}& \\
95: \ \cite{ECMA.ROS}& & \\[0.1in]
96: \hline
97: Remote Operations& {\sf X.410 OPEN}& \ref{rts:old-style}\\
98: \ (advanced discipline& {\sf X.410 CLOSE}& \ref{ros:underlying}\\
99: \ \ with reliable transfer)&& \\
100: \ \cite{MHS.RTS}& & \\[0.1in]
101: \hline
102: Reliable Transfer& {\sf X.410 OPEN}& \ref{rts:old-style}\\
103: \ \cite{MHS.RTS}& {\sf X.410 CLOSE}& \\
104: \hline
105: \end{tabular}\]
106:
107: In short, depending on whether a Reliable Transfer Service Element (RTSE) is
108: desired,
109: for the purposes of association control,
110: all new applications should use either the library discussed below,
111: or the reliable transfer routines discussed in
112: Section~\ref{rts:associations} on page~\pageref{rts:associations}.
113:
114: \section {Associations}\label{acs:associations}
115: There are three aspects of association management:
116: {\em association establishment},
117: {\em association release},
118: and,
119: {\em association abort}.
120: Each of these are now described in turn.
121:
122: \subsection {Association Establishment}
123: The \man libacsap(3n) library distinguishes between the user which started an
124: association,
125: the {\em initiator},
126: and the user which was subsequently bound to the association,
127: the {\em responder}.
128: We sometimes term these two entities the {\em client\/} and the {\em server},
129: respectively.
130:
131: \subsubsection {Addresses}\label{acs:addresses}\label{acs:aei}
132: Addresses for the association control service entity consist of two parts:
133: a presentation address (as discussed in Section~\ref{psap:addresses} on
134: page~\pageref{psap:addresses} of \voltwo/),
135: and application-entity information.
136: Internally,
137: the \verb"AEInfo" is used to represent this notion:
138: \begin{quote}\index{AEInfo}\small\begin{verbatim}
139: typedef struct AEInfo {
140: PE aei_ap_title;
141: PE aei_ae_qualifier;
142:
143: int aei_ap_id;
144: int aei_ae_id;
145:
146: int aei_flags;
147: #define AEI_NULL 0x00
148: #define AEI_AP_ID 0x01
149: #define AEI_AE_ID 0x02
150: } AEInfo, *AEI;
151: #define NULLAEI ((AEI) 0)
152: \end{verbatim}\end{quote}
153: This structure contains several elements:
154: \begin{describe}
155: \item[\verb"aei\_ap\_title":] the application-process title;
156:
157: \item[\verb"aei\_ae\_qualifier":] the application-entity qualifier;
158:
159: \item[\verb"aei\_ap\_id":] the application-process invocation identifier;
160:
161: \item[\verb"aei\_ae\_id":] the application-entity invocation identifier;
162: and,
163:
164: \item[\verb"aei\_flags":] flags, indicating which, if any,
165: of the invocation-identifiers are present.
166: \end{describe}
167:
168: The routing \verb"sprintaei" can be used to return a null-terminated
169: string describing the application-entity.
170: \begin{quote}\index{sprintaei}\small\begin{verbatim}
171: char *sprintaei (aei)
172: AEI aei;
173: \end{verbatim}\end{quote}
174:
175: Finally,
176: the routine \verb"oid2aei" converts object identifiers
177: (discussed in Section~\ref{psap:oid} on page~\pageref{psap:oid})
178: and converts them to application-entity information.
179: This is used by the stub-directory service:
180: \begin{quote}\index{oid2aei}\small\begin{verbatim}
181: AEI oid2aei (oid)
182: OID oid;
183: \end{verbatim}\end{quote}
184:
185: In Figure~\ref{getFTAMentity},
186: an example of how one constructs the address for the File Transfer, Access
187: and Management (FTAM) service on host \verb"RemoteHost" is presented.
188: The key routine is \verb"_str2aei":
189: \begin{quote}\index{\_str2aei}\small\begin{verbatim}
190: AEI _str2aei (designator, qualifier, context, interactive)
191: char *designator,
192: *qualifier,
193: *context;
194: int interactive;
195: \end{verbatim}\end{quote}
196: The parameters to this procedure are:
197: \begin{describe}
198: \item[\verb"designator":] input from the user
199: (e.g., ``\verb"hubris, cs, ucl, gb"'' or ``\verb"hubris"'');
200:
201: \item[\verb"qualifier":] the service qualifier (e.g., \verb"filestore");
202:
203: \item[\verb"context":] the \verb"supportedApplicationContext" for the desired
204: service (e.g., \verb"iso ftam");
205: and;
206:
207: \item[\verb"interactive":] non-zero if the user's terminal can be queried for
208: additional information.
209: \end{describe}
210: The routine \verb"_str2aei" will first attempt to resolution using the
211: ``user-friendly nameservice'' with the \verb"designator", \verb"context", and
212: \verb"interactive" parameters.
213: If this fails,
214: the ``stub directory service'' will be used,
215: with the \verb"designator" and \verb"qualifier" parameters.
216:
217: For backwards-compatiblity,
218: a macro, \verb"str2aei" is provided which is equivalent to:
219: \begin{quote}\index{str2aei}\small\begin{verbatim}
220: _str2aei (designator, qualifier, NULLCP, 0)
221: \end{verbatim}\end{quote}
222:
223: The routine \verb"aei2addr" takes application-entity information,
224: and returns the appropriate presentation address.
225: \begin{quote}\index{aei2addr}\small\begin{verbatim}
226: struct PSAPaddr *aei2addr (aei)
227: AEI aei;
228: \end{verbatim}\end{quote}
229: \tagrind[tp]{grind2a-1}%
230: {Constructing the address for the FTAM entity}{getFTAMentity}
231:
232: \subsubsection {Address Encodings}\label{addr:encodings}
233: It may be useful to encode a presentation address for viewing.
234: Although a consensus for a standard way of doing this has not yet been
235: reached,
236: the routines \verb"paddr2str" and \verb"str2paddr" may be used in the interim.
237: These implement the encodings defined in \cite{String.Addresses}.
238: The BNF syntax for this encoding is shown in Figure~\ref{str:format} on
239: page~\pageref{str:format}.
240: \begin{quote}\index{paddr2str}\small\begin{verbatim}
241: char *paddr2str (pa, na)
242: struct PSAPaddr *pa;
243: struct NSAPaddr *na;
244: \end{verbatim}\end{quote}
245: The parameters to this procedure are:
246: \begin{describe}
247: \item[\verb"pa":] the presentation address;
248: and,
249:
250: \item[\verb"na":] a network address to use instead of the network addresses
251: in the \verb"pa" parameter
252: (use the manifest constant \verb"NULLNA" otherwise).
253: \end{describe}
254: If \verb"paddr2str" fails,
255: it returns the manifest constant \verb"NULLCP".
256:
257: The routine \verb"str2paddr" takes an ascii string encoding and
258: returns a
259: presentation address.
260: \begin{quote}\index{str2paddr}\small\begin{verbatim}
261: struct PSAPaddr *str2paddr (str)
262: char *str;
263: \end{verbatim}\end{quote}
264: The parameter to this procedure is:
265: \begin{describe}
266: \item[\verb"str":] the ascii string.
267: \end{describe}
268: If \verb"str2paddr" fails,
269: it returns the manifest constant \verb"NULLPA".
270: \tagrind[tp]{grind2a-2f}{BNF Syntax for paddr2str/str2paddr}{str:format}
271: \tagrind[tp]{grind2a-2g}{BNF Syntax for paddr2str/str2paddr (continued)}\empty
272:
273: \verb"paddr2str" is really a macro which calls the routine \verb"_paddr2str":
274: \begin{quote}\index{\_paddr2str}\small\begin{verbatim}
275: char *_paddr2str (pa, na, compact)
276: struct PSAPaddr *pa;
277: struct NSAPaddr *na;
278: int compact;
279: \end{verbatim}\end{quote}
280: The parameters to this procedure are:
281: \begin{describe}
282: \item[\verb"pa":] the presentation address;
283:
284: \item[\verb"na":] a network address to use instead of the network addresses
285: in the \verb"pa" parameter
286: (use the manifest constant \verb"NULLNA" otherwise);
287: and,
288:
289: \item[\verb"compact":] indicates the style of encoding.
290: \end{describe}
291: If \verb"compact" is greater than zero,
292: then the encoding reflects a normalized network address.
293: This is useful for passing to arbitrary processes in the network.
294: If \verb"compact" is less than zero,
295: then the encoding reflects the BNF in Figure~\ref{str:format},
296: without any macro substitutions.
297: If \verb"compact" is equal to zero (which is what \verb"paddr2str" uses),
298: then the encoding reflects the above BNF with macro substitutions.
299:
300: The routine \verb"pa2str" takes a presentation address and returns a
301: null-ter\-mi\-na\-ted ascii string suitable for viewing:
302: \begin{quote}\index{pa2str}\begin{verbatim}
303: char *pa2str (pa)
304: struct PSAPaddr *pa;
305: \end{verbatim}\end{quote}
306: The parameter to this procedure is:
307: \begin{describe}
308: \item[\verb"pa"]: the presentation address to be printed.
309: \end{describe}
310:
311: \subsubsection {Server Initialization}
312: The \man tsapd(8c) daemon,
313: upon accepting a connection from an initiating host,
314: consults the ISO services database to determine which program
315: on the local system implements the desired application context.
316:
317: Once the program has been ascertained,
318: the daemon runs the program with any arguments listed in the database.
319: In addition,
320: it appends some {\em magic arguments\/} to the argument vector.
321: Hence,
322: the very first action performed by the responder is to re-capture the ACSE
323: state contained in the magic arguments.
324: This is done by calling the routine \verb"AcInit",
325: which on a successful return,
326: is equivalent to a {\sf A-ASSOCIATE.INDICATION\/} event from the association
327: control service provider.
328: \begin{quote}\index{AcInit}\small\begin{verbatim}
329: int AcInit (vecp, vec, acs, aci)
330: int vecp;
331: char **vec;
332: struct AcSAPstart *acs;
333: struct AcSAPindication *aci;
334: \end{verbatim}\end{quote}
335: The parameters to this procedure are:
336: \begin{describe}
337: \item[\verb"vecp":] the length of the argument vector;
338:
339: \item[\verb"vec":] the argument vector;
340:
341: \item[\verb"acs":] a pointer to an \verb"AcSAPstart" structure,
342: which is updated only if the call succeeds;
343: and,
344:
345: \item[\verb"aci":] a pointer to an \verb"AcSAPindication" structure,
346: which is updated only if the call fails.
347: \end{describe}
348: If \verb"AcInit" is successful,
349: it returns information in the \verb"acs" parameter,
350: which is a pointer to an \verb"AcSAPstart" structure.
351: \begin{quote}\index{AcSAPstart}\small\begin{verbatim}
352: struct AcSAPstart {
353: int acs_sd;
354:
355: OID acs_context;
356:
357: AEInfo acs_callingtitle;
358: AEInfo acs_calledtitle;
359:
360: struct PSAPstart acs_start;
361:
362: int acs_ninfo;
363: PE acs_info[NACDATA];
364: };
365: \end{verbatim}\end{quote}
366: The elements of this structure are:\label{AcSAPstart}
367: \begin{describe}
368: \item[\verb"acs\_sd":] the association-descriptor to be used to reference
369: this association;
370:
371: \item[\verb"acs\_context":] the application context name;
372:
373: \item[\verb"acs\_callingtitle":] information on the calling application-entity
374: (if any);
375:
376: \item[\verb"acs\_calledtitle":] information on the called application-entity
377: (if any);
378:
379: \item[\verb"acs\_start":] an \verb"PSAPstart" structure
380: (consult page~\pageref{PSAPstart} of \voltwo/);
381: and,
382:
383: \item[\verb"acs\_info"/\verb"acs\_ninfo":] any initial data
384: (and the length of that data).
385: \end{describe}
386: Note that the proposed contexts list in the \verb"acs_start" element will
387: contain a context for the ACSE.
388: The routine \verb"AcFindPCI" can be used to determine the PCI being used by
389: the ACSE:
390: \begin{quote}\index{AcFindPCI}\small\begin{verbatim}
391: int AcFindPCI (sd, pci, aci)
392: int sd;
393: int *pci;
394: struct AcSAPindication *aci;
395: \end{verbatim}\end{quote}
396: The parameters to this procedure are:
397: \begin{describe}
398: \item[\verb"sd":] the association-descriptor;
399:
400: \item[\verb"pci":] a pointer to an integer location,
401: which is updated only if the call succeeds;
402: and,
403:
404: \item[\verb"aci":] a pointer to an \verb"AcSAPindication" structure,
405: which is updated only if the call fails.
406: \end{describe}
407:
408: Further,
409: note that the data contained in the structure was allocated via \man malloc(3),
410: and should be released by using the \verb"ACSFREE" macro when no longer
411: referenced.
412: The \verb"ACSFREE" macro,
413: behaves as if it was defined as:\label{ACSFREE}
414: \begin{quote}\index{ACSFREE}\small\begin{verbatim}
415: void ACSFREE (acs)
416: struct AcSAPstart *acs;
417: \end{verbatim}\end{quote}
418: The macro frees only the data allocated by \verb"AcInit",
419: and not the \verb"AcSAPstart" structure itself.
420: Further,
421: \verb"ACSFREE" should be called only if the call to the \verb"AcInit"
422: routine returned \verb"OK".
423:
424: If the call to \verb"AcInit" is not successful,
425: then a {\sf A-P-ABORT.INDICATION\/} event is simulated,
426: and the relevant information is returned in an encoded
427: \verb"AcSAPindication" structure.\label{AcSAPindication}
428: \begin{quote}\index{AcSAPindication}\small\begin{verbatim}
429: struct AcSAPindication {
430: int aci_type;
431: #define ACI_FINISH 0x00
432: #define ACI_ABORT 0x01
433:
434: union {
435: struct AcSAPfinish aci_un_finish;
436: struct AcSAPabort aci_un_abort;
437: } aci_un;
438: #define aci_finish aci_un.aci_un_finish
439: #define aci_abort aci_un.aci_un_abort
440: };
441: \end{verbatim}\end{quote}
442: As shown, this structure is really a discriminated union
443: (a structure with a tag element followed by a union).
444: Hence, on a failure return,
445: one first coerces a pointer to the \verb"AcSAPabort" structure contained
446: therein,
447: and then consults the elements of that structure.
448: \begin{quote}\index{AcSAPabort}\small\begin{verbatim}
449: struct AcSAPabort {
450: int aca_source;
451:
452: int aca_reason;
453:
454: int aca_ninfo;
455: PE aca_info[NACDATA];
456:
457: #define ACA_SIZE 512
458: int aca_cc;
459: char aca_data[ACA_SIZE];
460: };
461: \end{verbatim}\end{quote}
462: The elements of an \verb"AcSAPabort" structure are:
463: \begin{describe}
464: \item[\verb"aca\_source":] the source of the abort, one of:
465: \[\begin{tabular}{|l|l|}
466: \hline
467: \multicolumn{1}{|c|}{\bf Value}&
468: \multicolumn{1}{c|}{\bf Source}\\
469: \hline
470: \tt ACA\_USER& service-user (peer)\\
471: \tt ACA\_PROVIDER& service-provider\\
472: \tt ACA\_LOCAL& local ACPM\\
473: \hline
474: \end{tabular}\]
475:
476: \item[\verb"aca\_reason":] the reason for the provider-initiated abort
477: (meaningful only if \verb"aca_source" is not \verb"ACA_REQUESTOR"),
478: consult Table~\ref{AcSAPreasons};
479:
480: \item[\verb"aca\_info"/\verb"aca\_ninfo":] any abort data
481: (and the length of that data) from the peer
482: (if \verb"aca_source" is \verb"ACA_USER");
483: and,
484:
485: \item[\verb"aca\_data"/\verb"aca\_cc":] a diagnostic string from the provider.
486: \end{describe}
487: \tagtable[tp]{2a-1}{AcSAP Failure Codes}{AcSAPreasons}
488: Note that the data contained in the structure was allocated via \man malloc(3),
489: and should be released by using the \verb"ACAFREE" macro when no longer
490: referenced.
491: The \verb"ACAFREE" macro,
492: behaves as if it was defined as:\label{ACAFREE}
493: \begin{quote}\index{ACAFREE}\small\begin{verbatim}
494: void ACAFREE (aca)
495: struct AcSAPabort *aca;
496: \end{verbatim}\end{quote}
497: The macro frees only the data contained in the structure,
498: and not the \verb"AcSAPabort" structure itself.
499:
500: After examining the information returned by \verb"AcInit" on a successful call
501: (and possibly after examining the argument vector),
502: the responder should either accept or reject the association.
503: For either response,
504: the responder should use the \verb"AcAssocResponse" routine
505: (which corresponds to the {\sf A-ASSOCIATE.RESPONSE\/} action).
506: \begin{quote}\index{AcAssocResponse}\small\begin{verbatim}
507: int AcAssocResponse (sd, status, reason, context,
508: respondtitle, respondaddr, ctxlist, defctxresult,
509: prequirements, srequirements, isn, settings, ref,
510: data, ndata, aci)
511: int sd;
512: int status,
513: reason;
514: OID context;
515: AEI respondtitle;
516: struct PSAPaddr *respondaddr;
517: int prequirements,
518: srequirements,
519: settings,
520: ndata;
521: long isn;
522: struct PSAPctxlist *ctxlist;
523: int defctxresult;
524: struct SSAPref *ref;
525: PE *data;
526: struct AcSAPindication *aci;
527: \end{verbatim}\end{quote}
528: The parameters to this procedure are:\label{AcAssocResponse}
529: \begin{describe}
530: \item[\verb"sd":] the association-descriptor;
531:
532: \item[\verb"status":] the acceptance indicator
533: (either \verb"ACS_ACCEPT" if the association is to be accepted,
534: or one of the user-initiated rejection codes listed in
535: Table~\ref{AcSAPreasons} on page~\pageref{AcSAPreasons});
536:
537: \item[\verb"reason":] the diagnostic
538: (either \verb"ACS_USER_NULL" if the association is to be accepted,
539: or one of the user-initiated diagnostic codes listed in
540: Table~\ref{AcSAPdiagnostics} on page~\pageref{AcSAPdiagnostics});
541:
542: \item[\verb"context":] the application context to be used over the
543: association (defaults to the context proposed);
544:
545: \item[\verb"respondtitle":] information on the responding application-entity
546: (optional);
547:
548: \item[\verb"data"/\verb"ndata":] an array of user data
549: (and the number of elements in that array,
550: consult the warning on page~\pageref{AcSAPdata});
551: and,
552:
553: \item[\verb"aci":] a pointer to an \verb"AcSAPindication" structure,
554: which is updated only if the call fails.
555: \end{describe}
556: The remaining parameters are for the presentation service,
557: consult the description of the \verb"PConnResponse" routine on
558: page~\pageref{PConnResponse} of \voltwo/.
559: \tagtable[tp]{2a-2}{AcSAP Diagnostic Codes}{AcSAPdiagnostics}
560:
561: If the call to \verb"AcAssocResponse" is successful,
562: and the \verb"status" parameter is set to \verb"ACS_ACCEPT",
563: then association establishment has now been completed.
564: If the call is successful,
565: but the \verb"status" parameter is not \verb"ACS_ACCEPT",
566: then the association has been rejected and the responder may exit.
567: Otherwise,
568: if the call failed and the reason is ``fatal'',
569: then the association is lost.
570:
571: \subsubsection {Client Initialization}
572: A program wishing to associate itself with another application-level user
573: calls the \verb"AcAssocRequest" routine,
574: which corresponds to the user taking the {\sf A-ASSOCIATE.REQUEST\/} action.
575: \begin{quote}\index{AcAssocRequest}\small\begin{verbatim}
576: int AcAssocRequest (context, callingtitle, calledtitle,
577: callingaddr, calledaddr, ctxlist, defctxname,
578: prequirements, srequirements, isn, settings, ref,
579: data, ndata, qos, acc, aci)
580: OID context;
581: AEI callingtitle,
582: calledtitle;
583: struct PSAPaddr *callingaddr,
584: *calledaddr;
585: int prequirements,
586: srequirements,
587: settings,
588: ndata;
589: long isn;
590: struct PSAPctxlist *ctxlist;
591: OID defctxname;
592: struct SSAPref *ref;
593: PE *data;
594: struct QOStype *qos;
595: struct AcSAPconnect *acc;
596: struct AcSAPindication *aci;
597: \end{verbatim}\end{quote}
598: The parameters to this procedure are:\label{AcAssocRequest}
599: \begin{describe}
600: \item[\verb"context":] the application context to be used over the
601: association;
602:
603: \item[\verb"callingtitle":] information on the calling application-entity
604: (use the manifest constant \verb"NULLAEI" if not specified);
605:
606: \item[\verb"calledtitle":] information on the called application-entity
607: (use the manifest constant \verb"NULLAEI" if not specified);
608:
609: \item[\verb"data"/\verb"ndata":] an array of initial data
610: (and the number of elements in that array,
611: consult the warning on page~\pageref{AcSAPdata});
612:
613: \item[\verb"qos":] the quality of service on the connection
614: (see Section~\ref{tsap:qos} in \voltwo/);
615:
616: \item[\verb"acc":] a pointer to an \verb"AcSAPconnect" structure,
617: which is updated only if the call succeeds;
618: and,
619:
620: \item[\verb"aci":] a pointer to an \verb"AcSAPindication" structure,
621: which is updated only if the call fails.
622: \end{describe}
623: The remaining parameters are for the presentation service,
624: consult the description of the \verb"PConnRequest" routine on
625: page~\pageref{PConnRequest} of \voltwo/ for additional information.
626: Note that the \verb"ctxlist" parameter is mandatory:
627: the association control service element will look for the ACSE PCI there.
628: If not present,
629: it will add the PCI to the list.
630:
631: If the call to \verb"AcAssocRequest" is successful
632: (the {\sf A-ASSOCIATE.CON\-FIR\-MA\-TION\/} event occurs),
633: it returns information in the \verb"acc" parameter
634: which is a pointer to an \verb"AcSAPconnect" structure.
635: \begin{quote}\index{AcSAPconnect}\small\begin{verbatim}
636: struct AcSAPconnect {
637: int acc_sd;
638:
639: int acc_result;
640: int acc_diagnostic;
641:
642: OID acc_context;
643:
644: AEInfo acc_respondtitle;
645:
646: struct PSAPconnect acc_connect;
647:
648: int acc_ninfo;
649: PE acc_info[NACDATA];
650: };
651: \end{verbatim}\end{quote}
652: The elements of an \verb"AcSAPconnect" structure are:\label{AcSAPconnect}
653: \begin{describe}
654: \item[\verb"acc\_sd":] the association-descriptor to be used to reference
655: this association;
656:
657: \item[\verb"acc\_result"/\verb"acc\_diagnostic":] the association response
658: and diagnostic;
659:
660: \item[\verb"acc\_context":] the application context name;
661:
662: \item[\verb"acc\_respondtitle":] information on the responding
663: application-entity (if any);
664:
665: \item[\verb"acc\_connect":] an \verb"PSAPconnect" structure
666: (consult page~\pageref{PSAPconnect} of \voltwo/);
667: and,
668:
669: \item[\verb"acc\_info"/\verb"acc\_ninfo":] any initial data
670: (and the length of that data).
671: \end{describe}
672: Note that the negotiated contexts list in the \verb"acc_connect" element
673: will contain a context for the ACSE.
674: To determine the PCI for the ACSE context,
675: the routine \verb"AcFindPCI" routine,
676: described above can be used.
677:
678: If the call to \verb"AcAssocRequest" is successful,
679: and the \verb"acc_result" element is set to \verb"ACC_ACCEPT",
680: then association establishment has completed.
681: If the call is successful,
682: but the \verb"acc_result" element is not \verb"ACC_ACCEPT",
683: then the association attempt has been rejected;
684: consult Table~\ref{AcSAPreasons} on page~\pageref{AcSAPreasons}
685: and Table~\ref{AcSAPdiagnostics} on page~\pageref{AcSAPdiagnostics}
686: to determine the reason for the rejection
687: (further information can be found in the \verb"aci" parameter).
688: Otherwise, if the call fails then the association is not established and
689: the \verb"AcSAPabort" structure of the \verb"AsCAPindication" discriminated
690: union has been updated.
691:
692: Note that the data contained in the structure was allocated via \man malloc(3),
693: and should be released by using the \verb"ACCFREE" macro when no longer
694: referenced.
695: The \verb"ACCFREE" macro,
696: behaves as if it was defined as:\label{ACCFREE}
697: \begin{quote}\index{ACCFREE}\small\begin{verbatim}
698: void ACCFREE (acc)
699: struct AcSAPconnect *acc;
700: \end{verbatim}\end{quote}
701: The macro frees only the data allocated by \verb"AcAssocRequest",
702: and not the \verb"AcSAPconnect" structure itself.
703: Further,
704: \verb"ACCFREE" should be called only if the call to the \verb"AcAssocRequest"
705: routine returned \verb"OK".
706:
707: Normally \verb"AcAssocRequest" returns only after an association has succeeded
708: or failed.
709: This is termed a {\em synchronous\/} association initiation.
710: If the user desires, an {\em asynchronous\/} association may be initiated.
711: This routine is really a macro which calls the routine
712: \verb"AcAsynAssocRequest" with an argument indicating that a association should
713: be attempted synchronously.
714: \begin{quote}\index{AcAsynAssocRequest}\small\begin{verbatim}
715: int AcAsynAssocRequest (context, callingtitle, calledtitle,
716: callingaddr, calledaddr, ctxlist, defctxname,
717: prequirements, srequirements, isn, settings, ref,
718: data, ndata, qos, acc, aci, async)
719: OID context;
720: AEI callingtitle,
721: calledtitle;
722: struct PSAPaddr *callingaddr,
723: *calledaddr;
724: int prequirements,
725: srequirements,
726: settings,
727: ndata,
728: async;
729: long isn;
730: struct PSAPctxlist *ctxlist;
731: OID defctxname;
732: struct SSAPref *ref;
733: PE *data;
734: struct QOStype *qos;
735: struct AcSAPconnect *acc;
736: struct AcSAPindication *aci;
737: \end{verbatim}\end{quote}
738: The additional parameter to this procedure is:
739: \begin{describe}
740: \item[\verb"async":] whether the association should be initiated
741: asynchronously.
742: \end{describe}
743: If the \verb"async" parameter is non-zero,
744: then \verb"AcAsynAssocRequest" returns one of four values:
745: \verb"NOTOK", which indicates that the association request failed;
746: \verb"DONE", which indicates that the association request succeeded;
747: or, either of \verb"CONNECTING_1" or \verb"CONNECTING_2", which indicates that
748: the connection request is still in
749: progress.
750: In the first two cases,
751: the usual procedures for handling return values from \verb"AcAssocRequest" are
752: employed
753: (i.e., a \verb"NOTOK" return from \verb"AcAsynAssocRequest" is equivalent to a
754: \verb"NOTOK" return from \verb"AcAssocRequest", and,
755: a \verb"DONE" return from \verb"AcAsynAssocRequest" is equivalent to a
756: \verb"OK" return from \verb"AcAssocRequest").
757:
758: In the final case, when either \verb"CONNECTING_1" or
759: \verb"CONNECTING_2" is returned,
760: only the \verb"acc_sd" element of the \verb"acc" parameter has been updated;
761: it reflects the association-descriptor to be used to reference this
762: association.
763: To determine when the association attempt has been completed,
764: the routine \verb"xselect" (consult Section~\ref{acs:select})
765: should be used after calling \verb"PSelectMask".
766: In order to determine if the association attempt is successful,
767: the routine \verb"AcAsynRetryRequest" is called:
768: \begin{quote}\index{AcAsynRetryRequest}\small\begin{verbatim}
769: int AcAsynRetryRequest (sd, acc, aci)
770: int sd;
771: struct AcSAPconnect *acc;
772: struct AcSAPindication *aci;
773: \end{verbatim}\end{quote}
774: The parameters to this procedure are:
775: \begin{describe}
776: \item[\verb"sd":] the association-descriptor;
777:
778: \item[\verb"acc":] a pointer to an \verb"AcSAPconnect" structure, which is
779: updated only if the call succeeds;
780: and,
781:
782: \item[\verb"aci":] a pointer to an \verb"AcSAPindication" structure, which is
783: updated only if the call fails.
784: \end{describe}
785: Again, one of three values are returned:
786: \verb"NOTOK", which indicates that the association request failed;
787: \verb"DONE", which indicates that the association request succeeded;
788: and, \verb"CONNECTING_1" or \verb"CONNECTING_2" which indicates that
789: the connection request is still in progress.
790:
791: Refer to Section~\ref{tsap:async} on page~\pageref{tsap:async} in \voltwo/
792: for information on how to make efficient use of the asynchronous connection
793: facility.
794:
795: \subsection {Association Release}
796: The \verb"AcRelRequest" routine is used to request the release of an
797: association,
798: and corresponds to a {\sf A-RELEASE.REQUEST\/} action.
799: \begin{quote}\index{AcRelRequest}\small\begin{verbatim}
800: int AcRelRequest (sd, reason, data, ndata, secs, acr, aci)
801: int sd;
802: int reason;
803: PE *data;
804: int ndata;
805: int secs;
806: struct AcSAPrelease *acr;
807: struct AcSAPindication *aci;
808: \end{verbatim}\end{quote}
809: The parameters to this procedure:
810: \begin{describe}
811: \item[\verb"sd":] the association-descriptor;
812:
813: \item[\verb"reason":] the reason why the association should be released,
814: one of:
815: \[\begin{tabular}{|l|l|}
816: \hline
817: \multicolumn{1}{|c|}{\bf Value}&
818: \multicolumn{1}{c|}{\bf Reason}\\
819: \hline
820: \tt ACF\_NORMAL& normal\\
821: \tt ACF\_URGENT& urgent\\
822: \tt ACF\_UNDEFINED& undefined\\
823: \hline
824: \end{tabular}\]
825:
826: \item[\verb"data"/\verb"ndata":] an array of final data
827: (and the number of elements in that array,
828: consult the warning on page~\pageref{AcSAPdata});
829:
830: \item[\verb"secs":] the maximum number of seconds to wait for a response
831: (use the manifest constant \verb"NOTOK" if no time-out is desired);
832:
833: \item[\verb"acr":] a pointer to an \verb"AcSAPrelease" structure,
834: which is updated only if the call succeeds;
835: and,
836:
837: \item[\verb"aci":] a pointer to an \verb"AcSAPindication" structure,
838: which is updated only if the call fails.
839: \end{describe}
840: If the call to \verb"AcRelRequest" is successful,
841: then this corresponds to a {\sf A-RELEASE.CONFIRMATION\/} event,
842: and it returns information in the \verb"acr" parameter,
843: which is a pointer to an \verb"AcSAPrelease" structure.
844: \begin{quote}\index{AcSAPrelease}\small\begin{verbatim}
845: struct AcSAPrelease {
846: int acr_affirmative;
847:
848: int acr_reason;
849:
850: int acr_ninfo;
851: PE acr_info[NACDATA];
852: };
853: \end{verbatim}\end{quote}
854: The elements of this structure are:\label{AcSAPrelease}
855: \begin{describe}
856: \item[\verb"acr\_affirmative":] the acceptance indicator;
857:
858: \item[\verb"acr\_reason":] the reason for the indicator,
859: one of:
860: \[\begin{tabular}{|l|l|}
861: \hline
862: \multicolumn{1}{|c|}{\bf Value}&
863: \multicolumn{1}{c|}{\bf Reason}\\
864: \hline
865: \tt ACR\_NORMAL& normal\\
866: \tt ACR\_NOTFINISHED& not finished\\
867: \tt ACR\_UNDEFINED& undefined\\
868: \hline
869: \end{tabular}\]
870:
871: \item[\verb"acr\_info"/\verb"acr\_ninfo":] any final data
872: (and the length of that data).
873: \end{describe}
874: Note that the data contained in the structure was allocated via \man malloc(3),
875: and should be released by using the \verb"ACRFREE" macro when no longer
876: referenced.
877: The \verb"ACRFREE" macro,
878: behaves as if it was defined as:\label{ACRFREE}
879: \begin{quote}\index{ACRFREE}\small\begin{verbatim}
880: void ACRFREE (acr)
881: struct AcSAPrelease *acr;
882: \end{verbatim}\end{quote}
883: The macro frees only the data allocated by \verb"AcRelRequest",
884: and not the \verb"AcSAPrelease" structure itself.
885: Further,
886: \verb"ACRFREE" should be called only if the call to the \verb"AcRelRequest"
887: routine returned \verb"OK".
888:
889: If the call to \verb"AcRelRequest" is successful,
890: and the \verb"acr_affirmative" element is set,
891: then the association has been released.
892: If the call is successful,
893: but the \verb"acr_affirmative" element is not set (i.e., zero),
894: then the request to release the association has been rejected by the remote
895: user,
896: and the association is still established.
897: Otherwise the \verb"AcSAPabort" element of the \verb"AcSAPindication"
898: parameter \verb"aci" contains the reason for failure.
899:
900: Note that if a non-negative value is given to the \verb"secs" parameter and a
901: response is not received within this number of seconds,
902: then the value contained in the \verb"aca_reason" element is \verb"ACS_TIMER".
903: The user can then call the routine \verb"AcRelRetryRequest" to continue waiting
904: for a response:
905: \begin{quote}\index{AcRelRetryRequest}\small\begin{verbatim}
906: int AcRelRetryRequest (sd, secs, acr, aci)
907: int sd;
908: int secs;
909: struct AcSAPrelease *acr;
910: struct AcSAPindication *aci;
911: \end{verbatim}\end{quote}
912: The parameters to this procedure are:
913: \begin{describe}
914: \item[\verb"sd":] the association-descriptor;
915:
916: \item[\verb"secs":] the maximum number of seconds to wait for a response
917: (use the manifest constant \verb"NOTOK" if no time-out is desired);
918:
919: \item[\verb"acr":] a pointer to a \verb"AcSAPrelease" structure, which is
920: updated only if the call succeeds;
921: and,
922:
923: \item[\verb"aci":] a pointer to a \verb"AcSAPindication" structure, which is
924: updated only if the call fails.
925: \end{describe}
926: If the call to \verb"AcRelRetryRequest" is successful,
927: and the \verb"acr_affirmative" element is set,
928: then the association has been closed.
929: If the call is successful,
930: but the \verb"acr_affirmative" element is not set (i.e., zero),
931: then the request to release the assocation has been rejected by the remote
932: user, and the association is still open.
933: Otherwise the \verb"AcSAPabort" structure contained in
934: the \verb"AcSAPindication" parameter
935: \verb"aci" contains the reason for failure.
936: As expected,
937: the value \verb"ACS_TIMER" indicates that no response was received within the
938: time given by the \verb"secs" parameter.
939:
940: Upon receiving a {\sf A-RELEASE.INDICATION\/} event,
941: the user is required to generate a {\sf A-RELEASE.RESPONSE\/} action
942: using the \verb"AcRelResponse" routine.
943: \begin{quote}\index{AcRelResponse}\small\begin{verbatim}
944: int AcRelResponse (sd, status, reason, data, ndata, aci)
945: int sd;
946: int status,
947: reason;
948: PE *data;
949: int ndata;
950: struct AcSAPindication *aci;
951: \end{verbatim}\end{quote}
952: The parameters to this procedure:
953: \begin{describe}
954: \item[\verb"sd":] the association-descriptor;
955:
956: \item[\verb"status":] the acceptance indicator
957: (either \verb"ACS_ACCEPT" if the association is to be released,
958: or \verb"ACS_REJECT" otherwise);
959:
960: \item[\verb"reason":] the reason for the indicator,
961: one of:
962: \[\begin{tabular}{|l|l|}
963: \hline
964: \multicolumn{1}{|c|}{\bf Value}&
965: \multicolumn{1}{c|}{\bf Reason}\\
966: \hline
967: \tt ACR\_NORMAL& normal\\
968: \tt ACR\_NOTFINISHED& not finished\\
969: \tt ACR\_UNDEFINED& undefined\\
970: \hline
971: \end{tabular}\]
972:
973: \item[\verb"data"/\verb"ndata":] an array of final data
974: (and the number of elements in that array,
975: consult the warning on page~\pageref{AcSAPdata});
976: and,
977:
978: \item[\verb"aci":] a pointer to an \verb"AcSAPindication" structure,
979: which is updated only if the call fails.
980: \end{describe}
981: If the call to \verb"AcRelResponse" is successful,
982: and if the \verb"result" parameter is set to \verb"ACS_ACCEPT",
983: then the association has been released.
984: If the call is successful,
985: but the \verb"result" parameter is not \verb"ACS_ACCEPT",
986: then the association remains established.
987:
988: \subsection {Association Abort}
989: To unilaterally abort an association,
990: the routine \verb"AcUAbortRequest" routine is used
991: which corresponds to the {\sf A-ABORT.REQUEST\/} action.
992: \begin{quote}\index{AcUAbortRequest}\small\begin{verbatim}
993: int AcUAbortRequest (sd, data, ndata, aci)
994: int sd;
995: PE *data;
996: int ndata;
997: struct AcSAPindication *aci;
998: \end{verbatim}\end{quote}
999: The parameters to this procedure:
1000: \begin{describe}
1001: \item[\verb"sd":] the association-descriptor;
1002:
1003: \item[\verb"data"/\verb"ndata":] an array of abort data
1004: (and the number of elements in that array,
1005: consult the warning on page~\pageref{AcSAPdata});
1006: and,
1007:
1008: \item[\verb"aci":] a pointer to an \verb"AcSAPindication" structure,
1009: which is updated only if the call fails.
1010: \end{describe}
1011: If the call to \verb"AcUAbortRequest" is successful,
1012: then the association is immediately released,
1013: and any data queued for the association may be lost.
1014:
1015: \section {Association Events}
1016: Typically,
1017: the presentation service generates events which lead to the
1018: {\sf A-RELEASE.INDICATION}, {\sf A-ABORT.INDICATION},
1019: and {\sf A-P-ABORT.IN\-DI\-CA\-TION\/} events being raised.
1020: For those interested in writing application service elements which interpret
1021: this information,
1022: this section describes the necessary mappings.
1023:
1024: \subsection {Release Indication}
1025: Upon receiving a {\sf P-RELEASE.INDICATION\/} event,
1026: the routine \verb"AcFINISHser" should be called to map this into a
1027: {\sf A-RELEASE.INDICATION\/} event.
1028: \begin{quote}\index{AcFINISHser}\small\begin{verbatim}
1029: int AcFINISHser (sd, pf, aci)
1030: int sd;
1031: struct PSAPfinish *pf;
1032: struct AcSAPindication *aci;
1033: \end{verbatim}\end{quote}
1034: The parameters to this procedure:
1035: \begin{describe}
1036: \item[\verb"sd":] the association-descriptor;
1037:
1038: \item[\verb"pa":] a pointer to an \verb"PSAPfinish" structure,
1039: containing information on the presentation-level release;
1040: and,
1041:
1042: \item[\verb"aci":] a pointer to an \verb"AcSAPindication" structure.
1043: \end{describe}
1044: If the call to \verb"AcFINISHser" is successful,
1045: then the \verb"aci_type" field of the \verb"aci" parameter contains the value
1046: \verb"ACI_FINISH",
1047: and an \verb"AcSAPfinish" structure is contained inside the \verb"aci"
1048: parameter.
1049: \begin{quote}\index{AcSAPfinish}\small\begin{verbatim}
1050: struct AcSAPfinish {
1051: int acf_reason;
1052:
1053: int acf_ninfo;
1054: char acf_info[NACDATA];
1055: };
1056: \end{verbatim}\end{quote}
1057: The elements of this structure are:
1058: \begin{describe}
1059: \item[\verb"acf\_reason":] the reason for the release request,
1060: one of:
1061: \[\begin{tabular}{|l|l|}
1062: \hline
1063: \multicolumn{1}{|c|}{\bf Value}&
1064: \multicolumn{1}{c|}{\bf Reason}\\
1065: \hline
1066: \tt ACF\_NORMAL& normal\\
1067: \tt ACF\_URGENT& urgent\\
1068: \tt ACF\_UNDEFINED& undefined\\
1069: \hline
1070: \end{tabular}\]
1071:
1072: \item[\verb"acf\_info"/\verb"acf\_ninfo":] any final data
1073: (and the length of that data).
1074: \end{describe}
1075: Note that the data contained in the structure was allocated via \man malloc(3),
1076: and should be released by using the \verb"ACFFREE" macro when no longer
1077: referenced.
1078: The \verb"ACFFREE" macro,
1079: behaves as if it was defined as:\label{ACFFREE}
1080: \begin{quote}\index{ACFFREE}\small\begin{verbatim}
1081: void ACFFREE (acf)
1082: struct AcSAPfinish *acf;
1083: \end{verbatim}\end{quote}
1084: The macro frees only the data allocated by \verb"AcFINISHser",
1085: and not the \verb"AcSAPfinish" structure itself.
1086: Further,
1087: \verb"ACFFREE" should be called only if the call to the \verb"AcFINISHser"
1088: routine returned \verb"OK".
1089:
1090: Otherwise,
1091: if the call fails,
1092: the \verb"aci" parameter contains information pertaining to the failure.
1093:
1094: \subsection {Abort Indication}
1095: Upon receiving a {\sf P-U-ABORT.INDICATION\/} or {\sf P-P-ABORT.INDICATION\/}
1096: event,
1097: the routine \verb"AcABORTser" should be called to map this into a
1098: {\sf A-ABORT.INDICATION\/} or {\sf A-P-ABORT.INDICATION\/} event.
1099: \begin{quote}\index{AcABORTser}\small\begin{verbatim}
1100: int AcABORTser (sd, pa, aci)
1101: int sd;
1102: struct PSAPabort *pa;
1103: struct AcSAPindication *aci;
1104: \end{verbatim}\end{quote}
1105: The parameters to this procedure:
1106: \begin{describe}
1107: \item[\verb"sd":] the association-descriptor;
1108:
1109: \item[\verb"pa":] a pointer to an \verb"PSAPabort" structure,
1110: containing information on the presentation-level abort;
1111: and,
1112:
1113: \item[\verb"aci":] a pointer to an \verb"AcSAPindication" structure.
1114: \end{describe}
1115: If the call to \verb"AcABORTser" is successful,
1116: then the \verb"aci" parameter is updated to reflect information on the abort
1117: indication.
1118: Otherwise,
1119: if the call fails,
1120: the \verb"aci" parameter contains information pertaining to the failure.
1121:
1122: \section {Select Facility}\label{acs:select}
1123: Ideally,
1124: the \man select(2) system call should be used on all descriptors,
1125: regardless of the level of abstraction
1126: (e.g., association-descriptor, presentation-descriptor, and so on).
1127: The routines with a \verb"SelectMask" suffix,
1128: such as \verb"PSelectMask"
1129: are supplied to determine if there are already queued events.
1130: These routines should always be called prior to using the select facility
1131: of the kernel.
1132: Sadly, some networking subsystems used by the software do not support
1133: \man select(2).
1134: To provide a consistent interface,
1135: the \verb"xselect" routine should be used instead of \man select(2).
1136: \begin{quote}\index{xselect}\small\begin{verbatim}
1137: int xselect (nfds, rfds, wfds, efds, secs)
1138: int nfds;
1139: fd_set *rfds,
1140: *wfds,
1141: *efds,
1142: secs;
1143: \end{verbatim}\end{quote}
1144: The parameters to this procedure are:
1145: \begin{describe}
1146: \item[\verb"nfds":] the number of descriptors present in the masks
1147: (actually the \verb"width" of descriptors from zero to the highest meaningful
1148: descriptor);
1149:
1150: \item[\verb"rfds"/\verb"wfds"/\verb"efds":] the locations of
1151: masks interested in read, write, and exception events;
1152: and,
1153:
1154: \item[\verb"secs":] the maximum number of seconds to wait for an event
1155: (a value of \verb"NOTOK" indicates that the call should block indefinitely,
1156: whereas a value of \verb"OK" indicates that the call should not block at all,
1157: e.g., a polling action).
1158: \end{describe}
1159: Unlike most routines,
1160: the \verb"xselect" routine returns one of several values:
1161: \verb"NOTOK" (on failure),
1162: \verb"OK" (if no events occurred within the time limit),
1163: or,
1164: the number of descriptors on which events occurred
1165: (the masks are updated appropriately).
1166:
1167: \section {Generic Server Dispatch}\label{acs:server}
1168: Ideally,
1169: one should write a server which can operate in one of two modes:
1170: \begin{itemize}
1171: \item Each incoming connection results in \man tsapd(8c) invoking another
1172: instance of the server; or,
1173:
1174: \item All incoming connections are given to exactly one instance of the
1175: server (the server is invoked without arguments during system
1176: initialization).
1177: \end{itemize}
1178: The choice as to which mode is used is made by the system administrator.
1179: By default,
1180: the first mode, termed the {\em dynamic\/} approach, is used.
1181: The second mode, termed the {\em static\/} approach,
1182: is described in Section~\ref{static:services} on
1183: page~\pageref{static:services}.
1184:
1185: There are several ways in which this dual-approach scheme can be realized.
1186: One such implementation is based on the routine
1187: \verb"isodeserver".\label{isodeserver}
1188: \begin{quote}\index{isodeserver}\small\begin{verbatim}
1189: int isodeserver (argc, argv, aei, initfnx, workfnx,
1190: losefnx, td)
1191: int argc;
1192: char **argv;
1193: AEI aei;
1194: IFP initfnx,
1195: workfnx,
1196: losefnx;
1197: struct TSAPdisconnect *td;
1198: \end{verbatim}\end{quote}
1199: The parameters to this procedure are:
1200: \begin{describe}
1201: \item[\verb"argc":] the length of the argument vector which the program was
1202: invoked with;
1203:
1204: \item[\verb"argv":] the argument vector which the program was invoked with;
1205:
1206: \item[\verb"aei":] the information on the application-entity offering the
1207: service;
1208:
1209: \item[\verb"initfnx":] the address of an event-handler routine to be invoked
1210: when a new connection arrives;
1211:
1212: \item[\verb"workfnx":] the address of an event-handler routine to be invoked
1213: when activity occurs on an association;
1214:
1215: \item[\verb"losefnx":] the address of an event-handler routine to be invoked
1216: if \verb"TNetAccept" (described in Section~\ref{tsap:listen}) fails
1217: and,
1218:
1219: \item[\verb"td":] a pointer to an \verb"TSAPdisconnect" structure,
1220: which is updated only if the call fails.
1221: \end{describe}
1222: If the call is successful,
1223: then the program may terminate immediately,
1224: as no work remains to be done
1225: (in the case of the single instance mode,
1226: \verb"isodeserver" returns only on error).
1227: Otherwise,
1228: the \verb"td" parameter indicates the reason for failure
1229: (consult Section~\ref{TSAPdisconnect} on page~\pageref{TSAPdisconnect}
1230: of \voltwo/).
1231:
1232: When an event associated with a new connection occurs,
1233: the event-handler routine is invoked with two parameters:
1234: \begin{quote}\small\begin{verbatim}
1235: (*initfnx) (vecp, vec);
1236: int vecp;
1237: char **vec;
1238: \end{verbatim}\end{quote}
1239: The parameters are:
1240: \begin{describe}
1241: \item[\verb"vecp":] the length of the argument vector;
1242: and,
1243:
1244: \item[\verb"vec":] the argument vector.
1245: \end{describe}
1246: The event-handler should then call \verb"AcInit" with these parameters
1247: to achieve an {\sf A-ASSOCIATION.INDICATION\/} event.
1248: If \verb"AcInit" is successful,
1249: the event-handler should decide if it wishes to honor the association
1250: and then call \verb"AcAssocResponse" with the appropriate parameters.
1251: The event-handler should return the assocation-descriptor if it accepted the
1252: association.
1253: Otherwise (or upon any errors),
1254: it should return \verb"NOTOK".
1255:
1256: When an activity associated with an association occurs,
1257: the event-handler routine is invoked with one parameter:
1258: \begin{quote}\small\begin{verbatim}
1259: (*workfnx) (fd);
1260: int fd;
1261: \end{verbatim}\end{quote}
1262: The parameter is:
1263: \begin{describe}
1264: \item[\verb"fd":] the association-descriptor of the association.
1265: \end{describe}
1266: The event-handler should then call the appropriate routine to read the next
1267: event from the association
1268: (e.g., \verb"RoWaitRequest" if remote operations are being used).
1269: The event-handler should return \verb"NOTOK" if the association is terminated
1270: or aborted,
1271: or \verb"OK" otherwise.
1272:
1273: The \verb"isodeserver" routine uses the \verb"TNetAccept" routine to
1274: wait for the next event on existing associations and for new connections.
1275: It is possible, though unlikely for a failure to occur during this operation.
1276: In this event,
1277: the event-handler routine is invoked with one parameter:
1278: \begin{quote}\small\begin{verbatim}
1279: (*losefnx) (td);
1280: struct TSAPdisconnect *td;
1281: \end{verbatim}\end{quote}
1282: The parameter is:
1283: \begin{describe}
1284: \item[\verb"td":] a pointer to an \verb"TSAPdisconnect" structure updated
1285: by \verb"TNetAccept".
1286: \end{describe}
1287: The event-handler should handle the error however it deems proper
1288: (usually by logging it and then returning).
1289:
1290: An example of this facility is presented in Section~\ref{acs:example} below.
1291:
1292: Another interface to this approach is provided for servers that may be
1293: engaged in other operations besides answering incoming calls (e.g.
1294: initiating outgoing calls too). This interface provides indentical
1295: functionality to the \verb|isodeserver| interface, but allows access
1296: to other events.
1297:
1298: The interface is provided by two calls. The first is \verb|iserver_init|.
1299: \begin{quote}\index{iserver\_init}\small\begin{verbatim}
1300: int iserver_init (argc, argv, aei, initfnx, td)
1301: int argc;
1302: char **argv;
1303: AEI aei;
1304: IFP initfnx;
1305: struct TSAPdisconnect *td;
1306: \end{verbatim}\end{quote}
1307:
1308: The parameters to this procedure are similar in part to the
1309: \verb|isodeserver| procedure:
1310: \begin{describe}
1311: \item[\verb|argc|:] the length of the argument vector which the
1312: program was invoked with;
1313:
1314: \item[\verb|argv|:] the argument vector which the program was
1315: invoked with;
1316:
1317: \item[\verb|aei|:] the information on the application-entity
1318: offering the service;
1319:
1320: \item[\verb"initfnx":] the address of an event-handler routine to be invoked
1321: when a new connection arrives, and
1322:
1323: \item[\verb|td|:] a pointer to an \verb"TSAPdisconnect" structure,
1324: which is updated only if the call fails.
1325: \end{describe}
1326:
1327: This procedure registers a listener for the address and may may call
1328: the \verb|initfnx| if the server is running in dynamic mode. If the
1329: call fails the \verb|td| parameter will indicate the reason for
1330: failure.
1331:
1332: One this function has been called, the \verb|iserver_wait| procedure
1333: should be called at regular intervals to handle incoming events,
1334: typically in a loop of some kind. It is called as follows:
1335: \begin{quote}\index{iserver\_wait}\small\begin{verbatim}
1336: int iserver_wait (initfnx, workfnx, losefnx, nfds,
1337: nfds, rfds, wfds, efds, secs, td)
1338: IFP initfnx,
1339: workfnx,
1340: losefnx;
1341: int nfds;
1342: fd_set *rfds,
1343: *wfds,
1344: *efds;
1345: int secs;
1346: struct TSAPdisconnect *td;
1347: \end{verbatim}\end{quote}
1348: The parameters to this procedure are:
1349: \begin{describe}
1350:
1351: \item[\verb"initfnx":] the address of an event-handler routine to be invoked
1352: when a new connection arrives;
1353:
1354: \item[\verb"workfnx":] the address of an event-handler routine to be invoked
1355: when activity occurs on an association;
1356:
1357: \item[\verb"losefnx":] the address of an event-handler routine to be invoked
1358: if \verb"TNetAccept" (described in Section~\ref{tsap:listen}) fails;
1359:
1360: \item[\verb|nfds/rfds/wfds/efds|:] additional
1361: association-descriptors/file descriptors to await for activity on;
1362:
1363: \item[\verb|secs|:] the maximum number of seconds to wait for
1364: activity (a value of \verb|NOTOK| indicates that the call should block
1365: indefinitely, whereas a value of \verb|OK| indicates that the call
1366: should not block at all, e.g., a polling action); and
1367:
1368: \item[\verb"td":] a pointer to an \verb"TSAPdisconnect" structure,
1369: which is updated only if the call fails.
1370: \end{describe}
1371:
1372: This routine calls the \verb|TNetAccept| routine to wait for incoming
1373: calls. It will call the procedures \verb|initfnx|, \verb|workfnx| and
1374: \verb|losefnx| in an indetical way to the \verb|isodeserver|. The
1375: routine returns on a number of conditions.
1376: \begin{itemize}
1377: \item If one of the supplied association/file descriptors registers
1378: activity the procedure returns with the mask updated.
1379:
1380: \item If an incoming association occurs. It should be accepted or
1381: rejected by the \verb|initfnx| then the procedure will return.
1382:
1383: \item If some activity happens on one of the accepted calls. This is
1384: handled by the \verb|workfnx| then the procedure will return.
1385:
1386: \item If the time given runs out, the procedure will return.
1387: \end{itemize}
1388:
1389: An outline usage of these procedures might be something like:
1390: \begin{quote}\small\begin{verbatim}
1391: if (iserver_init (argc, argv, aei, ros_init, td) == NOTOK)
1392: /* error */
1393: for (;;) {
1394: /* set up descriptors */
1395: switch (iserver_wait (ros_init, ros_work, ros_lose, nfds,
1396: &rfds, &wfds, NULLFD, timeout, td)) {
1397: case DONE:
1398: exit (0);
1399:
1400: case NOTOK:
1401: /* error */
1402:
1403: case OK:
1404: /* check fds for activitiy, do other things */
1405: }
1406: \end{verbatim}\end{quote}
1407:
1408:
1409: Please note that \verb"isodeserver" and \verb|iserver_wait| implement
1410: one possible discipline for association management. Many others are
1411: possible, depending on the needs of the service being provided.
1412: Further, note that while the text above and the example below are
1413: expressed in terms of association control (i.e., they make use of
1414: \verb"AcInit" and \verb"AcAssocResponse"), this facility will provide
1415: similar support at any other layer in the system (e.g.,
1416: \verb"isodeserver" can be used for transport or session entities).
1417:
1418: Also note that as these routines use the \verb|TNetAccept| routines,
1419: child process are collected automatically. If you wish to start child
1420: processes and wait for their exit status, you should take note of the
1421: warnings associated with the \verb|TNetAccept| procedure (see
1422: Section~\ref{tsap:accept} on page~\pageref{tsap:accept} of \voltwo/).
1423:
1424: \section {Restrictions on User Data}\label{AcSAPdata}
1425: To quote the \cite{ISO.ACS.Service} specification:
1426: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
1427: \bf NOTE:& Use of the services $\ldots$ may be subject to some
1428: constraints from (the) session services until work on
1429: providing unlimited length user data field parameters
1430: on session primitives is completed.
1431: \end{tabular}}\]
1432:
1433: \section {Error Conventions}\label{acs:errors}
1434: All of the routines in this library return the manifest constant \verb"NOTOK"
1435: on error,
1436: and also update the \verb"aci" parameter given to the routine.
1437: The \verb"aci_abort" element of the \verb"AcSAPindication" structure encodes
1438: the reason for the failure.
1439: One coerces the pointer to an \verb"AcSAPabort" structure,
1440: and consults the \verb"aca_reason" element of this latter structure.
1441: This element can be given as a parameter to the routine \verb"AcErrString"
1442: which returns a null-terminated diagnostic string.
1443: \begin{quote}\index{AcErrString}\small\begin{verbatim}
1444: char *AcErrString (c)
1445: int c;
1446: \end{verbatim}\end{quote}
1447: The \verb"" macro can be used to determine if the failure is fatal
1448: (the association has been lost).
1449: \begin{quote}\index{ACS\_FATAL}\small\begin{verbatim}
1450: int ACS_FATAL(r)
1451: int r;
1452: \end{verbatim}\end{quote}
1453: For protocol purists,
1454: the \verb"ACS_OFFICIAL" macro can be used to determine if the error is an
1455: ``official'' error as defined by the specification,
1456: or an ``unofficial'' error used by the implementation.
1457: \begin{quote}\index{ACS\_OFFICIAL}\small\begin{verbatim}
1458: int ACS_OFFICIAL (r)
1459: int r;
1460: \end{verbatim}\end{quote}
1461:
1462: \section {Compiling and Loading}
1463: Programs using the \man libacsap(3n) library should include
1464: \verb"<isode/acsap.h>".
1465: The programs should also be loaded with \verb"-lisode".
1466:
1467: \section {An Example}\label{acs:example}
1468: One example of the use of the \man libacsap(3n) library is found in
1469: Section~\ref{ros:example:server} on page~\pageref{ros:example:server}.
1470: This example is straight-forward in presenting the interaction of association
1471: control and remote operations.
1472: Now let's consider how to rewrite the server to use the facilities described
1473: above in Section~\ref{acs:server}.
1474: Instead of using an asynchronous interface,
1475: a synchronous interface will be employed.
1476: Only Figure~\ref{initROSresponder} from the example in
1477: Section~\ref{ros:example:server} need be changed.
1478:
1479: We assume that there are three exception-logging routines:
1480: {\em fatal}, which prints a diagnostic and terminates the process;
1481: {\em error}, which prints a diagnostic and then executes the statement
1482: \begin{quote}\small\begin{verbatim}
1483: longjmp (toplevel, NOTOK);
1484: \end{verbatim}\end{quote}
1485: and,
1486: {\em warn}, which simply prints a diagnostic.
1487:
1488: In Figure~\ref{doROSserver},
1489: the replacement routines are shown.
1490: First, the application-entity title for the service is deteremined.
1491: The routine \verb"isodeserver" is then called with its requisite arguments.
1492: If the routine fails, the process terminates after printing a diagnostic.
1493: Otherwise the process exits.
1494: In the case where the \man tsapd(8c) daemon invokes a new instance of
1495: the server each time an incoming connection is received,
1496: \verb"isodeserver" will return after that assocation has been released.
1497: In the case where all incoming connections are given to a single
1498: instance of the server,
1499: then \verb"isodeserver" returns only if a fatal error is detected.
1500:
1501: The routine \verb"ros_init" is called for each incoming connection.
1502: First, the ACSE state is re-captured by calling \verb"AcInit".
1503: If this succeeds,
1504: then any command line arguments are parsed.
1505: These arguments are present only if the server was invoked by
1506: the \man tsapd(8c) daemon,
1507: and are specified in the \man isoservices(5) file described in
1508: Chapter~\ref{isoservices} of \voltwo/.
1509: Assuming that the responder is satisfied with the proposed association,
1510: the routine then calls \verb"AcAssocResponse" to accept the association.
1511: Then,
1512: \verb"RoSetService" is called
1513: to set the underlying service to be used for remote operations.
1514: Finally,
1515: the association-descriptor is returned to \verb"isodeserver".
1516:
1517: The routine \verb"ros_work" is called when activity occurs on an association.
1518: The routine sets a global return vector using \man setjmp (3)
1519: and then calls \verb"RoWaitRequest" to read the next indication.
1520: This usually results in the routine \verb"ros_indication"
1521: (found in Figure~\ref{doROSresponder} on page~\pageref{doROSresponder})
1522: being called.
1523: If the association was not released,
1524: then \verb"ros_work" returns \verb"OK".
1525: Otherwise if some error occurred,
1526: use of the routine \verb"error" will cause control to return to the
1527: \verb"setjmp" call.
1528: In this case,
1529: \verb"AcUAbortRequest" is called to make sure that the association is
1530: (ungracefully) released,
1531: then \verb"NOTOK" is returned to \verb"isodeserver".
1532:
1533: The routine \verb"ros_lose" simply logs the failure of \verb"TNetAccept" when
1534: called from \verb"isodeserver".
1535: {\let\small=\scriptsize %%% yikes!
1536: \clearpage
1537: \tagrind[tp]{grind2a-2a}{The generic ROS server}{doROSserver}
1538: \clearpage
1539: \tagrind[tp]{grind2a-2b}{The generic ROS server (continued)}\empty
1540: \clearpage
1541: \tagrind[tp]{grind2a-2c}{The generic ROS server (continued)}\empty
1542: \clearpage
1543: \tagrind[tp]{grind2a-2d}{The generic ROS server (continued)}\empty}
1544:
1545: \section {For Further Reading}
1546: The ISO specification for association control services is defined in
1547: \cite{ISO.ACS.Service}.
1548: The corresponding protocol definition is \cite{ISO.ACS.Protocol}.
1549:
1550: %%% \section {Changes Since the Last Release}\label{acsap:changes}
1551: %%% A brief summary of the major changes between v~\acsaprevrsn/ and
1552: %%% v~\acsapvrsn/ are now presented.
1553: %%% These are the user-visible changes only;
1554: %%% changes of a strictly internal nature are not discussed.
1555:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.