|
|
1.1 ! root 1: % run this through LaTeX with the appropriate wrapper ! 2: ! 3: \chapter {Presentation Services}\label{libpsap2} ! 4: The \man libpsap2(3n) library implements the presentation service. ! 5: The kernel subset of the ISO specification is currently implemented. ! 6: That is, ! 7: the library supports whatever session requirements the user wishes to ! 8: employ, ! 9: negotiates presentation contexts on connection establishments, ! 10: and utilizes abstract transfer notations to transmit data structures in a ! 11: machine-independent manner. ! 12: ! 13: As with most models of OSI services, ! 14: the underlying assumption is one of a symmetric, asynchronous environment. ! 15: That is, ! 16: although peers exist at a given layer, ! 17: one does not necessary view a peer as either a client or a server. ! 18: Further, ! 19: the service provider may generate events for the service user without the ! 20: latter entity triggering the actions which led to the event. ! 21: For example, ! 22: in a synchronous environment, ! 23: an indication that data has arrived usually occurs only when the service user ! 24: asks the service provider to read data; ! 25: in an asynchronous environment, ! 26: the service provider may interrupt the service user at any time to announce ! 27: the arrival of data. ! 28: ! 29: The \verb"psap2" module in this release initially uses a client/server ! 30: paradigm to start communications. ! 31: Once the connection is established, ! 32: a symmetric view is taken. ! 33: In addition, ! 34: initially the interface is synchronous; ! 35: however once the connection is established, ! 36: an asynchronous interface may be selected. ! 37: ! 38: All of the routines in the \man libpsap2(3n) library are integer-valued. ! 39: They return the manifest constant \verb"OK" on success, ! 40: or \verb"NOTOK" otherwise. ! 41: ! 42: \section {Warning} ! 43: Please read the following important message. ! 44: \[\fbox{\begin{tabular}{lp{0.8\textwidth}} ! 45: \bf NOTE:& Readers of this chapter should have an intimate understanding ! 46: of the OSI presentation and session services. ! 47: It is not the intent of this ! 48: chapter to present a tutorial on these services, so novice ! 49: users will suffer greatly if they choose to read further. ! 50: \end{tabular}}\] ! 51: ! 52: \section {Addresses}\label{psap:addresses} ! 53: Addresses at the presentation service access point are represented by the ! 54: \verb"PSAPaddr" structure. ! 55: \begin{quote}\index{PSAPaddr}\small\begin{verbatim} ! 56: struct PSAPaddr { ! 57: struct SSAPaddr pa_addr; ! 58: ! 59: #define PSSIZE 64 ! 60: int pa_selectlen; ! 61: char pa_selector[PSSIZE]; ! 62: }; ! 63: #define NULLPA ((struct PSAPaddr *) 0) ! 64: \end{verbatim}\end{quote} ! 65: This structure contains two elements: ! 66: \begin{describe} ! 67: \item[\verb"pa\_addr":] the session address, ! 68: as described in Section~\ref{ssap:addresses} on page~\pageref{ssap:addresses}; ! 69: and, ! 70: ! 71: \item[\verb"pa\_selector"/\verb"pa\_selectlen":] the presentation selector, ! 72: as described in the \man isoservices(5) database in Chapter~\ref{isoservices}, ! 73: for the service provider \verb"psap". ! 74: \end{describe} ! 75: ! 76: In Figure~\ref{getAPprovider}, ! 77: an example of how one constructs the PSAP address for the LOOP provider on ! 78: host \verb"RemoteHost" is presented. ! 79: The routine \verb"is2paddr" takes a host and service, ! 80: and then consults the \man isoentities(5) file described in ! 81: Chapter~\ref{isoentities} of \volone/ to construct a presentation ! 82: address. ! 83: \begin{quote}\index{is2paddr}\small\begin{verbatim} ! 84: struct PSAPaddr *is2paddr (host, service, is) ! 85: char *host, ! 86: *service; ! 87: struct isoservent *is; ! 88: \end{verbatim}\end{quote} ! 89: \tagrind[tp]{grind5a-1}{Constructing the PSAP address for the LOOP provider}% ! 90: {getAPprovider} ! 91: ! 92: \subsection {Calling Address} ! 93: Certain users of the presentation service ! 94: (e.g., the reliable transfer service) ! 95: need to know the name of the local host when they initiate a connection. ! 96: The routine \verb"PLocalHostName" has been provided for this reason. ! 97: \begin{quote}\index{PLocalHostName}\small\begin{verbatim} ! 98: char *PLocalHostName () ! 99: \end{verbatim}\end{quote} ! 100: ! 101: \section {Connection Establishment} ! 102: Until the connection has been fully established, ! 103: the implementation distinguishes between clients and servers, ! 104: which are more properly referred to as {\em initiators\/} and ! 105: {\em responders}, to use OSI terminology. ! 106: ! 107: \subsection {Connection Negotiation} ! 108: From the user's perspective, ! 109: there are several parameters which are negotiated by the presentation providers ! 110: during connection establishment. ! 111: Suggestions as to the values of some of these parameters are made by the user. ! 112: ! 113: \subsubsection {Session Parameters} ! 114: Consult Section~\ref{ssap:negotiation} for a list of session parameters which ! 115: are negotiated during connection establishment. ! 116: ! 117: \subsubsection {Presentation Contexts}\label{psap:context} ! 118: A {\em presentation context\/} is a binding between an abstract syntax ! 119: notation and an abstract transfer notation on a ! 120: presentation connection, ! 121: and is denoted by an integer value termed the context identifier. ! 122: The abstract syntax notation describes, ! 123: to the users of the presentation service, ! 124: the data structures being exchanged; ! 125: the abstract transfer notation describes, ! 126: to the providers of the presentation services, ! 127: the method for encoding those data structures in a machine-independent fashion. ! 128: Hence the abstract syntax notation is negotiated by the users of the ! 129: presentation service, ! 130: while the abstract transfer notation is negotiated by the providers of that ! 131: service. ! 132: ! 133: When a connection is established, ! 134: the initiator suggests zero or more presentation contexts, ! 135: specifying a context identifier (an odd-valued integer), ! 136: and the abstract syntax ! 137: (a pointer to an object identifier, see Section~\ref{psap:oid} of \volone/). ! 138: The provider selects the abstract transfer notation ! 139: (in the current implementation, this is always ASN.1\cite{ISO.PP.Encoding}). ! 140: When the a {\sf P-CONNECT.INDICATION\/} event is given to the responder, ! 141: in addition ! 142: indicating the context identifier and abstract syntax information, ! 143: the provider also indicates if it is willing to support this presentation ! 144: context. ! 145: If so, the responder decides if it will accept or reject the context. ! 146: This information is then propagated back to the initiator with ! 147: the {\sf P-CONNECT.CONFIRMATION\/} indication. ! 148: ! 149: \subsection {Server Initialization} ! 150: The \man tsapd(8c) daemon, ! 151: upon accepting a connection from an initiating host, ! 152: consults the ISO services database to determine which program ! 153: on the local system implements the desired SSAP entity. ! 154: In the case of the presentation service, ! 155: the \pgm{tsapd} program contains the bootstrap for the presentation provider. ! 156: The daemon will again consult the ISO services database to determine which ! 157: program on the system implements the desired PSAP entity. ! 158: ! 159: Once the program has been ascertained, ! 160: the daemon runs the program with any arguments listed in the database. ! 161: In addition, ! 162: it appends some {\em magic arguments\/} to the argument vector. ! 163: Hence, ! 164: the very first action performed by the responder is to re-capture the PSAP ! 165: state contained in the magic arguments. ! 166: This is done by calling the routine \verb"PInit", ! 167: which on a successful return, ! 168: is equivalent to a {\sf P-CONNECT.INDICATION\/} from the presentation service ! 169: provider. ! 170: \begin{quote}\index{PInit}\small\begin{verbatim} ! 171: int PInit (vecp, vec, ps, pi) ! 172: int vecp; ! 173: char **vec; ! 174: struct PSAPstart *ps; ! 175: struct PSAPindication *pi; ! 176: \end{verbatim}\end{quote} ! 177: The parameters to this procedure are: ! 178: \begin{describe} ! 179: \item[\verb"vecp":] the length of the argument vector; ! 180: ! 181: \item[\verb"vec":] the argument vector; ! 182: ! 183: \item[\verb"ps":] a pointer to a \verb"PSAPstart" structure, which is updated ! 184: only if the call succeeds; ! 185: and, ! 186: ! 187: \item[\verb"pi":] a pointer to a \verb"PSAPindication" structure, which is ! 188: updated only if the call fails. ! 189: \end{describe} ! 190: If \verb"PInit" is successful, ! 191: it returns information in the \verb"ps" parameter, ! 192: which is a pointer to a \verb"PSAPstart" structure. ! 193: \begin{quote}\index{PSAPstart}\small\begin{verbatim} ! 194: struct PSAPstart { ! 195: int ps_sd; ! 196: ! 197: struct PSAPaddr ps_calling; ! 198: struct PSAPaddr ps_called; ! 199: ! 200: struct PSAPctxlist ps_ctxlist; ! 201: ! 202: OID ps_defctx; ! 203: int ps_defctxresult; ! 204: ! 205: int ps_prequirements; ! 206: ! 207: int ps_srequirements; ! 208: int ps_settings; ! 209: long ps_isn; ! 210: ! 211: struct SSAPref ps_connect; ! 212: ! 213: int ps_ssdusize; ! 214: ! 215: struct QOStype ps_qos; ! 216: ! 217: #define NPDATA 10 ! 218: int ps_ninfo; ! 219: PE ps_info[NPDATA]; ! 220: }; ! 221: \end{verbatim}\end{quote} ! 222: The elements of this structure are:\label{PSAPstart} ! 223: \begin{describe} ! 224: \item[\verb"ps\_sd":] the presentation-descriptor to be used to reference this ! 225: connection; ! 226: ! 227: \item[\verb"ps\_calling":] the address of the peer initiating the connection; ! 228: ! 229: \item[\verb"ps\_called":] the address of the peer being asked to respond; ! 230: ! 231: \item[\verb"ps\_ctxlist":] the proposed list of presentation contexts; ! 232: ! 233: \item[\verb"ps\_defctx"/\verb"ps\_defctxresult":] the default context ! 234: for the presentation connection ! 235: (and the presentation provider's response); ! 236: ! 237: \item[\verb"ps\_prequirements":] the proposed presentation requirements; ! 238: ! 239: \item[\verb"ps\_srequirements":] the proposed session requirements; ! 240: ! 241: \item[\verb"ps\_settings":] the initial token settings; ! 242: ! 243: \item[\verb"ps\_isn":] the initial serial-number; ! 244: ! 245: \item[\verb"ps\_connect":] the connection identifier (a.k.a. SSAP reference) ! 246: used by the initiator; ! 247: ! 248: \item[\verb"ps\_ssdusize":] the largest atomic SSDU size that can be used on ! 249: the connection (see the note on page~\pageref{SSDU:atomic}); ! 250: ! 251: \item[\verb"ps\_qos":] the quality of service on the connection ! 252: (see Section~\ref{tsap:qos}); ! 253: and, ! 254: ! 255: \item[\verb"ps\_info"/\verb"ps\_ninfo":] an array of initial data ! 256: (and the number of elements in that array). ! 257: \end{describe} ! 258: Note that the \verb"ps_info" element is allocated via \man malloc(3) and ! 259: should be released using the \verb"PSFREE" macro when no longer referenced. ! 260: The \verb"PSFREE" macro behaves as if it was defined as: ! 261: \begin{quote}\index{PSFREE}\small\begin{verbatim} ! 262: void PSFREE (ps) ! 263: struct PSAPstart *ps; ! 264: \end{verbatim}\end{quote} ! 265: The macro frees only the data allocated by \verb"PInit", ! 266: and not the \verb"PSAPstart" structure itself. ! 267: Further, ! 268: \verb"PSFREE" should be called only if the call to the \verb"PInit" ! 269: routine returned \verb"OK". ! 270: ! 271: The \verb"ps_connect" element is a \verb"SSAPref" structure, ! 272: which is passed transparently by the presentation service. ! 273: Consult the description on page~\pageref{SSAPref}. ! 274: There are two routines of interest in the \man libpsap2(3n) that deal with ! 275: these structures: ! 276: The \verb"addr2ref" routine takes a string (presumably a hostname), ! 277: determines the current UT time, ! 278: and returns a pointer to a \verb"SSAPref" structure appropriately initialized ! 279: to denote this information. ! 280: \begin{quote}\index{addr2ref}\small\begin{verbatim} ! 281: struct SSAPref *addr2ref (addr) ! 282: char *addr; ! 283: \end{verbatim}\end{quote} ! 284: This routine might fail if it is unable to allocate a small amount of ! 285: memory. ! 286: In this event, it returns the manifest constant \verb"NULL". ! 287: The routine \verb"sprintref" can be used to return a null-terminated string ! 288: describing the SSAP reference. ! 289: \begin{quote}\index{sprintref}\small\begin{verbatim} ! 290: char *sprintref (sr) ! 291: struct SSAPref *sr; ! 292: \end{verbatim}\end{quote} ! 293: ! 294: The \verb"ps_ctxlist" element is a \verb"PSAPctxlist" structure, ! 295: which describes the presentation contexts the initiator wishes to use. ! 296: \begin{quote}\index{PSAPctxlist}\small\begin{verbatim} ! 297: struct PSAPctxlist { ! 298: int pc_nctx; ! 299: ! 300: #define NPCTX 5 ! 301: ! 302: struct PSAPcontext { ! 303: int pc_id; ! 304: OID pc_asn; ! 305: OID pc_atn; ! 306: int pc_result; ! 307: } pc_ctx[NPCTX]; ! 308: }; ! 309: #define NULLPC ((struct PSAPctxlist *) 0) ! 310: \end{verbatim}\end{quote} ! 311: The elements of this structure are:\label{PSAPctxlist} ! 312: \begin{describe} ! 313: \item[\verb"pc\_ctx"/\verb"pc\_nctx":] the presentation contexts described ! 314: (and the number of contexts which may not exceed \verb"NPCTX" elements). ! 315: For each presentation context: ! 316: \begin{describe} ! 317: \item[\verb"pc\_id":] the identifier (or handle) for the context; ! 318: ! 319: \item[\verb"pc\_asn":] the abstract syntax notation to be used on the ! 320: context; ! 321: ! 322: \item[\verb"pc\_atn":] the transfer syntax notation to be used on the ! 323: context (this field is usually, \verb"NULLOID", only the initiator, ! 324: when it wishes to inform the presentation service of the transfer ! 325: syntax to use, is permitted to specify this); and, ! 326: ! 327: \item[\verb"pc\_result":] the presentation provider's response ! 328: (codes are listed in Table~\ref{PSAPreasons}). ! 329: \end{describe} ! 330: \end{describe} ! 331: ! 332: If the call to the \verb"PInit" routine is not successful, ! 333: then a {\sf P-P-ABORT.IN\-DI\-CA\-TION\/} event is simulated, ! 334: and the relevant information is returned in a \verb"PSAPindication" ! 335: structure.\label{PSAPindication} ! 336: \begin{quote}\index{PSAPindication}\small\begin{verbatim} ! 337: struct PSAPindication { ! 338: int pi_type; ! 339: #define PI_DATA 0x00 ! 340: #define PI_TOKEN 0x01 ! 341: #define PI_SYNC 0x02 ! 342: #define PI_ACTIVITY 0x03 ! 343: #define PI_REPORT 0x04 ! 344: #define PI_FINISH 0x05 ! 345: #define PI_ABORT 0x06 ! 346: ! 347: union { ! 348: struct PSAPdata pi_un_data; ! 349: struct PSAPtoken pi_un_token; ! 350: struct PSAPsync pi_un_sync; ! 351: struct PSAPactivity pi_un_activity; ! 352: struct PSAPreport pi_un_report; ! 353: struct PSAPfinish pi_un_finish; ! 354: struct PSAPabort pi_un_abort; ! 355: } pi_un; ! 356: #define pi_data pi_un.pi_un_data ! 357: #define pi_token pi_un.pi_un_token ! 358: #define pi_sync pi_un.pi_un_sync ! 359: #define pi_activity pi_un.pi_un_activity ! 360: #define pi_report pi_un.pi_un_report ! 361: #define pi_finish pi_un.pi_un_finish ! 362: #define pi_abort pi_un.pi_un_abort ! 363: }; ! 364: \end{verbatim}\end{quote} ! 365: As shown, this structure is really a discriminated union ! 366: (a structure with a tag element followed by a union). ! 367: Hence, on a failure return, ! 368: one first coerces a pointer to the \verb"PSAPabort" structure contained ! 369: therein, ! 370: and then consults the elements of that structure. ! 371: \begin{quote}\index{PSAPabort}\small\begin{verbatim} ! 372: struct PSAPabort { ! 373: int pa_peer; ! 374: ! 375: int pa_reason; ! 376: int pa_ppdu; ! 377: ! 378: ! 379: int pa_ninfo; ! 380: char pa_info; ! 381: ! 382: #define PA_SIZE 512 ! 383: int pa_cc; ! 384: char pa_data[PA_SIZE]; ! 385: }; ! 386: \end{verbatim}\end{quote} ! 387: The elements of a \verb"PSAPabort" structure are: ! 388: \begin{describe} ! 389: \item[\verb"pa\_peer":] if set, indicates that a user-initiated abort occurred ! 390: (a {\sf P-U-ABORT.INDICATION\/} event); ! 391: if not set, indicates that a provider-initiated abort occurred ! 392: (a {\sf P-P-ABORT.INDICATION\/} event); ! 393: ! 394: \item[\verb"pa\_reason":] the reason for the provider-initiated ! 395: abort (codes are listed in Table~\ref{PSAPreasons}); ! 396: ! 397: \item[\verb"pa\_ppdu":] the type of presentation protocol data unit which ! 398: triggered the provider-initiated abort ! 399: (codes are listed in Table~\ref{PSAPppdus}); ! 400: ! 401: \item[\verb"pa\_data"/\verb"pa\_cc":] a provider-generated diagnostic string ! 402: (and the length of that string); ! 403: and, ! 404: ! 405: \item[\verb"pa\_info"/\verb"pa\_ninfo":] an array of user data, ! 406: and the number of elements in that array (if \verb"pa_peer" is set). ! 407: \end{describe} ! 408: \tagtable[tp]{5a-1}{PSAP Failure Codes}{PSAPreasons} ! 409: \tagtable[tp]{5a-2}{PSAP PPDU Codes}{PSAPppdus} ! 410: Note that the \verb"pa_info" element is allocated via \man malloc(3) and ! 411: should be released using the \verb"PAFREE" macro when no longer referenced. ! 412: The \verb"PAFREE" macro behaves as if it was defined as: ! 413: \begin{quote}\index{PAFREE}\small\begin{verbatim} ! 414: void PAFREE (pa) ! 415: struct PSAPabort *pa; ! 416: \end{verbatim}\end{quote} ! 417: The macro frees only the data allocated in the \verb"PSAPabort" structure ! 418: and not the structure itself. ! 419: ! 420: After examining the information returned by \verb"PInit" on a successful call ! 421: (and possibly after examining the argument vector), ! 422: the responder should either accept or reject the connection. ! 423: For either response, ! 424: the responder should use ! 425: the \verb"PConnResponse" routine ! 426: (which corresponds to the {\sf P-CONNECT.RESPONSE\/} action). ! 427: \begin{quote}\index{PConnResponse}\small\begin{verbatim} ! 428: int PConnResponse (sd, status, responding, ctxlist, ! 429: defctxresult, prequirements, srequirements, ! 430: isn, settings, ref, data, ndata, pi) ! 431: int sd; ! 432: struct PSAPaddr *responding; ! 433: int status, ! 434: prequirements, ! 435: srequirements, ! 436: settings, ! 437: ndata; ! 438: long isn; ! 439: struct PSAPctxlist *ctxlist; ! 440: int defctxresult; ! 441: struct SSAPref *ref; ! 442: PE *data; ! 443: struct PSAPindication *pi; ! 444: \end{verbatim}\end{quote} ! 445: The parameters to this procedure are:\label{PConnResponse} ! 446: \begin{describe} ! 447: \item[\verb"sd":] the presentation-descriptor; ! 448: ! 449: \item[\verb"result":] the acceptance indicator ! 450: (either \verb"PC_ACCEPT" if the connection is to be accepted, ! 451: or \verb"PC_REJECTED" otherwise); ! 452: ! 453: \item[\verb"responding":] the PSAP address of the responder (defaulting to the ! 454: called address, if not present); ! 455: ! 456: \item[\verb"ctxlist":] the responder's decision as to each of the presentation ! 457: contexts suggested ! 458: (for each proposed context, ! 459: if the \verb"pc_result" element supplied by the provider is \verb"PC_ACCEPT", ! 460: which indicates that the provider is willing to support it, ! 461: the user may supply either \verb"PC_ACCEPT" or the value \verb"PC_REJECTED"); ! 462: ! 463: \item[\verb"defctxresult":] the response to the default context ! 464: (if the presentation provider responded with \verb"PC_ACCEPT", ! 465: the user may supply either \verb"PC_ACCEPT" or ! 466: \verb"PC_REJECTED"); ! 467: ! 468: \item[\verb"prequirements":] the responder's presentation requirements; ! 469: ! 470: \item[\verb"srequirements":] the responder's session requirements; ! 471: ! 472: \item[\verb"isn":] the initial serial-number; ! 473: ! 474: \item[\verb"settings":] the initial token settings; ! 475: ! 476: \item[\verb"ref":] the connection identifier used by the responder ! 477: (consult page~\pageref{SSAPref} for a description of the \verb"SSAPref" ! 478: structure); ! 479: ! 480: \item[\verb"data"/\verb"ndata":] an array of initial data ! 481: (and the number of elements in that array, ! 482: consult the warning on page~\pageref{PSAPdata}); ! 483: and, ! 484: ! 485: \item[\verb"pi":] a pointer to a \verb"PSAPindication" structure, which is ! 486: updated only if the call fails. ! 487: \end{describe} ! 488: If the call to \verb"PConnResponse" is successful, ! 489: and if the \verb"result" parameter is set to \verb"PC_ACCEPT", ! 490: then connection establishment has completed ! 491: and the users of the presentation service now operate as symmetric peers. ! 492: If the call is successful, ! 493: but the \verb"result" parameter is \verb"PC_REJECTED" instead, ! 494: then the connection has been rejected and the responder may exit. ! 495: Otherwise, if the call fails and the reason is not an interface error ! 496: (see Table~\ref{PSAPreasons} on page~\pageref{PSAPreasons}), ! 497: then the connection is closed. ! 498: ! 499: Note that when the responder rejects the connection, ! 500: it need only supply meaningful values for the \verb"sd", \verb"status", ! 501: \verb"defctxresult", and \verb"pi" parameters. ! 502: ! 503: \subsection {Client Initialization} ! 504: A program wishing to connect to another user of presentation services calls the ! 505: \verb"PConnRequest" routine, ! 506: which corresponds to the {\sf P-CONNECT.RE\-QUEST\/} action. ! 507: \begin{quote}\index{PConnRequest}\small\begin{verbatim} ! 508: int PConnRequest (calling, called, ctxlist, defctxname, ! 509: prequirements, srequirements, isn, settings, ! 510: ref, data, ndata, qos, pc, pi) ! 511: struct PSAPaddr *calling, ! 512: *called; ! 513: int prequirements, ! 514: srequirements, ! 515: settings, ! 516: ndata; ! 517: long isn; ! 518: struct PSAPctxlist *ctxlist; ! 519: OID defctxname; ! 520: struct SSAPref *ref; ! 521: PE *data; ! 522: struct QOStype *qos; ! 523: struct PSAPconnect *pc; ! 524: struct PSAPindication *pi; ! 525: \end{verbatim}\end{quote} ! 526: The parameters to this procedure are:\label{PConnRequest} ! 527: \begin{describe} ! 528: \item[\verb"calling":] the PSAP address of the initiator ! 529: (use the manifest constant verb"NULLPA" if this is not unimportant); ! 530: ! 531: \item[\verb"called":] the PSAP address of the responder; ! 532: ! 533: \item[\verb"ctxlist":] the list of proposed presentation contexts ! 534: (only the \verb"pc_id", \verb"pc_asn", and optionally the \verb"pc_atn" ! 535: elements should be filled in); ! 536: ! 537: \item[\verb"defctxname":] the proposed default contexts; ! 538: ! 539: \item[\verb"prequirements":] the presentation requirements; ! 540: ! 541: \item[\verb"srequirements":] the session requirements; ! 542: ! 543: \item[\verb"isn":] the initial serial-number; ! 544: ! 545: \item[\verb"settings":] the initial token settings; ! 546: ! 547: \item[\verb"ref":] the connection identifier used by the initiator ! 548: (consult page~\pageref{SSAPref} for a description of the \verb"SSAPref" ! 549: structure); ! 550: ! 551: \item[\verb"data"/\verb"ndata":] an array of initial data ! 552: (and the number of elements in that array, ! 553: consult the warning on page~\pageref{PSAPdata}); ! 554: ! 555: \item[\verb"qos":] the quality of service on the connection ! 556: (see Section~\ref{tsap:qos}); ! 557: ! 558: \item[\verb"pc":] a pointer to a \verb"PSAPconnect" structure, which is ! 559: updated only if the call succeeds; ! 560: and, ! 561: ! 562: \item[\verb"pi":] a pointer to a \verb"PSAPindication" structure, which is ! 563: updated only if the call fails. ! 564: \end{describe} ! 565: If the call to \verb"PConnRequest" is successful ! 566: (a successful return corresponds to a {\sf P-CONNECT.CONFIRMATION\/} event), ! 567: then information is returned in the \verb"pc" parameter, ! 568: which is a pointer to a \verb"PSAPconnect" structure. ! 569: \begin{quote}\index{PSAPconnect}\small\begin{verbatim} ! 570: struct PSAPconnect { ! 571: int pc_sd; ! 572: ! 573: struct PSAPaddr pc_responding; ! 574: ! 575: struct PSAPctxlsit pc_ctxlist; ! 576: ! 577: int pc_defctxresult; ! 578: ! 579: int pc_prequirements; ! 580: ! 581: int pc_srequirements; ! 582: int pc_settings; ! 583: int pc_please; ! 584: long pc_isn; ! 585: ! 586: struct SSAPref pc_connect; ! 587: ! 588: int pc_ssdusize; ! 589: ! 590: struct QOStype pc_qos; ! 591: int pc_result; ! 592: ! 593: struct SSAPref pc_connect; ! 594: ! 595: #define PC_SIZE 512 ! 596: int pc_cc; ! 597: char pc_data[PC_SIZE]; ! 598: }; ! 599: \end{verbatim}\end{quote} ! 600: The elements of this structure are:\label{PSAPconnect} ! 601: \begin{describe} ! 602: \item[\verb"pc\_sd":] the presentation-descriptor to be used to reference this ! 603: connection; ! 604: ! 605: \item[\verb"pc\_responding":] the responding peer's address ! 606: (which is the same as the \verb"called" parameter given to ! 607: \verb"SConnRequest"); ! 608: ! 609: \item[\verb"pc\_ctxlist":] the (negotiated) list of presentation contexts; ! 610: ! 611: \item[\verb"pc\_defctxresult":] the response to the proposed default context; ! 612: ! 613: \item[\verb"pc\_prequirements":] the (negotiated) presentation requirements; ! 614: ! 615: \item[\verb"pc\_srequirements":] the (negotiated) session requirements; ! 616: ! 617: \item[\verb"pc\_settings":] the (negotiated) initial token settings; ! 618: ! 619: \item[\verb"pc\_please":] the tokens which the responder wants to own ! 620: (if any); ! 621: ! 622: \item[\verb"pc\_isn":] the (negotiated) initial serial-number; ! 623: ! 624: \item[\verb"pc\_connect":] the connection identifier used by the responder ! 625: (consult page~\pageref{SSAPref} for a description of the \verb"SSAPref" ! 626: structure); ! 627: ! 628: \item[\verb"pc\_ssdusize":] the largest atomic SSDU size that can be used on ! 629: the connection (see the note on page~\pageref{SSDU:atomic}); ! 630: ! 631: \item[\verb"pc\_qos":] the quality of service on the connection ! 632: (see Section~\ref{tsap:qos}); ! 633: and, ! 634: ! 635: \item[\verb"pc\_result":] the connection response; ! 636: ! 637: \item[\verb"pc\_info"/\verb"pc\_ninfo":] an array of initial data, ! 638: and the number of elements in that array. ! 639: \end{describe} ! 640: If the call to \verb"PConnRequest" is successful, ! 641: and the \verb"pc_result" element is set to \verb"PC_ACCEPT", ! 642: then connection establishment has completed and the users of the presentation ! 643: service now operate as symmetric peers. ! 644: If the call is successful, ! 645: but the \verb"pc_result" element is not \verb"PC_ACCEPT", ! 646: then the connection has been rejected; ! 647: consult Table~\ref{PSAPreasons} to determine the reason ! 648: (further information can be found in the \verb"pi" parameter). ! 649: Otherwise, if the call fails then the connection is not established and the ! 650: \verb"PSAPabort" structure of the \verb"PSAPindication" discriminated union ! 651: has been updated. ! 652: ! 653: Note that the \verb"pc_info" element is allocated via \man malloc(3) and ! 654: should be released using the \verb"PCFREE" macro when no longer referenced. ! 655: The \verb"PCFREE" macro behaves as if it was defined as: ! 656: \begin{quote}\index{PCFREE}\small\begin{verbatim} ! 657: void PCFREE (pc) ! 658: struct PSAPconnect *pc; ! 659: \end{verbatim}\end{quote} ! 660: The macro frees only the data allocated by \verb"PConnRequest", ! 661: and not the \verb"PSAPconnect" structure itself. ! 662: Further, ! 663: \verb"PCFREE" should be called only if the call to the \verb"PConnRequest" ! 664: routine returned \verb"OK". ! 665: ! 666: Normally \verb"PConnRequest" returns only after a connection has succeeded or ! 667: failed. ! 668: This is termed a {\em synchronous\/} connection initiation. ! 669: If the user desires, an {\em asynchronous\/} connection may be initiated. ! 670: The routine \verb"PConnRequest" is really a macro which calls the routine ! 671: \verb"PAsynConnRequest" with an argument indicating that a connection should ! 672: be attempted synchronously. ! 673: \begin{quote}\index{PAsynConnRequest}\small\begin{verbatim} ! 674: int PAsynConnRequest (calling, called, ctxlist, ! 675: defctxname, prequirements, srequirements, ! 676: isn, settings, ref, data, ndata, qos, pc, ! 677: pi, async) ! 678: struct PSAPaddr *calling, ! 679: *called; ! 680: int prequirements, ! 681: srequirements, ! 682: settings, ! 683: ndata, ! 684: async; ! 685: long isn; ! 686: struct PSAPctxlist *ctxlist; ! 687: OID defctxname; ! 688: struct SSAPref *ref; ! 689: PE *data; ! 690: struct QOStype *qos; ! 691: struct PSAPconnect *pc; ! 692: struct PSAPindication *pi; ! 693: \end{verbatim}\end{quote} ! 694: The additional parameter to this procedure is: ! 695: \begin{describe} ! 696: \item[\verb"async":] whether the connection should be initiated asynchronously. ! 697: \end{describe} ! 698: If the \verb"async" parameter is non-zero, ! 699: then \verb"PAsynConnRequest" returns one of four values: ! 700: \verb"NOTOK", which indicates that the connection request failed; ! 701: \verb"DONE", which indicates that the connection request succeeded; ! 702: or, either of \verb"CONNECTING_1" or \verb"CONNECTING_2", which indicates that ! 703: the connection request is still in ! 704: progress. ! 705: In the first two cases, ! 706: the usual procedures for handling return values from \verb"PConnRequest" are ! 707: employed ! 708: (i.e., a \verb"NOTOK" return from \verb"PAsynConnRequest" is equivalent to a ! 709: \verb"NOTOK" return from \verb"PConnRequest", and, ! 710: a \verb"DONE" return from \verb"PAsynConnRequest" is equivalent to a ! 711: \verb"OK" return from \verb"PConnRequest"). ! 712: ! 713: In the final case, when either \verb"CONNECTING_1" or ! 714: \verb"CONNECTING_2" is returned, ! 715: only the \verb"pc_sd" element of the \verb"pc" parameter has been updated; ! 716: it reflects the presentation-descriptor to be used to reference this ! 717: connection. ! 718: ! 719: To determine when the connection attempt has been completed, ! 720: the routine \verb"xselect" (consult Section~\ref{acs:select} of \volone/) ! 721: should be used after calling \verb"PSelectMask". ! 722: In order to determine if the connection attempt was successful, ! 723: the routine \verb"PAsynRetryRequest" is called: ! 724: \begin{quote}\index{PAsynRetryRequest}\small\begin{verbatim} ! 725: int PAsynRetryRequest (sd, pc, pi) ! 726: int sd; ! 727: struct PSAPconnect *pc; ! 728: struct PSAPindication *pi; ! 729: \end{verbatim}\end{quote} ! 730: The parameters to this procedure are: ! 731: \begin{describe} ! 732: \item[\verb"sd":] the presentation-descriptor; ! 733: ! 734: \item[\verb"pc":] a pointer to a \verb"PSAPconnect" structure, which is ! 735: updated only if the call succeeds; ! 736: and, ! 737: ! 738: \item[\verb"pi":] a pointer to a \verb"PSAPindication" structure, which is ! 739: updated only if the call fails. ! 740: \end{describe} ! 741: Again, one of three values are returned: ! 742: \verb"NOTOK", which indicates that the connection request failed; ! 743: \verb"DONE", which indicates that the connection request succeeded; ! 744: and, \verb"CONNECTING_1" or \verb"CONNECTING_2" which indicates that ! 745: the connection request is still in progress. ! 746: ! 747: Refer to Section~\ref{tsap:async} on page~\pageref{tsap:async} ! 748: for information on how to make efficient use of the asynchronous connection ! 749: facility. ! 750: ! 751: \section {Data Transfer} ! 752: Once the connection has been established, ! 753: a presentation-descriptor is used to reference the connection. ! 754: This is usually the first parameter given to any of the remaining routines in ! 755: the \man libpsap2(3n) library. ! 756: Further, ! 757: the last parameter is usually a pointer to a \verb"PSAPindication" structure ! 758: (as described on page~\pageref{PSAPindication}). ! 759: If a call to one of these routines fails, ! 760: then the structure is updated. ! 761: Consult the \verb"PSAPabort" element of the \verb"PSAPindication" structure. ! 762: If the \verb"pa_reason" element of the \verb"PSAPabort" structure is ! 763: associated with a fatal error, ! 764: then the connection is closed. ! 765: That is, a {\sf P-P-ABORT.INDICATION\/} event has occurred. ! 766: The \verb"PC_FATAL" macro can be used to determine this. ! 767: \begin{quote}\index{PC\_FATAL}\small\begin{verbatim} ! 768: int PC_FATAL (r) ! 769: int r; ! 770: \end{verbatim}\end{quote} ! 771: The most common interface error to occur is \verb"PC_OPERATION" which usually ! 772: indicates that either the user is lacking ownership of a session token ! 773: to perform an operation, ! 774: or that a session requirement required by the operation was not negotiated ! 775: during connection establishment. ! 776: For protocol purists, ! 777: the \verb"PC_OFFICIAL" macro can be used to determine if the error is an ! 778: ``official'' error as defined by the specification, ! 779: or an ``unofficial'' error used by the implementation. ! 780: \begin{quote}\index{PC\_OFFICIAL}\small\begin{verbatim} ! 781: int PC_OFFICIAL (r) ! 782: int r; ! 783: \end{verbatim}\end{quote} ! 784: ! 785: All of the remaining routines in the \man libpsap2(3n) library are identical ! 786: to their counterparts in the \man libssap(3n) library, ! 787: with these exceptions: ! 788: \begin{itemize} ! 789: \item The final parameter to each routine is a pointer to a ! 790: \verb"PSAPindication" structure, ! 791: rather than a \verb"SSAPindication" structure. ! 792: ! 793: \item Any user data components are specified as an array of presentation ! 794: elements (and the number of elements in that array), ! 795: rather than the base of a character array (and the number of octets ! 796: to be sent. ! 797: Note that any data to be sent should have the \verb"pe_context" ! 798: element set to the desired presentation context. ! 799: By default, presentation elements are initialized with the ! 800: default context (as represented by the manifest constant ! 801: \verb"PE_DFLT_CTX"). ! 802: ! 803: \item Asynchronous event handlers are called with pointers to \verb"PSAP" ! 804: structures, rather tha \verb"SSAP" structures. ! 805: ! 806: \item With any indication which occurs, ! 807: it is important to free any data which might have been allocated. ! 808: The structures and corresponding macros are: ! 809: \[\begin{tabular}{|l|l|} ! 810: \hline ! 811: \multicolumn{1}{|c|}{\bf Macro}& ! 812: \multicolumn{1}{c|}{\bf Structure Pointer}\\ ! 813: \hline ! 814: \tt PXFREE& struct PSAPdata *\\ ! 815: \tt PTFREE& struct PSAPtoken *\\ ! 816: \tt PNFREE& struct PSAPsync *\\ ! 817: \tt PVFREE& struct PSAPactivity *\\ ! 818: \tt PPFREE& struct PSAPreport *\\ ! 819: \tt PFFREE& struct PSAPfinish *\\ ! 820: \tt PRFREE& struct PSAPrelease *\\ ! 821: \tt PAFREE& struct PSAPabort *\\ ! 822: \hline ! 823: \end{tabular}\] ! 824: Note that these free the user data referenced by the indication ! 825: structures, ! 826: and not the structures themselves.\index{PXFREE}\index{PTFREE} ! 827: \index{PNFREE}\index{PVFREE}\index{PPFREE}\index{PFFREE}\index{PRFREE} ! 828: \index{PAFREE} ! 829: \end{itemize} ! 830: ! 831: \subsection {Restrictions on User Data}\label{PSAPdata} ! 832: To quote the \cite{ISO.PP.Service} specification: ! 833: \[\fbox{\begin{tabular}{lp{0.8\textwidth}} ! 834: \bf NOTE:& For all services which carry user data, ! 835: excluding {\sf P-DATA\/} and {\sf P-TYPED-DATA}, ! 836: it may not be possible to exchange user data, ! 837: dependent on the user data length limitation supported by ! 838: the underlying session services. ! 839: \end{tabular}}\] ! 840: ! 841: \section {Error Conventions} ! 842: All of the routines in this library return the manifest constant \verb"NOTOK" ! 843: on error, ! 844: and also update the \verb"pi" parameter given to the routine. ! 845: The \verb"pi_abort" element of the \verb"PSAPindication" structure contains a ! 846: \verb"PSAPabort" structure detailing the reason for the failure. ! 847: The \verb"pa_reason" element of this latter structure can be given as a ! 848: parameter to the routine \verb"PErrString" which returns a null-terminated ! 849: diagnostic string. ! 850: \begin{quote}\index{PErrString}\small\begin{verbatim} ! 851: char *PErrString (c) ! 852: int c; ! 853: \end{verbatim}\end{quote} ! 854: ! 855: \section {Compiling and Loading} ! 856: Programs using the \man libpsap2(3n) library should include ! 857: \verb"<isode/psap2.h>". ! 858: The programs should also be loaded with \verb"-lpsap2". ! 859: ! 860: \section {An Example} ! 861: Let's consider how one might construct a source entity that resides on the ! 862: PSAP. ! 863: This entity will use a synchronous interface. ! 864: ! 865: There are two parts to the program: ! 866: initialization and data transfer; ! 867: release will occur when the standard input has been exhausted. ! 868: In our example, ! 869: we assume that the routine \verb"error" results in the process being ! 870: terminated after printing a diagnostic. ! 871: ! 872: In Figure~\ref{initPSsource}, ! 873: the initialization steps for the source entity, ! 874: including the outer {\em C\/} wrapper, ! 875: is shown. ! 876: First, a lookup is done in the ISO services database, ! 877: and the \verb"PSAPaddr" is initialized. ! 878: The \verb"SSAPref" is initialized using the routine ! 879: \verb"addr2ref". ! 880: This routine takes a string and returns a pointer to a \verb"SSAPref" ! 881: structure which has been initialized to contain the string and the current ! 882: UTC time. ! 883: Next, for each token associated with the session requirements, ! 884: initial ownership of that token is claimed. ! 885: Finally, ! 886: the call to \verb"PConnRequest" is made. ! 887: If the call is successful, ! 888: a check is made to see if the remote user accepted the connection. ! 889: If so, ! 890: the presentation-descriptor is captured, ! 891: along with the negotiated requirements and initial token settings. ! 892: ! 893: In Figure~\ref{dataPSsource} on page~\pageref{dataPSsource}, ! 894: the data transfer loop is realized. ! 895: The source entity reads a line from the standard input, ! 896: and then queues that line for sending to the remote side. ! 897: When an end-of-file occurs on the standard input, ! 898: the source entity requests release and then gracefully terminates. ! 899: Although no checking is done in this example, ! 900: for the calls to \verb"PDataRequest" and \verb"PRelRequest", ! 901: on failure ! 902: a check for the operational error \verb"PC_OPERATION" should be made. ! 903: For \verb"PDataRequest", ! 904: this would occur when the data token was not owned by the user; ! 905: for \verb"PRelRequest", ! 906: this would occur when the release token was not owned by the user. ! 907: \clearpage ! 908: \tagrind[tp]{grind5a-2a}{Initializing the PSAP source entity}{initPSsource} ! 909: \clearpage ! 910: \tagrind[tp]{grind5a-2b}{Initializing the PSAP source entity (continued)}\empty ! 911: \clearpage ! 912: \tagrind[tp]{grind5a-3}{Data Transfer for the PSAP source entity}% ! 913: {dataPSsource} ! 914: ! 915: \section {Lightweight Presentation Protocol} ! 916: To run OSI applications using the lighweight presentation protocol ! 917: defined in RFC1085, ! 918: load the program with \verb"-lpsap2-lpp" or \verb"-isode-lpp". ! 919: ! 920: This is a complete implementation of RFC1085. ! 921: The following functions are available: ! 922: \begin{quote}\small\begin{verbatim} ! 923: PInit ! 924: PConnResponse ! 925: PAsynConnRequest ! 926: PAsynRetryRequest ! 927: PDataRequest ! 928: PReadRequest ! 929: PUAbortRequest ! 930: PRelRequest ! 931: PRelResponse ! 932: PSetIndications ! 933: PSelectMask ! 934: PErrSTring ! 935: \end{verbatim}\end{quote} ! 936: Note that when RFC1085 is used as a presentation backing, ! 937: only a subset of the presentation services are available: ! 938: \begin{quote}\small\sf ! 939: P-CONNECT ! 940: P-DATA ! 941: P-U-ABORT ! 942: P-P-ABORT ! 943: \end{quote} ! 944: The \man lppd(8c) daemon is used to listen for incoming connections and ! 945: dispatch the appropriate daemon. ! 946: This daemon will listen only for connections using the TCP backing. ! 947: For connections using the UDP backing, ! 948: the responder program must listen itself. ! 949: This is trivally accomplished using the \verb"isodeserver" routine ! 950: described in Section~\ref{isodeserver} on page~\pageref{isodeserver}. ! 951: ! 952: \section {For Further Reading} ! 953: The ISO specification for session services is defined in ! 954: \cite{ISO.PP.Service}, ! 955: while the corresponding protocol definition is \cite{ISO.PP.Protocol}. ! 956: ! 957: %%% \section {Changes Since the Last Release}\label{psapX:changes} ! 958: %%% A brief summary of the major changes between v~\psapXrevrsn/ and ! 959: %%% v~\psapXvrsn/ are now presented. ! 960: %%% These are the user-visible changes only; ! 961: %%% changes of a strictly internal nature are not discussed. ! 962:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.