|
|
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.