Annotation of 43BSDReno/contrib/isode-beta/doc/manual/ssap.tex, revision 1.1.1.1

1.1       root        1: % run this through LaTeX with the appropriate wrapper
                      2: 
                      3: \chapter      {Session Services}\label{libssap}
                      4: The \man libssap(3n) library implements the session service.
                      5: 
                      6: As with most models of OSI services,
                      7: the underlying assumption is one of a symmetric, asynchronous environment.
                      8: That is,
                      9: although peers exist at a given layer,
                     10: one does not necessary view a peer as either a client or a server.
                     11: Further,
                     12: the service provider may generate events for the service user without the
                     13: latter entity triggering the actions which led to the event.
                     14: For example,
                     15: in a synchronous environment,
                     16: an indication that data has arrived usually occurs only when the service user
                     17: asks the service provider to read data;
                     18: in an asynchronous environment,
                     19: the service provider may interrupt the service user at any time to announce
                     20: the arrival of data.
                     21: 
                     22: The \verb"ssap" module in this release initially uses a client/server
                     23: paradigm to start communications.
                     24: Once the connection is established,
                     25: a symmetric view is taken.
                     26: In addition,
                     27: initially the interface is synchronous;
                     28: however once the connection is established,
                     29: an asynchronous interface may be selected.
                     30: 
                     31: All of the routines in the \man libssap(3n) library are integer-valued.
                     32: They return the manifest constant \verb"OK" on success,
                     33: or \verb"NOTOK" otherwise.
                     34: 
                     35: \section      {Warning}
                     36: Please read the following important message.
                     37: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
                     38: \bf NOTE:&     Readers of this chapter should have an intimate understanding
                     39:                of the OSI session service.  It is not the intent of this
                     40:                chapter to present a tutorial on these services, so novice
                     41:                users will suffer greatly if they choose to read further.
                     42: \end{tabular}}\]
                     43: 
                     44: \section      {Addresses}\label{ssap:addresses}
                     45: Addresses at the session service access point are represented by the
                     46: \verb"SSAPaddr" structure.
                     47: \begin{quote}\index{SSAPaddr}\small\begin{verbatim}
                     48: struct SSAPaddr {
                     49:     struct TSAPaddr sa_addr;
                     50: 
                     51: #define SSSIZE  64
                     52:     int     sa_selectlen;
                     53:     char    sa_selector[SSSIZE];
                     54: };
                     55: #define NULLSA  ((struct SSAPaddr *) 0)
                     56: \end{verbatim}\end{quote}
                     57: This structure contains two elements:
                     58: \begin{describe}
                     59: \item[\verb"sa\_addr":]        the transport address,
                     60: as described in Section~\ref{tsap:addresses} on page~\pageref{tsap:addresses};
                     61: and,
                     62: 
                     63: \item[\verb"sa\_selector"/\verb"sa\_selectlen":] the session selector,
                     64: as described in the \man isoservices(5) database in Chapter~\ref{isoservices},
                     65: for the service provider \verb"ssap".
                     66: \end{describe}
                     67: 
                     68: In Figure~\ref{getASprovider},
                     69: an example of how one constructs the SSAP address for the Presentation provider
                     70: on host \verb"RemoteHost" is presented.
                     71: The routine \verb"is2saddr" takes a host and service,
                     72: and then consults the \man isoentities(5) file described in
                     73: Chapter~\ref{isoentities} of \volone/ to construct a session
                     74: address.
                     75: \begin{quote}\index{is2saddr}\small\begin{verbatim}
                     76: struct SSAPaddr *is2saddr (host, service, is)
                     77: char   *host,
                     78:        *service;
                     79: struct isoservent *is;
                     80: \end{verbatim}\end{quote}
                     81: \tagrind[tp]{grind5b-1}%
                     82:        {Constructing the SSAP address for the Presentation provider}%
                     83:        {getASprovider}
                     84: 
                     85: \subsection    {Calling Address}
                     86: Certain users of the session service
                     87: (e.g., the reliable transfer service)
                     88: need to know the name of the local host when they initiate a connection.
                     89: The routine \verb"SLocalHostName" has been provided for this reason.
                     90: \begin{quote}\index{SLocalHostName}\small\begin{verbatim}
                     91: char   *SLocalHostName ()
                     92: \end{verbatim}\end{quote}
                     93: 
                     94: \subsection    {Address Encodings}
                     95: It may be useful to encode a session address for viewing.
                     96: Although a consensus for a standard way of doing this has not yet been
                     97: reached,
                     98: the routines \verb"saddr2str" and \verb"str2saddr" may be used in the interim.
                     99: \begin{quote}\index{saddr2str}\small\begin{verbatim}
                    100: char   *saddr2str (sa)
                    101: struct SSAPaddr *sa;
                    102: \end{verbatim}\end{quote}
                    103: The parameter to this procedure is:
                    104: \begin{describe}
                    105: \item[\verb"sa":] the session address.
                    106: \end{describe}
                    107: If \verb"saddr2str" fails,
                    108: it returns the manifest constant \verb"NULLCP".
                    109: 
                    110: The routine \verb"str2saddr" takes an ascii string encoding and
                    111: returns a
                    112: session address.
                    113: \begin{quote}\index{str2saddr}\small\begin{verbatim}
                    114: struct SSAPaddr *str2saddr (str)
                    115: char   *str;
                    116: \end{verbatim}\end{quote}
                    117: The parameter to this procedure is:
                    118: \begin{describe}
                    119: \item[\verb"str":] the ascii string.
                    120: \end{describe}
                    121: If \verb"str2saddr" fails,
                    122: it returns the manifest constant \verb"NULLSA".
                    123: 
                    124: \section      {Connection Establishment}
                    125: Until the connection has been fully established,
                    126: the implementation distinguishes between clients and servers,
                    127: which are more properly referred to as {\em initiators\/} and
                    128: {\em responders}, to use OSI terminology.
                    129: 
                    130: \subsection    {Connection Negotiation}\label{ssap:negotiation}
                    131: From the user's perspective,
                    132: there are several parameters which are negotiated by the session providers
                    133: during connection establishment.
                    134: Suggestions as to the values of some of these parameters are made by the user.
                    135: 
                    136: \subsubsection {Maximum SSDU Size}
                    137: The session provider will accept arbitrarily large session service data units
                    138: (SSDUs) and transparently fragment and re-assemble them during transit.
                    139: Hence, the actual SSDU is of unlimited size.
                    140: However, for efficiency reasons,
                    141: it may be desirable for the user to send SSDUs which are no larger than a
                    142: certain threshold.
                    143: When a connection has been established,
                    144: the service providers inform the initiator and responder as to what this
                    145: threshold is.
                    146: 
                    147: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}\label{SSDU:atomic}
                    148: \bf NOTE:&     In the current implementation,
                    149:                SSDUs which are no larger than the maximum atomic SSDU size
                    150:                are handled very efficiently.
                    151:                For optimal performance,
                    152:                users of the session service should strive to avoid sending
                    153:                SSDUs which are larger than this threshold.
                    154: \end{tabular}}\]
                    155: 
                    156: \subsubsection {Session Requirements}
                    157: Users may specify the particular services that they will require from the
                    158: session provider.
                    159: The particular requirements supported in the current implementation are
                    160: listed in Table~\ref{SSAPrequirements}.
                    161: These requirements are always negotiated downward.
                    162: That is,
                    163: the initiator of the connection (i.e., the ``client'') indicates the
                    164: desired session requirements.
                    165: These are then given to the responder to the connection request
                    166: (i.e., the ``server'') who may select any (or all) of the indicated session
                    167: requirements.%
                    168: \footnote{There is one exception,
                    169: the responder may not select both the half- and full-duplex requirements.
                    170: It must choose one.
                    171: If the initiator selects both initially,
                    172: it is indicating that the choice is made at the responder's discretion.}
                    173: This selection is then indicated to the initiator.
                    174: \tagtable[tp]{5b-1}{Session Requirements}{SSAPrequirements}
                    175: 
                    176: \subsubsection {Session Tokens}
                    177: Depending on the session requirements selected,
                    178: several session tokens may be available in order to coordinate the use of
                    179: session services.
                    180: 
                    181: There are two terms commonly used when referring to a session token:
                    182: \begin{itemize}
                    183: \item  Availability\\
                    184:        If a token is available, then it exists for use during the session
                    185:        connection.
                    186:        The availability of a token depends on the session requirements
                    187:        selected for the connection.
                    188: \item  Ownership\\
                    189:        Certain session services are may not be requested by a user unless
                    190:        that user owns the token associated with those services.
                    191: \end{itemize}
                    192: The particular tokens supported in the current implementation,
                    193: along with their associated availability information are
                    194: listed in Table~\ref{SSAPtokens}.
                    195: \tagtable[tp]{5b-2}{Session Tokens}{SSAPtokens}
                    196: 
                    197: The session requirements are encoded as a single integer
                    198: (actually, only the low-order 2~octets of an integer).
                    199: To determine if a token is available,
                    200: one can use a simple test involving the session requirements:
                    201: \begin{quote}\small\begin{verbatim}
                    202: if (requirements & SR_xxx_EXISTS) {
                    203:     ...
                    204: }
                    205: \end{verbatim}\end{quote}
                    206: For example,
                    207: to determine if the negotiated release token is available:
                    208: \begin{quote}\small\begin{verbatim}
                    209: if (requirements & SR_RLS_EXISTS) {
                    210:     ...
                    211: }
                    212: \end{verbatim}\end{quote}
                    213: 
                    214: Finally,
                    215: the macro \verb"dotokens" may be used to execute {\em C\/} code for each
                    216: session token (regardless of availability).\index{dotokens}
                    217: This macro acts as if it executes:
                    218: \begin{quote}\index{dotoken}\small\begin{verbatim}
                    219: dotoken (SR_xxx_EXISTS, ST_xxx_SHIFT, ST_xxx_TOKEN, "xxx");
                    220: \end{verbatim}\end{quote}
                    221: for each token.
                    222: Usually,
                    223: \verb"dotoken" is a macro which executes some code for each token.
                    224: An example is provided momentarily.
                    225: 
                    226: \subsubsection {Initial Token Settings}
                    227: For each token which is made available during connection negotiation,
                    228: the choice as to which user initially has the token is left to the discretion
                    229: of the initiator.
                    230: The three choices for the initial settings of a token are listed in
                    231: Table~\ref{SSAPsettings}.
                    232: \tagtable[tp]{5b-3}{Initial Token Settings}{SSAPsettings}
                    233: 
                    234: The initial settings for all available tokens are encoded in a single integer
                    235: (actually, only the low-order 2~octets of an integer).
                    236: To encode a value:
                    237: \begin{quote}\small\begin{verbatim}
                    238: settings &= ~(ST_MASK << ST_yyy_SHIFT);
                    239: settings |= ST_xxx_VALUE << ST_yyy_SHIFT;
                    240: \end{verbatim}\end{quote}
                    241: For example,
                    242: to indicate that the responder of the connection is to initially have the
                    243: data token:
                    244: \begin{quote}\small\begin{verbatim}
                    245: settings &= ~(ST_MASK << ST_DAT_SHIFT);
                    246: settings |= ST_RESP_VALUE << ST_DAT_SHIFT;
                    247: \end{verbatim}\end{quote}
                    248: The first statement,
                    249: which clears the field in \verb"settings" by using \verb"ST_MASK",
                    250: is not required if \verb"settings" is initially \verb"0".
                    251: 
                    252: If the initiator indicates that the initial setting of a token is left to
                    253: the responder's choice,
                    254: then the responder must decide.
                    255: In Figure~\ref{setINITtokens},
                    256: an example of the \verb"dotokens" macro is presented.
                    257: In this example,
                    258: the responder examines the initial setting for each available token,
                    259: and:
                    260: \begin{itemize}
                    261: \item  Notes if the responder initially owns the token
                    262:        (the \verb"ST_RESP_VALUE" case); or,
                    263: \item  Gives ownership of the token to the initiator if the choice is
                    264:        at the responder's discretion
                    265:        (the \verb"ST_CALL_VALUE" case).
                    266: \end{itemize}
                    267: \tagrind[tp]{grind5b-2}{Determining the Initial Token Settings}{setINITtokens}
                    268: 
                    269: \subsection    {Server Initialization}
                    270: The \man tsapd(8c) daemon,
                    271: upon accepting a connection from an initiating host,
                    272: consults the ISO services database to determine which program
                    273: on the local system implements the desired TSAP entity.
                    274: In the case of the session service,
                    275: the \pgm{tsapd} program contains the bootstrap for the session provider.
                    276: The daemon will again consult the ISO services database to determine which
                    277: program on the system implements the desired SSAP entity.
                    278: 
                    279: Once the program has been ascertained,
                    280: the daemon runs the program with any arguments listed in the database.
                    281: In addition,
                    282: it appends some {\em magic arguments\/} to the argument vector.
                    283: Hence,
                    284: the very first action performed by the responder is to re-capture the SSAP
                    285: state contained in the magic arguments.
                    286: This is done by calling the routine \verb"SInit",
                    287: which on a successful return,
                    288: is equivalent to a {\sf S-CONNECT.INDICATION\/} from the session service
                    289: provider.
                    290: \begin{quote}\index{SInit}\small\begin{verbatim}
                    291: int     SInit (vecp, vec, ss, si)
                    292: int     vecp;
                    293: char  **vec;
                    294: struct SSAPstart *ss;
                    295: struct SSAPindication *si;
                    296: \end{verbatim}\end{quote}
                    297: The parameters to this procedure are:
                    298: \begin{describe}
                    299: \item[\verb"vecp":] the length of the argument vector;
                    300: 
                    301: \item[\verb"vec":] the argument vector;
                    302: 
                    303: \item[\verb"ss":] a pointer to a \verb"SSAPstart" structure, which is updated
                    304: only if the call succeeds;
                    305: and,
                    306: 
                    307: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                    308: updated only if the call fails.
                    309: \end{describe}
                    310: If \verb"SInit" is successful,
                    311: it returns information in the \verb"ss" parameter,
                    312: which is a pointer to a \verb"SSAPstart" structure.
                    313: \begin{quote}\index{SSAPstart}\small\begin{verbatim}
                    314: struct SSAPstart {
                    315:     int     ss_sd;
                    316: 
                    317:     struct SSAPref  ss_connect;
                    318: 
                    319:     struct SSAPaddr ss_calling;
                    320:     struct SSAPaddr ss_called;
                    321: 
                    322:     int     ss_requirements;
                    323:     int     ss_settings;
                    324:     long    ss_isn;
                    325: 
                    326:     int     ss_ssdusize;
                    327: 
                    328:     struct QOStype ss_qos;
                    329: 
                    330: #define SS_SIZE         512
                    331:     int     ss_cc;
                    332:     char    ss_data[SS_SIZE];
                    333: };
                    334: \end{verbatim}\end{quote}
                    335: The elements of this structure are:
                    336: \begin{describe}
                    337: \item[\verb"ss\_sd":] the session-descriptor to be used to reference this
                    338: connection;
                    339: 
                    340: \item[\verb"ss\_connect":] the connection identifier (a.k.a. SSAP reference)
                    341: used by the initiator;
                    342: 
                    343: \item[\verb"ss\_calling":] the address of the peer initiating the connection;
                    344: 
                    345: \item[\verb"ss\_called":] the address of the peer being asked to respond;
                    346: 
                    347: \item[\verb"ss\_requirements":] the proposed session requirements;
                    348: 
                    349: \item[\verb"ss\_settings":] the initial token settings;
                    350: 
                    351: \item[\verb"ss\_isn":] the initial serial-number;
                    352: 
                    353: \item[\verb"ss\_ssdusize":] the largest atomic SSDU size that can be used on
                    354: the connection (see the note on page~\pageref{SSDU:atomic});
                    355: 
                    356: \item[\verb"ss\_qos":] the quality of service on the connection
                    357: (see Section~\ref{tsap:qos});
                    358: and,
                    359: 
                    360: \item[\verb"ss\_data"/\verb"ss\_cc":] any initial data
                    361: (and the length of that data).
                    362: \end{describe}
                    363: 
                    364: The \verb"ss_connect" element is a \verb"SSAPref" structure,
                    365: which is passed transparently by the session service.
                    366: \begin{quote}\index{SSAPref}\small\begin{verbatim}
                    367: struct SSAPref {
                    368: #define SREF_USER_SIZE 64
                    369:     u_char sr_ulen;
                    370:     char    sr_udata[SREF_USER_SIZE];
                    371: 
                    372: #define SREF_COMM_SIZE 64
                    373:     u_char  sr_clen;
                    374:     char    sr_cdata[SREF_COMM_SIZE];
                    375: 
                    376: #define SREF_ADDT_SIZE 4
                    377:     u_char  sr_alen;
                    378:     char    sr_adata[SREF_ADDT_SIZE];
                    379: 
                    380:     u_char  sr_vlen;
                    381:     char    sr_vdata[SREF_USER_SIZE];
                    382: };
                    383: \end{verbatim}\end{quote}
                    384: The elements of this structure are:\label{SSAPref}
                    385: \begin{describe}
                    386: \item[\verb"sr\_udata"/\verb"sr\_ulen":] the user reference (and length of
                    387: that reference, which may not exceed \verb"SREF_USER_SIZE" octets);
                    388: 
                    389: \item[\verb"sr\_cdata"/\verb"sr\_clen":] the common reference (and length of
                    390: that reference, which may not exceed \verb"SREF_COMM_SIZE" octets);
                    391: 
                    392: \item[\verb"sr\_adata"/\verb"sr\_adata":] the additional reference (and length
                    393: of that reference, which may not exceed \verb"SREF_ADDT_SIZE" octets);
                    394: and,
                    395: 
                    396: \item[\verb"sr\_vdata"/\verb"sr\_vlen":] a second user reference (and length
                    397: of that reference, which may not exceed \verb"SREF_USER_SIZE" octets),
                    398: which is used only when starting or resuming an activity.
                    399: \end{describe}
                    400: 
                    401: If the call to the \verb"SInit" routine is not successful,
                    402: then a {\sf S-P-ABORT.IN\-DI\-CA\-TION\/} event is simulated,
                    403: and the relevant information is returned in a \verb"SSAPindication"
                    404: structure.\label{SSAPindication}
                    405: \begin{quote}\index{SSAPindication}\small\begin{verbatim}
                    406: struct SSAPindication {
                    407:     int     si_type;
                    408: #define SI_DATA         0x00
                    409: #define SI_TOKEN        0x01
                    410: #define SI_SYNC         0x02
                    411: #define SI_ACTIVITY     0x03
                    412: #define SI_REPORT       0x04
                    413: #define SI_FINISH       0x05
                    414: #define SI_ABORT        0x06
                    415: 
                    416:     union {
                    417:         struct SSAPdata si_un_data;
                    418:         struct SSAPtoken si_un_token;
                    419:         struct SSAPsync si_un_sync;
                    420:         struct SSAPactivity si_un_activity;
                    421:         struct SSAPreport si_un_report;
                    422:         struct SSAPfinish si_un_finish;
                    423:         struct SSAPabort si_un_abort;
                    424:     }   si_un;
                    425: #define si_data         si_un.si_un_data
                    426: #define si_token        si_un.si_un_token
                    427: #define si_sync         si_un.si_un_sync
                    428: #define si_activity     si_un.si_un_activity
                    429: #define si_report       si_un.si_un_report
                    430: #define si_finish       si_un.si_un_finish
                    431: #define si_abort        si_un.si_un_abort
                    432: };
                    433: \end{verbatim}\end{quote}
                    434: As shown, this structure is really a discriminated union
                    435: (a structure with a tag element followed by a union).
                    436: Hence, on a failure return,
                    437: one first coerces a pointer to the \verb"SSAPabort" structure contained
                    438: therein,
                    439: and then consults the elements of that structure.
                    440: \begin{quote}\index{SSAPabort}\small\begin{verbatim}
                    441: struct SSAPabort {
                    442:     int     sa_peer;
                    443: 
                    444:     int     sa_reason;
                    445: 
                    446: #define SA_SIZE         512
                    447:     int     sa_cc;
                    448:     char    sa_data[SA_SIZE];
                    449: };
                    450: \end{verbatim}\end{quote}
                    451: The elements of a \verb"SSAPabort" structure are:
                    452: \begin{describe}
                    453: \item[\verb"sa\_peer":] if set, indicates that a user-initiated abort occurred
                    454: (a {\sf S-U-ABORT.INDICATION\/} event);
                    455: if not set, indicates that a provider-initiated abort occurred
                    456: (a {\sf S-P-ABORT.INDICATION\/} event);
                    457: 
                    458: \item[\verb"sa\_reason":] the reason for the provider-initiated abort
                    459: (codes are listed in Table~\ref{SSAPreasons}),
                    460: meaningless if the abort is user-initiated;
                    461: and,
                    462: 
                    463: \item[\verb"sa\_data"/\verb"sa\_cc":] any abort data (and the length of that
                    464: data) from the peer (if \verb"sa_peer" is set) or
                    465: a diagnostic string from the provider (if \verb"sa_peer" is not set).
                    466: \end{describe}
                    467: \tagtable[tp]{5b-4}{SSAP Failure Codes}{SSAPreasons}
                    468: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
                    469: \bf NOTE:&     Although both \cite{ISO.SP.Protocol} and
                    470:                \cite{CCITT.SP.Protocol} both require a maximum length
                    471:                of \verb"9" octets for a user-initiated abort, the
                    472:                current implementation permits up to \verb"512" octets to
                    473:                be used.  Without this freedom, higher-layer protocols
                    474:                which use presentation encoding mechanisms would be unable
                    475:                to successfully use the session abort facility.
                    476: \end{tabular}}\]
                    477: 
                    478: After examining the information returned by \verb"SInit" on a successful call
                    479: (and possibly after examining the argument vector),
                    480: the responder should either accept or reject the connection.
                    481: For either response,
                    482: the responder should use
                    483: the \verb"SConnResponse" routine
                    484: (which corresponds to the {\sf S-CONNECT.RESPONSE\/} action).
                    485: \begin{quote}\index{SConnResponse}\small\begin{verbatim}
                    486: int     SConnResponse (sd, ref, called, result, requirements,
                    487:                 settings, isn, data, cc, si)
                    488: int     sd;
                    489: struct SSAPref *ref;
                    490: struct SSAPaddr *called;
                    491: int     result,
                    492:         requirements,
                    493:         settings,
                    494:         cc;
                    495: long   isn;
                    496: char   *data;
                    497: struct SSAPindication *si;
                    498: \end{verbatim}\end{quote}
                    499: The parameters to this procedure are:
                    500: \begin{describe}
                    501: \item[\verb"sd":] the session-descriptor;
                    502: 
                    503: \item[\verb"ref":]  the connection identifier used by the responder
                    504: (consult page~\pageref{SSAPref} for a description of the \verb"SSAPref"
                    505: structure);
                    506: 
                    507: \item[\verb"called":] the SSAP address of the responder (defaulting to the
                    508: called address, if not present);
                    509: 
                    510: \item[\verb"result":] the acceptance indicator
                    511: (either \verb"SC_ACCEPT" if the connection is to be accepted,
                    512: or one of the user-initiated abort error codes listed in
                    513: Table~\ref{SSAPreasons} on page~\pageref{SSAPreasons});
                    514: 
                    515: \item[\verb"requirements":] the responder's session requirements
                    516: (this may not include any requirements not listed in the initiator's session
                    517: requirements);
                    518: 
                    519: \item[\verb"settings":] the initial token settings
                    520: (for each token,
                    521: if the initiator specified \verb"ST_CALL_VALUE",
                    522: then the responder should specify either \verb"ST_INIT_VALUE" or
                    523: \verb"ST_RESP_VALUE";
                    524: instead,
                    525: if the initiator specified \verb"ST_INIT_VALUE",
                    526: and the responder wants the token,
                    527: it can specify the value \verb"ST_RSVD_VALUE".
                    528: This is interpreted by the service provider as a ``tokens please'' request;
                    529: 
                    530: \item[\verb"isn":] the initial serial-number;
                    531: 
                    532: \item[\verb"data"/\verb"cc":] any initial data (and the length of that data,
                    533: which may not exceed \verb"SC_SIZE" octets);
                    534: and,
                    535: 
                    536: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                    537: updated only if the call fails.
                    538: \end{describe}
                    539: If the call to \verb"SConnResponse" is successful,
                    540: and if the \verb"result" parameter is set to \verb"SC_ACCEPT",
                    541: then connection establishment has completed
                    542: and the users of the session service now operate as symmetric peers.
                    543: If the call is successful,
                    544: but the \verb"result" parameter is not \verb"SC_ACCEPT",
                    545: then the connection has been rejected and the responder may exit.
                    546: Otherwise, if the call fails and the reason is not an interface error
                    547: (see Table~\ref{SSAPreasons} on page~\pageref{SSAPreasons}),
                    548: then the connection is closed.
                    549: 
                    550: Note that when the responder rejects the connection,
                    551: it need not supply meaningful values for the the \verb"requirements",
                    552: \verb"settings", and \verb"isn" parameters.
                    553: The \verb"data"/\verb"cc" parameters are also optional,
                    554: but it is recommended that the responder return some diagnostic information.
                    555: 
                    556: \subsection    {Client Initialization}
                    557: A program wishing to connect to another user of session services calls the
                    558: \verb"SConnRequest" routine,
                    559: which corresponds to the {\sf S-CONNECT.REQUEST\/} action.
                    560: \begin{quote}\index{SConnRequest}\small\begin{verbatim}
                    561: int     SConnRequest (ref, calling, called, requirements,
                    562:                 settings, isn, data, cc, qos, sc, si)
                    563: struct SSAPref *ref;
                    564: struct SSAPaddr *calling,
                    565:                 *called;
                    566: int     requirements,
                    567:         settings,
                    568:         cc;
                    569: long   isn;
                    570: char   *data;
                    571: struct QOStype *qos;
                    572: struct SSAPconnect *sc;
                    573: struct SSAPindication *si;
                    574: \end{verbatim}\end{quote}
                    575: The parameters to this procedure are:
                    576: \begin{describe}
                    577: \item[\verb"ref":] the connection identifier used by the initiator
                    578: (consult page~\pageref{SSAPref} for a description of the \verb"SSAPref"
                    579: structure);
                    580: 
                    581: \item[\verb"calling":] the SSAP address of the responder;
                    582: 
                    583: \item[\verb"called":] the SSAP address of the initiator;
                    584: 
                    585: \item[\verb"requirements":] the session requirements;
                    586: 
                    587: \item[\verb"settings":] the initial token settings;
                    588: 
                    589: \item[\verb"isn":] the initial serial-number;
                    590: 
                    591: \item[\verb"data"/\verb"cc":] any initial data (and the length of that data,
                    592: which may not exceed \verb"SS_SIZE" octets);
                    593: 
                    594: \item[\verb"qos":] the quality of service on the connection
                    595: (see Section~\ref{tsap:qos});
                    596: 
                    597: \item[\verb"sc":] a pointer to a \verb"SSAPconnect" structure, which is
                    598: updated only if the call succeeds;
                    599: and,
                    600: 
                    601: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                    602: updated only if either:
                    603: \begin{itemize}
                    604: \item the call fails;
                    605: or,
                    606: 
                    607: \item the call succeeds,
                    608: but the value of the \verb"sc_result" element of the \verb"sc" parameter
                    609: is not \verb"SC_ACCEPT" (see below).
                    610: \end{itemize}
                    611: \end{describe}
                    612: If the call to \verb"SConnRequest" is successful
                    613: (a successful return corresponds to a {\sf S-CONNECT.CONFIRMATION\/} event),
                    614: then information is returned in the \verb"sc" parameter,
                    615: which is a pointer to a \verb"SSAPconnect" structure.
                    616: \begin{quote}\index{SSAPconnect}\small\begin{verbatim}
                    617: struct SSAPconnect {
                    618:     int     sc_sd;
                    619: 
                    620:     struct SSAPref  sc_connect;
                    621:     
                    622:     struct SSAPaddr sc_responding;
                    623: 
                    624:     int     sc_result;
                    625: 
                    626:     int     sc_requirements;
                    627:     int     sc_settings;
                    628:     int     sc_please;
                    629:     lnog    sc_isn;
                    630: 
                    631:     int     sc_ssdusize;
                    632: 
                    633:     struct QOStype sc_qos;
                    634: 
                    635: #define SC_SIZE         512
                    636:     int     sc_cc;
                    637:     char    sc_data[SC_SIZE];
                    638: };
                    639: \end{verbatim}\end{quote}
                    640: The elements of this structure are:
                    641: \begin{describe}
                    642: \item[\verb"sc\_sd":] the session-descriptor to be used to reference this
                    643: connection;
                    644: 
                    645: \item[\verb"sc\_connect":] the connection identifier used by the responder
                    646: (consult page~\pageref{SSAPref} for a description of the \verb"SSAPref"
                    647: structure);
                    648: 
                    649: \item[\verb"sc\_responding":] the responding peer's address
                    650: (which is the same as the \verb"called" parameter given to
                    651: \verb"SConnRequest");
                    652: 
                    653: \item[\verb"sc\_result":] the connection response;
                    654: 
                    655: \item[\verb"sc\_requirements":] the (negotiated) session requirements;
                    656: 
                    657: \item[\verb"sc\_settings":] the (negotiated) initial token settings;
                    658: 
                    659: \item[\verb"sc\_please":] the tokens which the responder wants to own
                    660: (if any);
                    661: 
                    662: \item[\verb"sc\_isn":] the (negotiated) initial serial-number;
                    663: 
                    664: \item[\verb"sc\_ssdusize":] the largest atomic SSDU size that can be used on
                    665: the connection (see the note on page~\pageref{SSDU:atomic});
                    666: 
                    667: \item[\verb"sc\_qos":] the quality of service on the connection
                    668: (see Section~\ref{tsap:qos});
                    669: and,
                    670: 
                    671: \item[\verb"sc\_data"/\verb"sc\_cc":] any initial data (and the length of
                    672: that data).
                    673: \end{describe}
                    674: If the call to \verb"SConnRequest" is successful,
                    675: and the \verb"sc_result" element is set to \verb"SC_ACCEPT",
                    676: then connection establishment has completed and the users of the session
                    677: service now operate as symmetric peers.
                    678: If the call is successful,
                    679: but the \verb"sc_result" element is not \verb"SC_ACCEPT",
                    680: then the connection has been rejected;
                    681: consult Table~\ref{SSAPreasons} to determine the reason
                    682: (further information can be found in the \verb"si" parameter).
                    683: Otherwise, if the call fails then the connection is not established and the
                    684: \verb"SSAPabort" structure of the \verb"SSAPindication" discriminated union
                    685: has been updated.
                    686: 
                    687: Normally \verb"SConnRequest" returns only after a connection has succeeded or
                    688: failed.
                    689: This is termed a {\em synchronous\/} connection initiation.
                    690: If the user desires, an {\em asynchronous\/} connection may be initiated.
                    691: The routine \verb"SConnRequest" is really a macro which calls the routine
                    692: \verb"SAsynConnRequest" with an argument indicating that a connection should
                    693: be attempted synchronously.
                    694: \begin{quote}\index{SAsynConnRequest}\small\begin{verbatim}
                    695: int     SAsynConnRequest (ref, calling, called,
                    696:                 requirements, settings, isn, data, cc,
                    697:                 qos, sc, si, async)
                    698: struct SSAPref *ref;
                    699: struct SSAPaddr *calling,
                    700:                 *called;
                    701: int     requirements,
                    702:         settings,
                    703:         cc,
                    704:         async;
                    705: long   isn;
                    706: char   *data;
                    707: struct QOStype *qos;
                    708: struct SSAPconnect *sc;
                    709: struct SSAPindication *si;
                    710: \end{verbatim}\end{quote}
                    711: The additional parameter to this procedure is:
                    712: \begin{describe}
                    713: \item[\verb"async":] whether the connection should be initiated asynchronously.
                    714: \end{describe}
                    715: If the \verb"async" parameter is non-zero,
                    716: then \verb"SAsynConnRequest" returns one of four values:
                    717: \verb"NOTOK", which indicates that the connection request failed;
                    718: \verb"DONE", which indicates that the connection request succeeded;
                    719: or, either of \verb"CONNECTING_1" or \verb"CONNECTING_2", which indicates that
                    720: the connection request is still in
                    721: progress.
                    722: In the first two cases,
                    723: the usual procedures for handling return values from \verb"SConnRequest" are
                    724: employed
                    725: (i.e., a \verb"NOTOK" return from \verb"SAsynConnRequest" is equivalent to a
                    726: \verb"NOTOK" return from \verb"SConnRequest", and,
                    727: a \verb"DONE" return from \verb"SAsynConnRequest" is equivalent to a
                    728: \verb"OK" return from \verb"SConnRequest").
                    729: In the final case, when either \verb"CONNECTING_1" or
                    730: \verb"CONNECTING_2" is returned,
                    731: only the \verb"sc_sd" element of the \verb"sc" parameter has been updated;
                    732: it reflects the session-descriptor to be used to reference this connection.
                    733: Note that the \verb"data" parameter is still being referenced by
                    734: \man libssap(3n) and should not be tampered with until the connection attempt
                    735: has been completed.
                    736: 
                    737: To determine when the connection attempt has been completed,
                    738: the routine \verb"xselect" (consult Section~\ref{acs:select} of \volone/)
                    739: should be used after calling \verb"SSelectMask".
                    740: In order to determine if the connection attempt is successful,
                    741: the \verb"SAsynRetryRequest" routine is called:
                    742: \begin{quote}\index{SAsynRetryRequest}\small\begin{verbatim}
                    743: int     SAsynRetryRequest (sd, sc, si)
                    744: int     sd;
                    745: struct SSAPconnect *sc;
                    746: struct SSAPindication  *si;
                    747: \end{verbatim}\end{quote}
                    748: The parameters to this procedure are:
                    749: \begin{describe}
                    750: \item[\verb"sd":] the session-descriptor;
                    751: 
                    752: \item[\verb"sc":] a pointer to a \verb"SSAPconnect" structure, which is
                    753: updated only if the call succeeds;
                    754: and,
                    755: 
                    756: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                    757: updated only if the call fails.
                    758: \end{describe}
                    759: Again, one of three values are returned:
                    760: \verb"NOTOK", which indicates that the connection request failed;
                    761: \verb"DONE", which indicates that the connection request succeeded;
                    762: and, \verb"CONNECTING_1" or \verb"CONNECTING_2" which indicates that
                    763: the connection request is still in progress.
                    764: 
                    765: Refer to Section~\ref{tsap:async} on page~\pageref{tsap:async} for information
                    766: on how to make efficient use of the asynchronous connection facility.
                    767: 
                    768: \section      {Data Transfer}
                    769: Once the connection has been established,
                    770: a session-descriptor is used to reference the connection.
                    771: This is usually the first parameter given to any of the remaining routines in
                    772: the \man libssap(3n) library.
                    773: Further,
                    774: the last parameter is usually a pointer to a \verb"SSAPindication" structure
                    775: (as described on page~\pageref{SSAPindication}).
                    776: If a call to one of these routines fails,
                    777: then the structure is updated.
                    778: Consult the \verb"SSAPabort" element of the \verb"SSAPindication" structure.
                    779: If the \verb"sa_reason" element of the \verb"SSAPabort" structure is
                    780: associated with a fatal error,
                    781: then the connection is closed.
                    782: That is, a {\sf S-P-ABORT.INDICATION\/} event has occurred.
                    783: The \verb"SC_FATAL" macro can be used to determine this.
                    784: \begin{quote}\index{SC\_FATAL}\small\begin{verbatim}
                    785: int     SC_FATAL (r)
                    786: int     r;
                    787: \end{verbatim}\end{quote}
                    788: The most common interface error to occur is \verb"SC_OPERATION" which usually
                    789: indicates that either the user is lacking ownership of a session token
                    790: to perform an operation,
                    791: or that a session requirement required by the operation was not negotiated
                    792: during connection establishment.
                    793: For protocol purists,
                    794: the \verb"SC_OFFICIAL" macro can be used to determine if the error is an
                    795: ``official'' error as defined by the specification,
                    796: or an ``unofficial'' error used by the implementation.
                    797: \begin{quote}\index{SC\_OFFICIAL}\small\begin{verbatim}
                    798: int     SC_OFFICIAL (r)
                    799: int     r;
                    800: \end{verbatim}\end{quote}
                    801: 
                    802: \subsection    {Sending Data}
                    803: There are six routines which may be used to send data.
                    804: A call to the \verb"SDataRequest" routine is equivalent to a
                    805: {\sf S-DATA.REQUEST\/} action on the part of the user.
                    806: \begin{quote}\index{SDataRequest}\small\begin{verbatim}
                    807: int     SDataRequest (sd, data, cc, si)
                    808: int     sd;
                    809: char   *data;
                    810: int     cc;
                    811: struct SSAPindication  *si;
                    812: \end{verbatim}\end{quote}
                    813: The parameters to this procedure are:
                    814: \begin{describe}
                    815: \item[\verb"sd":] the session-descriptor;
                    816: 
                    817: \item[\verb"data"/\verb"cc":] the data to be written (and the length of that
                    818: data);
                    819: and,
                    820: 
                    821: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
                    822: only if the call fails.
                    823: \end{describe}
                    824: If the call to \verb"SDataRequest" is successful,
                    825: then the data has been queued for sending to the peer.
                    826: Otherwise the \verb"SSAPabort" structure contained in
                    827: the \verb"SSAPindication" parameter
                    828: \verb"si" contains the reason for failure.
                    829: 
                    830: A call to the \verb"SExpdRequest" routine is equivalent to a
                    831: {\sf S-EXPEDITED-DATA.REQUEST\/} action on the part of the user.
                    832: \begin{quote}\index{SExpdRequest}\small\begin{verbatim}
                    833: int     SExpdRequest (sd, data, cc, si)
                    834: int     sd;
                    835: char   *data;
                    836: int     cc;
                    837: struct SSAPindication  *si;
                    838: \end{verbatim}\end{quote}
                    839: The parameters to this procedure are:
                    840: \begin{describe}
                    841: \item[\verb"sd":] the session-descriptor;
                    842: 
                    843: \item[\verb"data"/\verb"cc":] the data to be written (and the length of that
                    844: data, which may not exceed \verb"SX_SIZE" octets);
                    845: and,
                    846: 
                    847: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
                    848: only if the call fails.
                    849: \end{describe}
                    850: If the call to \verb"SExpdRequest" is successful,
                    851: then the data has been queued for expedited sending.
                    852: Otherwise the \verb"SSAPabort" element of the \verb"si" parameter
                    853: contains the reason for failure.
                    854: 
                    855: A call to the \verb"STypedRequest" routine is equivalent to a
                    856: {\sf S-TYP\-ED-DA\-TA.RE\-QUEST\/} action on the part of the user.
                    857: \begin{quote}\index{STypedRequest}\small\begin{verbatim}
                    858: int     STypedRequest (sd, data, cc, si)
                    859: int     sd;
                    860: char   *data;
                    861: int     cc;
                    862: struct SSAPindication  *si;
                    863: \end{verbatim}\end{quote}
                    864: The parameters to this procedure are:
                    865: \begin{describe}
                    866: \item[\verb"sd":] the session-descriptor;
                    867: 
                    868: \item[\verb"data"/\verb"cc":] the data to be written (and the length of that
                    869: data);
                    870: and,
                    871: 
                    872: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
                    873: only if the call fails.
                    874: \end{describe}
                    875: If  the call to \verb"STypedRequest" is successful,
                    876: then the data has been queued for sending to the peer.
                    877: Otherwise the \verb"SSAPabort" structure contained in
                    878: the \verb"SSAPindication" parameter
                    879: \verb"si" contains the reason for failure.
                    880: 
                    881: A call to the \verb"SCapdRequest" routine is equivalent to a {\sf
                    882: S-CAPABILITY-DATA.REQUEST\/} action on the part of the user.
                    883: \begin{quote}\index{SCapdRequest}\small\begin{verbatim}
                    884: int     SCapdRequest (sd, data, cc, si)
                    885: int     sd;
                    886: char   *data;
                    887: int     cc;
                    888: struct SSAPindication  *si;
                    889: \end{verbatim}\end{quote}
                    890: The parameters to this procedure are:
                    891: \begin{describe}
                    892: \item[\verb"sd":] the session-descriptor;
                    893: 
                    894: \item[\verb"data"/\verb"cc":] the data to be written (and the length of that
                    895: data, which may not exceed \verb"SX_CDSIZE" octets);
                    896: and,
                    897: 
                    898: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
                    899: only if the call fails.
                    900: \end{describe}
                    901: If the call to \verb"SCapdRequest" is successful,
                    902: then the data has been queued for sending.
                    903: When the {\sf S-CAPABILITY-DATA.CONFIRMATION\/} event is received,
                    904: the data has been successfully received.
                    905: Otherwise the \verb"SSAPabort" structure contained in
                    906: the \verb"SSAPindication" parameter
                    907: \verb"si" contains the reason for failure.
                    908: 
                    909: Upon receiving a {\sf S-CAPABILITY-DATA.INDICATION\/} event,
                    910: the user is required to generate a {\sf S-CAPABILITY-DATA.RESPONSE\/} action
                    911: using the \verb"SCapdResponse" routine.
                    912: \begin{quote}\index{SCapdResponse}\small\begin{verbatim}
                    913: int     SCapdResponse (sd, data, cc, si)
                    914: int     sd;
                    915: char   *data;
                    916: int     cc;
                    917: struct SSAPindication  *si;
                    918: \end{verbatim}\end{quote}
                    919: The parameters to this procedure are:
                    920: \begin{describe}
                    921: \item[\verb"sd":] the session-descriptor;
                    922: 
                    923: \item[\verb"data"/\verb"cc":] the data to be written (and the length of that
                    924: data, which may not exceed \verb"SX_CDASIZE" octets);
                    925: and,
                    926: 
                    927: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
                    928: only if the call fails.
                    929: \end{describe}
                    930: If  the call to \verb"SCapdResponse" is successful,
                    931: then the data has been queued for sending to the peer.
                    932: Otherwise the \verb"SSAPabort" structure contained in
                    933: the \verb"SSAPindication" parameter
                    934: \verb"si" contains the reason for failure.
                    935: 
                    936: The \verb"SWriteRequest" routine is similar in nature to the
                    937: \verb"SDataRequest" and \verb"STypedRequest" routines,
                    938: but uses a different set of parameters.
                    939: The invocation is:
                    940: \begin{quote}\index{SWriteRequest}\small\begin{verbatim}
                    941: int     SWriteRequest (sd, typed, uv, si)
                    942: int     sd;
                    943: int     typed;
                    944: struct udvec *uv;
                    945: int     cc;
                    946: \end{verbatim}\end{quote}
                    947: The parameters to this procedure are:
                    948: \begin{describe}
                    949: \item[\verb"sd":] the session-descriptor;
                    950: 
                    951: \item[\verb"typed":] whether this is typed-data or not;
                    952: 
                    953: \item[\verb"uv":] the data to be written,
                    954: described in a null-terimated array of scatter/gather elements;
                    955: and,
                    956: 
                    957: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
                    958: only if the call fails.
                    959: \end{describe}
                    960: If the call to \verb"SWriteRequest" is successful,
                    961: then the data has been queued for sending to the peer.
                    962: Otherwise the \verb"SSAPabort" structure contained in
                    963: the \verb"SSAPindication" parameter
                    964: \verb"si" contains the reason for failure.
                    965: 
                    966: \subsection    {Receiving Data}
                    967: There is one routine used to read data,
                    968: \verb"SReadRequest",
                    969: a call to which is equivalent to waiting for an event
                    970: (usually an incoming data event) to occur.
                    971: \begin{quote}\index{SReadRequest}\small\begin{verbatim}
                    972: int     SReadRequest (sd, sx, secs, si)
                    973: int     sd;
                    974: struct SSAPdata *sx;
                    975: int     secs;
                    976: struct SSAPindication  *si;
                    977: \end{verbatim}\end{quote}
                    978: The parameters to this procedure are:
                    979: \begin{describe}
                    980: \item[\verb"sd":] the session-descriptor;
                    981: 
                    982: \item[\verb"sx":] a pointer to the \verb"SSAPdata" structure to be given
                    983: the data;
                    984: 
                    985: \item[\verb"secs":] the maximum number of seconds to wait for the data
                    986: (a value of \verb"NOTOK" indicates that the call should block indefinitely,
                    987: whereas a value of \verb"OK" indicates that the call should not block at all,
                    988: e.g., a polling action);
                    989: and,
                    990: 
                    991: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
                    992: only if data is not read.
                    993: \end{describe}
                    994: Unlike the other routines in the \man libssap(3n) library,
                    995: the \verb"SReadRequest" routine returns one of three values:
                    996: \verb"NOTOK" (on failure),
                    997: \verb"OK" (on reading data),
                    998: or
                    999: \verb"DONE" (otherwise).
                   1000: 
                   1001: If the call to \verb"SReadRequest" returns the manifest constant \verb"OK",
                   1002: then the data has been read into the \verb"sx" parameter,
                   1003: which is a pointer to a \verb"SSAPdata" structure.
                   1004: \begin{quote}\index{SSAPdata}\small\begin{verbatim}
                   1005: struct SSAPdata {
                   1006:     int     sx_type;
                   1007: #define SX_NORMAL       0x00
                   1008: #define SX_EXPEDITED    0x01
                   1009: #define SX_TYPED        0x02
                   1010: #define SX_CAPDIND      0x03
                   1011: #define SX_CAPDCNF      0x04
                   1012: 
                   1013:     int     sx_cc;
                   1014:     struct qbuf sx_qbuf;
                   1015: };
                   1016: \end{verbatim}\end{quote}
                   1017: The elements of a \verb"SSAPdata" structure are:
                   1018: \begin{describe}
                   1019: \item[\verb"sx\_type":] indicates how the data was received:
                   1020: \[\begin{tabular}{|l|l|}
                   1021: \hline
                   1022:     \multicolumn{1}{|c|}{\bf Value}&
                   1023:                \multicolumn{1}{c|}{\bf Event}\\
                   1024: \hline
                   1025:     \tt SX\_NORMAL&    \sf S-DATA.INDICATION\\
                   1026:     \tt SX\_EXPEDITED& \sf S-EXPEDITED-DATA.INDICATION\\
                   1027:     \tt SX\_TYPED&     \sf S-TYPED-DATA.INDICATION\\
                   1028:     \tt SX\_CAPDIND&   \sf S-CAPABILITY-DATA.INDICATION\\
                   1029:     \tt SX\_CAPDCNF&   \sf S-CAPABILITY-DATA.CONFIRMATION\\
                   1030: \hline
                   1031: \end{tabular}\]
                   1032: 
                   1033: \item[\verb"sx\_cc":] the total number of octets that was read;
                   1034: and,
                   1035: 
                   1036: \item[\verb"sx\_qbuf":] the data that was read in a buffer-queue form
                   1037: (see page~\pageref{tsap:qbuf} for a description of this structure).
                   1038: \end{describe}
                   1039: Note that the data contained in the structure was allocated via \man malloc(3),
                   1040: and should be released by using the \verb"SXFREE" macro when no longer
                   1041: referenced.
                   1042: The \verb"SXFREE" macro,
                   1043: behaves as if it was defined as:\label{SXFREE}
                   1044: \begin{quote}\index{SXFREE}\small\begin{verbatim}
                   1045: void    SXFREE (sx)
                   1046: struct SSAPdata *sx;
                   1047: \end{verbatim}\end{quote}
                   1048: The macro frees only the data allocated by \verb"SReadRequest",
                   1049: and not the \verb"SSAPdata" structure itself.
                   1050: Further,
                   1051: \verb"SXFREE" should be called only if the call to the \verb"SReadRequest"
                   1052: routine returned \verb"OK".
                   1053: 
                   1054: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
                   1055: \bf NOTE:&     Because the \verb"SSAPdata" structure contains a
                   1056:                \verb"qbuf" element, care must be taken in initializing
                   1057:                and copying variables of this type.
                   1058:                The routines in \man libssap(3n) library will correctly
                   1059:                initialize these structures when given as parameters.
                   1060:                But, users who otherwise manipulate these structures 
                   1061:                should take great care.
                   1062: \end{tabular}}\]
                   1063: 
                   1064: Otherwise if the call to \verb"SReadRequest" returns the manifest constant
                   1065: \verb"NOTOK",
                   1066: then the \verb"SSAPabort" structure contained in
                   1067: the \verb"SSAPindication" parameter
                   1068: \verb"si" contains the reason for failure.
                   1069: 
                   1070: If the call to \verb"SReadRequest" returns the manifest constant \verb"DONE",
                   1071: then some event other than data arrival has occurred.
                   1072: This event is encoded in the \verb"si" parameter,
                   1073: depending on the value of the \verb"si_type" element.
                   1074: When \verb"SReadRequest" returns \verb"DONE",
                   1075: the \verb"si_type" element may be set to one of five values:
                   1076: \[\begin{tabular}{|l|l|}
                   1077: \hline
                   1078:     \multicolumn{1}{|c|}{\bf Value}&
                   1079:                        \multicolumn{1}{c|}{\bf Event}\\
                   1080: \hline
                   1081:     \tt SI\_TOKEN&     Token management\\
                   1082:     \tt SI\_SYNC&      Synchronization management\\
                   1083:     \tt SI\_ACTIVITY&  Activity management\\
                   1084:     \tt SI\_REPORT&    Exception reporting\\
                   1085:     \tt SI\_FINISH&    Connection release\\
                   1086: \hline
                   1087: \end{tabular}\]
                   1088: 
                   1089: \subsubsection {Token Indications}
                   1090: When an event associated with token management occurs,
                   1091: the \verb"si_type" field of the \verb"si" parameter contains the value
                   1092: \verb"SI_TOKEN",
                   1093: and a \verb"SSAPtoken" structure is contained inside the \verb"si" parameter.
                   1094: \begin{quote}\index{SSAPtoken}\small\begin{verbatim}
                   1095: struct SSAPtoken {
                   1096:     int     st_type;
                   1097: #define ST_GIVE         0x00
                   1098: #define ST_PLEASE       0x01
                   1099: #define ST_CONTROL      0x02
                   1100: 
                   1101:     u_char  st_tokens;
                   1102:     u_char  st_owned;
                   1103: 
                   1104: #define ST_SIZE         512
                   1105:     int     st_cc;
                   1106:     char    st_data[ST_SIZE];
                   1107: };
                   1108: \end{verbatim}\end{quote}
                   1109: The elements of a \verb"SSAPtoken" structure are:
                   1110: \begin{describe}
                   1111: \item[\verb"st\_type":] defines the token management indication which
                   1112: occurred:
                   1113: \[\begin{tabular}{|l|l|}
                   1114: \hline
                   1115:     \multicolumn{1}{|c|}{\bf Value}&
                   1116:                \multicolumn{1}{c|}{\bf Event}\\
                   1117: \hline
                   1118:     \tt ST\_GIVE&      \sf S-TOKEN-GIVE.INDICATION\\
                   1119:     \tt ST\_PLEASE&    \sf S-TOKEN-PLEASE.INDICATION\\
                   1120:     \tt ST\_CONTROL&   \sf S-GIVE-CONTROL.INDICATION\\
                   1121: \hline
                   1122: \end{tabular}\]
                   1123: 
                   1124: \item[\verb"st\_tokens":] the session tokens requested or given;
                   1125: 
                   1126: \item[\verb"st\_owned":] all of the session tokens currently owned by the
                   1127: user;
                   1128: and,
                   1129: 
                   1130: \item[\verb"st\_base"/\verb"st\_cc":]
                   1131: associated data (and the length of that data) if tokens are requested.
                   1132: \end{describe}
                   1133: It is entirely at the discretion of the user what actions are to be taken when
                   1134: an indication event associated with token management occurs.
                   1135: 
                   1136: \subsubsection {Synchronization Indications}
                   1137: When an event associated with synchronization occurs,
                   1138: the \verb"si_type" field of the \verb"si" parameter contains the value
                   1139: \verb"SI_SYNC",
                   1140: and a \verb"SSAPsync" structure is contained inside the \verb"si" parameter.
                   1141: \begin{quote}\index{SSAPsync}\small\begin{verbatim}
                   1142: struct SSAPsync {
                   1143:     int     sn_type;
                   1144: #define SN_MAJORIND     0x00
                   1145: #define SN_MAJORCNF     0x01
                   1146: #define SN_MINORIND     0x02
                   1147: #define SN_MINORCNF     0x03
                   1148: #define SN_RESETIND     0x04
                   1149: #define SN_RESETCNF     0x05
                   1150: 
                   1151:     int     sn_options;
                   1152: #define SYNC_CONFIRM    1
                   1153: #define SYNC_NOCONFIRM  0
                   1154: 
                   1155: #define SYNC_RESTART    0
                   1156: #define SYNC_ABANDON    1
                   1157: #define SYNC_SET        2
                   1158: 
                   1159:     long    sn_ssn;
                   1160: #define SERIAL_NONE     (-1L)
                   1161: #define SERIAL_MIN      000000L
                   1162: #define SERIAL_MAX      999998L
                   1163: 
                   1164:     int     sn_settings;
                   1165: 
                   1166: #define SN_SIZE         512
                   1167:     int     sn_cc;
                   1168:     char    sn_data[SN_SIZE];
                   1169: };
                   1170: \end{verbatim}\end{quote}
                   1171: The elements of a \verb"SSAPsync" structure are:
                   1172: \begin{describe}
                   1173: \item[\verb"sn\_type":] defines the synchronization management indication
                   1174: which occurred:
                   1175: \[\begin{tabular}{|l|l|}
                   1176: \hline
                   1177:     \multicolumn{1}{|c|}{\bf Value}&
                   1178:                \multicolumn{1}{c|}{\bf Event}\\
                   1179: \hline
                   1180:        \tt SN\_MAJORIND&       \sf S-MAJOR-SYNC.INDICATION\\
                   1181:        \tt SN\_MAJORCNF&       \sf S-MAJOR-SYNC.CONFIRMATION\\
                   1182:        \tt SN\_MINORIND&       \sf S-MINOR-SYNC.INDICATION\\
                   1183:        \tt SN\_MINORCNF&       \sf S-MINOR-SYNC.CONFIRMATION\\
                   1184:        \tt SN\_RESETIND&       \sf S-RESYNCHRONIZE.INDICATION\\
                   1185:        \tt SN\_RESETCNF&       \sf S-RESYNCHRONIZE.CONFIRMATION\\
                   1186: \hline
                   1187: \end{tabular}\]
                   1188: 
                   1189: \item[\verb"sn\_options":] various modifiers of the indication.
                   1190: For the minorsync indication (as described in Section~\ref{sync:mgmt}
                   1191: on page~\pageref{sync:mgmt}):
                   1192: \[\begin{tabular}{|l|l|}
                   1193: \hline
                   1194:     \multicolumn{1}{|c|}{\bf Value}&
                   1195:                \multicolumn{1}{c|}{\bf Modifier}\\
                   1196: \hline
                   1197:     \tt SYNC\_CONFIRM&         peer wants explicit confirmation\\
                   1198:     \tt SYNC\_NOCONFIRM&       peer doesn't want explicit confirmation\\
                   1199: \hline
                   1200: \end{tabular}\]
                   1201: For the resync indication (also described in Section~\ref{sync:mgmt}):
                   1202: \[\begin{tabular}{|l|l|}
                   1203: \hline
                   1204:     \multicolumn{1}{|c|}{\bf Value}&
                   1205:                \multicolumn{1}{c|}{\bf Modifier}\\
                   1206: \hline
                   1207:     \tt SYNC\_RESTART& a ``restart'' resynchronization is requested\\
                   1208:     \tt SYNC\_ABANDON& a ``abandon'' resynchronization is requested\\
                   1209:     \tt SYNC\_SET&     a ``set'' resynchronization is requested\\
                   1210: \hline
                   1211: \end{tabular}\]
                   1212: 
                   1213: \item[\verb"sn\_ssn":] the serial-number associated with this synchronization
                   1214: management event;
                   1215: 
                   1216: \item[\verb"sn\_settings":] for resync events,
                   1217: the proposed (resync indication) or new (resync confirmation) token settings;
                   1218: and,
                   1219: 
                   1220: \item[\verb"sn\_data"/\verb"sn\_cc":] associated data
                   1221: (and the length of that data).
                   1222: \end{describe}
                   1223: Note that for minorsync events,
                   1224: the user is not obligated to confirm the synchronization point
                   1225: even if the originator requested it.
                   1226: 
                   1227: \subsubsection {Activity Indications}
                   1228: When an event associated with activity management occurs,
                   1229: the \verb"si_type" field of the \verb"si" parameter contains the value
                   1230: \verb"SI_ACTIVITY",
                   1231: and the \verb"si" parameter contains a \verb"SSAPactivity" structure.
                   1232: \begin{quote}\index{SSAPactivity}\small\begin{verbatim}
                   1233: struct SSAPactivity {
                   1234:     int     sv_type;
                   1235: #define SV_START        0x00
                   1236: #define SV_RESUME       0x01
                   1237: #define SV_INTRIND      0x02
                   1238: #define SV_INTRCNF      0x03
                   1239: #define SV_DISCIND      0x04
                   1240: #define SV_DISCCNF      0x05
                   1241: #define SV_ENDIND       0x06
                   1242: #define SV_ENDCNF       0x07
                   1243: 
                   1244:     struct SSAPactid sv_id;
                   1245: 
                   1246:     struct SSAPactid sv_oid;
                   1247:     struct SSAPref   sv_connect;
                   1248: 
                   1249:     long    sv_ssn;
                   1250: 
                   1251:     int     sv_reason;
                   1252: 
                   1253: #define SV_SIZE         512
                   1254:     int     sv_cc;
                   1255:     char    sv_data[SV_SIZE];
                   1256: };
                   1257: \end{verbatim}\end{quote}
                   1258: The elements of a \verb"SSAPactivity" structure are:
                   1259: \begin{describe}
                   1260: \item[\verb"sv\_type":] defines the activity management indication which
                   1261: occurred:
                   1262: \[\begin{tabular}{|l|l|}
                   1263: \hline
                   1264:     \multicolumn{1}{|c|}{\bf Value}&
                   1265:                \multicolumn{1}{c|}{\bf Event}\\
                   1266: \hline
                   1267:        \tt SV\_START&          \sf S-ACTIVITY-START.INDICATION\\
                   1268:        \tt SV\_RESUME&         \sf S-ACTIVITY-RESUME.INDICATION\\
                   1269:        \tt SV\_INTRIND&        \sf S-ACTIVITY-INTERRUPT.INDICATION\\
                   1270:        \tt SV\_INTRCNF&        \sf S-ACTIVITY-INTERRUPT.CONFIRMATION\\
                   1271:        \tt SV\_DISCIND&        \sf S-ACTIVITY-DISCARD.INDICATION\\
                   1272:        \tt SV\_DISCCNF&        \sf S-ACTIVITY-DISCARD.CONFIRMATION\\
                   1273:        \tt SV\_ENDIND&         \sf S-ACTIVITY-END.INDICATION\\
                   1274:        \tt SV\_ENDCNF&         \sf S-ACTIVITY-END.CONFIRMATION\\
                   1275: \hline
                   1276: \end{tabular}\]
                   1277: 
                   1278: \item[\verb"sv\_id":] the activity identifier for an activity start
                   1279: or resume indication;
                   1280: 
                   1281: \item[\verb"sv\_oid":] the previous activity identifier for an activity resume
                   1282: indication (see page~\pageref{SSAPactref});
                   1283: 
                   1284: \item[\verb"sv\_connect":] the previous connection identifier for an activity
                   1285: resume indication;
                   1286: 
                   1287: \item[\verb"sv\_ssn":] the serial-number for an activity resume or end
                   1288: indication;
                   1289: 
                   1290: \item[\verb"sv\_reason":] the reason for an activity interrupt or discard
                   1291: indication (codes are listed in Table~\ref{SSAPexceptions});
                   1292: and,
                   1293: 
                   1294: \item[\verb"sv\_data"/\verb"sv\_cc":] associated data (and the length of that
                   1295: data).
                   1296: \end{describe}
                   1297: \tagtable[tp]{5b-5}{SSAP Exception Codes}{SSAPexceptions}
                   1298: 
                   1299: \subsubsection {Report Indications}
                   1300: When an event associated with exception reporting occurs,
                   1301: the \verb"si_type" field of the \verb"si" parameter contains the value
                   1302: \verb"SI_REPORT",
                   1303: and a \verb"SSAPreport" structure is contained inside the \verb"si"
                   1304: parameter.
                   1305: \begin{quote}\index{SSAPreport}\small\begin{verbatim}
                   1306: struct SSAPreport {
                   1307:     int     sp_peer;
                   1308: 
                   1309:     int     sp_reason;
                   1310: 
                   1311: #define SP_SIZE         512
                   1312:     int     sp_cc;
                   1313:     char    sp_data[SP_SIZE];
                   1314: };
                   1315: \end{verbatim}\end{quote}
                   1316: The elements of a \verb"SSAPreport" structure are:
                   1317: \begin{describe}
                   1318: \item[\verb"sp\_peer":] if set, indicates that a user-initiated
                   1319: report occurred (a {\sf S-U-EXCEPTION-REPORT.INDICATION\/} event);
                   1320: if not set,
                   1321: indicates that a provider-initiated report occurred
                   1322: (a {\sf S-P-EXCEPTION-REPORT.INDICATION\/} event);
                   1323: 
                   1324: \item[\verb"sp\_reason":] the reason for the report
                   1325: (codes are listed in Table~\ref{SSAPexceptions} on
                   1326: page~\pageref{SSAPexceptions});
                   1327: and,
                   1328: 
                   1329: \item[\verb"sp\_data"/\verb"sp\_cc":] any report data
                   1330: (and the length of that data) from the peer;
                   1331: meaningless if the report is provider-initiated.
                   1332: \end{describe}
                   1333: 
                   1334: \subsubsection {Finish Indication}
                   1335: When a {\sf S-RELEASE.INDICATION\/} event occurs,
                   1336: the \verb"si_type" field of the \verb"si" parameter contains the value
                   1337: \verb"SI_FINISH",
                   1338: and a \verb"SSAPfinish" structure is contained inside the \verb"si" parameter.
                   1339: \begin{quote}\index{SSAPfinish}\small\begin{verbatim}
                   1340: struct SSAPfinish {
                   1341: #define SF_SIZE         512
                   1342:     int     sf_cc;
                   1343:     char    sf_data[SF_SIZE];
                   1344: };
                   1345: \end{verbatim}\end{quote}
                   1346: The elements of a \verb"SSAPfinish" structure are:
                   1347: \begin{describe}
                   1348: \item[\verb"sf\_data"/\verb"sf\_cc":] any final data (and the length of that
                   1349: data).
                   1350: \end{describe}
                   1351: 
                   1352: \subsection    {Token Management}
                   1353: The fundamental aspect of token management deals with transferring ownership
                   1354: of the tokens.
                   1355: 
                   1356: \subsubsection {Sending Tokens}
                   1357: To transfer ownership of one or more session tokens to the remote
                   1358: user,
                   1359: the \verb"SGTokenRequest" routine is called
                   1360: (which corresponds to the {\sf S-TOKEN-GIVE.REQUEST\/} action).
                   1361: \begin{quote}\index{SGTokenRequest}\small\begin{verbatim}
                   1362: int     SGTokenRequest (sd, tokens, si)
                   1363: int     sd;
                   1364: int     tokens;
                   1365: struct SSAPindication  *si;
                   1366: \end{verbatim}\end{quote}
                   1367: The parameters to this procedure are:
                   1368: \begin{describe}
                   1369: \item[\verb"sd":] the session-descriptor;
                   1370: 
                   1371: \item[\verb"tokens":] the tokens to be transferred;
                   1372: and,
                   1373: 
                   1374: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1375: updated only if the call fails.
                   1376: \end{describe}
                   1377: If the call to \verb"SGTokenRequest" is successful,
                   1378: then ownership of the tokens has been transferred to the remote user.
                   1379: 
                   1380: If activity management has been selected,
                   1381: then the ownership of all tokens can be transferred using the
                   1382: \verb"SGControlRequest" routine
                   1383: (which corresponds to the {\sf S-CONTROL-GIVE.REQUEST\/} action).
                   1384: \begin{quote}\index{SGControlRequest}\small\begin{verbatim}
                   1385: int     SGControlRequest (sd, si)
                   1386: int     sd;
                   1387: struct SSAPindication  *si;
                   1388: \end{verbatim}\end{quote}
                   1389: The parameters to this procedure are:
                   1390: \begin{describe}
                   1391: \item[\verb"sd":] the session-descriptor;
                   1392: and,
                   1393: 
                   1394: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1395: updated only if the call fails.
                   1396: \end{describe}
                   1397: If the call to \verb"SGControlRequest" is successful,
                   1398: then ownership of all available tokens has been transferred to the remote user.
                   1399: Until this transfer of ownership is acknowledged,
                   1400: other token management functions will (non-fatally) fail.
                   1401: 
                   1402: \subsubsection {Requesting Tokens}
                   1403: To request ownership of one or more session tokens,
                   1404: the \verb"SPTokenRequest" routine is called
                   1405: (which corresponds to the {\sf S-TOKEN-PLEASE.REQUEST\/} action).
                   1406: \begin{quote}\index{SPTokenRequest}\small\begin{verbatim}
                   1407: int     SPTokenRequest (sd, tokens, data, cc, si)
                   1408: int     sd;
                   1409: int     tokens,
                   1410:         cc;
                   1411: char   *data;
                   1412: struct SSAPindication  *si;
                   1413: \end{verbatim}\end{quote}
                   1414: The parameters to this procedure are:
                   1415: \begin{describe}
                   1416: \item[\verb"sd":] the session-descriptor;
                   1417: 
                   1418: \item[\verb"tokens":] the tokens to requested;
                   1419: 
                   1420: \item[\verb"data"/\verb"cc":] any additional data
                   1421: (and the length of that data, which may not exceed \verb"ST_SIZE" octets);
                   1422: and,
                   1423: 
                   1424: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1425: updated only if the call fails.
                   1426: \end{describe}
                   1427: If the call to \verb"SPTokenRequest" is successful,
                   1428: then the remote user has been notified of the request;
                   1429: however, the ownership of the tokens is not actually transferred until the
                   1430: session provider notifies the user with a {\sf S-TOKEN-GIVE-INDICATION\/}
                   1431: event,
                   1432: which typically occurs on the next call to \verb"SReadRequest".
                   1433: 
                   1434: \subsection    {Synchronization Management}\label{sync:mgmt}
                   1435: There are three types of synchronization services:
                   1436: majorsyncs, minorsyncs, and resyncs.
                   1437: 
                   1438: \subsubsection {Major Synchronization}
                   1439: To indicate a major synchronization point,
                   1440: the \verb"SMajSyncRequest" routine is used
                   1441: (which corresponds to the {\sf S-MAJOR-SYNC.REQUEST\/} action).
                   1442: \begin{quote}\index{SMajSyncRequest}\small\begin{verbatim}
                   1443: int     SMajSyncRequest (sd, ssn, data, cc, si)
                   1444: int     sd;
                   1445: long   *ssn;
                   1446: char   *data;
                   1447: int     cc;
                   1448: struct SSAPindication *si;
                   1449: \end{verbatim}\end{quote}
                   1450: The parameters to this procedure are:
                   1451: \begin{describe}
                   1452: \item[\verb"sd":] the session-descriptor;
                   1453: 
                   1454: \item[\verb"ssn":] a pointer to a long integer which,
                   1455: on a successful return,
                   1456: will be updated to reflect the current serial-number ($V(M)-1$);
                   1457: 
                   1458: \item[\verb"data"/\verb"cc":] any additional data
                   1459: (and the length of that data, which may not exceed \verb"SN_SIZE" octets);
                   1460: and,
                   1461: 
                   1462: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1463: updated only if the call fails.
                   1464: \end{describe}
                   1465: If the call to \verb"SMajSyncRequest" is successful,
                   1466: then the major synchronization has been queued for the remote user.
                   1467: When the {\sf S-MAJOR-SYNC.CON\-FIR\-MA\-TION\/} event is received,
                   1468: the major synchronization is complete.
                   1469: Otherwise the \verb"SSAPabort" structure contained in
                   1470: the \verb"SSAPindication" parameter
                   1471: \verb"si" contains the reason for failure.
                   1472: 
                   1473: Upon receiving a {\sf S-MAJOR-SYNC.INDICATION\/} event,
                   1474: the user is required to generate a {\sf S-MAJOR-SYNC.RESPONSE\/} action
                   1475: by calling the \verb"SMajSyncResponse" routine.
                   1476: \begin{quote}\index{SMajSyncResponse}\small\begin{verbatim}
                   1477: int     SMajSyncResponse (sd, data, cc, si)
                   1478: int     sd;
                   1479: char   *data;
                   1480: int     cc;
                   1481: struct SSAPindication *si;
                   1482: \end{verbatim}\end{quote}
                   1483: The parameters to this procedure are:
                   1484: \begin{describe}
                   1485: \item[\verb"sd":] the session-descriptor;
                   1486: 
                   1487: \item[\verb"data"/\verb"cc":] any additional data
                   1488: (and the length of that data, which may not exceed \verb"SN_SIZE" octets);
                   1489: and,
                   1490: 
                   1491: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1492: updated only if the call fails.
                   1493: \end{describe}
                   1494: If the call to \verb"SMajSyncResponse" is successful,
                   1495: then the major synchronization has been completed.
                   1496: Otherwise the \verb"SSAPabort" structure contained in
                   1497: the \verb"SSAPindication" parameter
                   1498: \verb"si" contains the reason for failure.
                   1499: 
                   1500: \subsubsection {Minor Synchronization}
                   1501: To indicate a minor synchronization point,
                   1502: the \verb"SMinSyncRequest" routine is used
                   1503: (which corresponds to the {\sf S-MINOR-SYNC.REQUEST\/} action).
                   1504: \begin{quote}\index{SMinSyncRequest}\small\begin{verbatim}
                   1505: int     SMinSyncRequest (sd, type, ssn, data, cc, si)
                   1506: int     sd;
                   1507: int     type;
                   1508: long   *ssn;
                   1509: char   *data;
                   1510: int     cc;
                   1511: struct SSAPindication *si;
                   1512: \end{verbatim}\end{quote}
                   1513: The parameters to this procedure are:
                   1514: \begin{describe}
                   1515: \item[\verb"sd":] the session-descriptor;
                   1516: 
                   1517: \item[\verb"type":] the type of minor synchronization requested,
                   1518: one of:
                   1519: \[\begin{tabular}{|l|l|}
                   1520: \hline
                   1521:     \multicolumn{1}{|c|}{\bf Value}&
                   1522:                \multicolumn{1}{c|}{\bf Type}\\
                   1523: \hline
                   1524:     \tt SYNC\_CONFIRM&         explicit confirmation requested\\
                   1525:     \tt SYNC\_NOCONFIRM&       no confirmation requested\\
                   1526: \hline
                   1527: \end{tabular}\]
                   1528: 
                   1529: \item[\verb"ssn":] a pointer to a long integer which,
                   1530: on a successful return,
                   1531: will be updated to reflect the current serial-number ($V(M)-1$);
                   1532: 
                   1533: \item[\verb"data"/\verb"cc":] any additional data
                   1534: (and the length of that data, which may not exceed \verb"SN_SIZE" octets);
                   1535: and,
                   1536: 
                   1537: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1538: updated only if the call fails.
                   1539: \end{describe}
                   1540: If the call to \verb"SMinSyncRequest" is successful,
                   1541: then the minor synchronization has been queued for the remote user.
                   1542: If a {\sf S-MINOR-SYNC.CONFIRMATION\/} event is received,
                   1543: the minor synchronization is complete.
                   1544: However, the remote user is under no obligation to acknowledge the minorsync.
                   1545: Otherwise the \verb"SSAPabort" structure contained in
                   1546: the \verb"SSAPindication" parameter
                   1547: \verb"si" contains the reason for failure.
                   1548: 
                   1549: Upon receiving a {\sf S-MINOR-SYNC.INDICATION\/} event,
                   1550: the user may optionally use the \verb"SMinSyncResponse" routine
                   1551: to generate a {\sf S-MINOR-SYNC.RESPONSE\/} action.
                   1552: \begin{quote}\index{SMinSyncResponse}\small\begin{verbatim}
                   1553: int     SMinSyncResponse (sd, ssn, data, cc, si)
                   1554: int     sd;
                   1555: long    ssn;
                   1556: char   *data;
                   1557: int     cc;
                   1558: struct SSAPindication *si;
                   1559: \end{verbatim}\end{quote}
                   1560: The parameters to this procedure are:
                   1561: \begin{describe}
                   1562: \item[\verb"sd":] the session-descriptor;
                   1563: 
                   1564: \item[\verb"ssn":] the highest serial-number being confirmed;
                   1565: 
                   1566: \item[\verb"data"/\verb"cc":] any additional data
                   1567: (and the length of that data, which may not exceed \verb"SN_SIZE" octets);
                   1568: and,
                   1569: 
                   1570: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1571: updated only if the call fails.
                   1572: \end{describe}
                   1573: If the call to \verb"SMinSyncResponse" is successful,
                   1574: then the minor synchronization has been completed.
                   1575: Otherwise the \verb"SSAPabort" structure contained in
                   1576: the \verb"SSAPindication" parameter
                   1577: \verb"si" contains the reason for failure.
                   1578: 
                   1579: \subsubsection {ReSynchronization}
                   1580: To resynchronize the connection to a known state,
                   1581: the \verb"SReSyncRequest" is used
                   1582: (which corresponds to the {\sf S-RESYNCHRONIZE.REQUEST\/} action).
                   1583: \begin{quote}\index{SReSyncRequest}\small\begin{verbatim}
                   1584: int     SReSyncRequest (sd, type, ssn, settings, data, cc, si)
                   1585: int     sd;
                   1586: int     type,
                   1587:         settings;
                   1588: long    ssn;
                   1589: char   *data;
                   1590: int     cc;
                   1591: struct SSAPindication *si;
                   1592: \end{verbatim}\end{quote}
                   1593: The parameters to this procedure are:
                   1594: \begin{describe}
                   1595: \item[\verb"sd":] the session-descriptor;
                   1596: 
                   1597: \item[\verb"type":] the type of resynchronization requested
                   1598: (either \verb"SYNC_RESTART", \verb"SYNC_ABANDON",
                   1599: or \verb"SYNC_SET");
                   1600: 
                   1601: \item[\verb"ssn":] the serial-number to resynchronize to;
                   1602: 
                   1603: \item[\verb"settings":] the new token settings;
                   1604: 
                   1605: \item[\verb"data"/\verb"cc":] any additional data
                   1606: (and the length of that data, which may not exceed \verb"SN_SIZE" octets);
                   1607: and,
                   1608: 
                   1609: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1610: updated only if the call fails.
                   1611: \end{describe}
                   1612: If the call to \verb"SReSyncRequest" is successful,
                   1613: then the resynchronization has been queued for the remote user.
                   1614: When the {\sf S-RESYNCHRONIZE.CON\-FIR\-MA\-TION\/} event is received,
                   1615: the resynchronization is complete.
                   1616: Otherwise the \verb"SSAPabort" structure contained in
                   1617: the \verb"SSAPindication" parameter
                   1618: \verb"si" contains the reason for failure.
                   1619: 
                   1620: Upon receiving a {\sf S-RESYNCHRONIZE.INDICATION\/} event,
                   1621: the user is required to generate a {\sf S-RESYNCHRONIZE.RESPONSE\/} action
                   1622: using using the \verb"SReSyncResponse" routine.%
                   1623: \footnote{Actually,
                   1624: the user has other choices by using the rules of contention resolution.
                   1625: Consult the ISO session service specification for the gruesome details.}
                   1626: \begin{quote}\index{SReSyncResponse}\small\begin{verbatim}
                   1627: int     SReSyncResponse (sd, ssn, settings, data, cc, si)
                   1628: int     sd;
                   1629: int     settings;
                   1630: long    ssn;
                   1631: char   *data;
                   1632: int     cc;
                   1633: struct SSAPindication *si;
                   1634: \end{verbatim}\end{quote}
                   1635: The parameters to this procedure are:
                   1636: \begin{describe}
                   1637: \item[\verb"sd":] the session-descriptor;
                   1638: 
                   1639: \item[\verb"ssn":] the serial-number to resynchronize to;
                   1640: 
                   1641: \item[\verb"settings":] the new token settings;
                   1642: 
                   1643: \item[\verb"data"/\verb"cc":] any additional data
                   1644: (and the length of that data, which may not exceed \verb"SN_SIZE" octets);
                   1645: and,
                   1646: 
                   1647: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1648: updated only if the call fails.
                   1649: \end{describe}
                   1650: 
                   1651: \subsection    {Activity Management}
                   1652: There are several types of activity management services:
                   1653: activity start and resume,
                   1654: activity interrupt and discard,
                   1655: and activity end.
                   1656: 
                   1657: \subsubsection {Activity Start/Resume}
                   1658: To initiate a new activity,
                   1659: the \verb"SActStartRequest" routine is used
                   1660: (which corresponds to the {\sf S-ACTIVITY-START.REQUEST\/} action).
                   1661: \begin{quote}\index{SActStartRequest}\small\begin{verbatim}
                   1662: int     SActStartRequest (sd, id, data, cc, si)
                   1663: int     sd;
                   1664: struct SSAPactid *id;
                   1665: char   *data;
                   1666: int     cc;
                   1667: struct SSAPindication *si;
                   1668: \end{verbatim}\end{quote}
                   1669: The parameters to this procedure are:
                   1670: \begin{describe}
                   1671: \item[\verb"sd":] the session-descriptor;
                   1672: 
                   1673: \item[\verb"id":] the activity-identifier;
                   1674: 
                   1675: \item[\verb"data"/\verb"cc":] any additional data
                   1676: (and the length of that data, which may not exceed \verb"SV_SIZE" octets);
                   1677: and,
                   1678: 
                   1679: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1680: updated only if the call fails.
                   1681: \end{describe}
                   1682: 
                   1683: The \verb"id" parameter is a pointer to a \verb"SSAPactid" structure,
                   1684: which is passed transparently by the session service.
                   1685: \begin{quote}\index{SSAPref}\small\begin{verbatim}
                   1686: struct SSAPactid {
                   1687: #define SID_DATA_SIZE   6
                   1688:     u_char  sd_len;
                   1689:     char    sd_data[SID_DATA_SIZE];
                   1690: };
                   1691: \end{verbatim}\end{quote}
                   1692: The elements of this structure are:\label{SSAPactid}
                   1693: \begin{describe}
                   1694: \item[\verb"sd\_data"/\verb"sd\_len":] the data
                   1695: (and length of that data, which may not exceed \verb"SID_DATA_SIZE" octets);
                   1696: \end{describe}
                   1697: If the call to the \verb"SActStartRequest" routine is successful,
                   1698: then the activity is started.
                   1699: Otherwise the \verb"SSAPabort" structure contained in
                   1700: the \verb"SSAPindication" parameter
                   1701: \verb"si" contains the reason for failure.
                   1702: 
                   1703: To resume a previously interrupted activity,
                   1704: the \verb"SActResumeRequest" routine is used
                   1705: (which corresponds to the {\sf S-ACTIVITY-RESUME.REQUEST\/} action).
                   1706: \begin{quote}\index{SActResumeRequest}\small\begin{verbatim}
                   1707: int     SActResumeRequest (sd, id, oid, ssn, ref, data, cc,
                   1708:                 si)
                   1709: int     sd;
                   1710: struct SSAPactid *id,
                   1711:                  *oid;
                   1712: long    ssn;
                   1713: struct SSAPref *ref;
                   1714: char   *data;
                   1715: int     cc;
                   1716: struct SSAPindication *si;
                   1717: \end{verbatim}\end{quote}
                   1718: The parameters to this procedure are:
                   1719: \begin{describe}
                   1720: \item[\verb"sd":] the session-descriptor;
                   1721: 
                   1722: \item[\verb"id":] the activity-identifier
                   1723: (consult page~\pageref{SSAPactid} for a description of the \verb"SSAPactid"
                   1724: structure);
                   1725: 
                   1726: \item[\verb"oid":] the previous activity-identifier
                   1727: (again, consult page~\pageref{SSAPactid});
                   1728: 
                   1729: \item[\verb"ssn":] the serial-number to resume the activity at;
                   1730: 
                   1731: \item[\verb"ref":] the previous connection identifier;
                   1732: 
                   1733: \item[\verb"data"/\verb"cc":] any additional data
                   1734: (and the length of that data, which may not exceed \verb"SV_SIZE" octets);
                   1735: and,
                   1736: 
                   1737: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1738: updated only if the call fails.
                   1739: \end{describe}
                   1740: 
                   1741: The \verb"ref" parameter is a pointer to a \verb"SSAPref" structure.
                   1742: Note that unlike the connection identifiers used during connection
                   1743: establishment (as described on page~\pageref{SSAPref}),
                   1744: there are four fields:\label{SSAPactref}
                   1745: \[\begin{tabular}{|l|l|l|}
                   1746: \hline
                   1747:     \multicolumn{1}{|c|}{\bf Field}&
                   1748:     \multicolumn{1}{c|}{\bf Contents}&
                   1749:     \multicolumn{1}{c|}{\bf Length}\\
                   1750: \hline
                   1751:     calling SSAP user reference&
                   1752:                        \tt sr\_calling&        \tt sr\_calling\_len\\
                   1753:     called SSAP user reference&
                   1754:                        \tt sr\_called& \tt sr\_called\_len\\
                   1755:     common reference&
                   1756:                        \tt sr\_cdata&  \tt sr\_clen\\
                   1757:     additional reference&
                   1758:                        \tt sr\_adata&  \tt sr\_alen\\
                   1759: \hline
                   1760: \end{tabular}\]
                   1761: 
                   1762: If the call to the \verb"SActResumeRequest" routine is successful,
                   1763: then the activity is resumed.
                   1764: Otherwise the \verb"SSAPabort" structure contained in
                   1765: the \verb"SSAPindication" parameter
                   1766: \verb"si" contains the reason for failure.
                   1767: 
                   1768: \subsubsection {Activity Interrupt/Discard}
                   1769: To interrupt an activity in progress,
                   1770: the \verb"SActIntrRequest" routine is used
                   1771: (which corresponds to the {\sf S-ACTIVITY-INTERRUPT.REQUEST\/} action).
                   1772: \begin{quote}\index{SActIntrRequest}\small\begin{verbatim}
                   1773: int     SActIntrRequest (sd, reason, si)
                   1774: int     sd;
                   1775: int     reason;
                   1776: struct SSAPindication *si;
                   1777: \end{verbatim}\end{quote}
                   1778: The parameters to this procedure are:
                   1779: \begin{describe}
                   1780: \item[\verb"sd":] the session-descriptor;
                   1781: 
                   1782: \item[\verb"reason":] the reason for the interrupt
                   1783: (codes are listed in Table~\ref{SSAPexceptions});
                   1784: and,
                   1785: 
                   1786: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1787: updated only if the call fails.
                   1788: \end{describe}
                   1789: If the call to \verb"SActIntrRequest" is successful,
                   1790: then the activity interrupt has been queued for the remote user.
                   1791: When the {\sf S-ACTIVITY-INTERRUPT.CON\-FIR\-MA\-TION\/} event is received,
                   1792: the activity interrupt is complete.
                   1793: Otherwise the \verb"SSAPabort" structure contained in
                   1794: the \verb"SSAPindication" parameter
                   1795: \verb"si" contains the reason for failure.
                   1796: 
                   1797: Upon receiving a {\sf S-ACTIVITY-INTERRUPT.INDICATION\/} event,
                   1798: the user is required to generate a {\sf S-ACTIVITY-INTERRUPT.RESPONSE\/} action
                   1799: using the \verb"SActIntrResponse" routine.
                   1800: \begin{quote}\index{SActIntrResponse}\small\begin{verbatim}
                   1801: int     SActIntrResponse (sd, si)
                   1802: int     sd;
                   1803: struct SSAPindication *si;
                   1804: \end{verbatim}\end{quote}
                   1805: The parameters to this procedure are:
                   1806: \begin{describe}
                   1807: \item[\verb"sd":] the session-descriptor;
                   1808: and,
                   1809: 
                   1810: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1811: updated only if the call fails.
                   1812: \end{describe}
                   1813: If the call to \verb"SActIntrResponse" is successful,
                   1814: then the activity interrupt has been completed.
                   1815: Otherwise the \verb"SSAPabort" structure contained in
                   1816: the \verb"SSAPindication" parameter
                   1817: \verb"si" contains the reason for failure.
                   1818: 
                   1819: To discard an activity in progress,
                   1820: the \verb"SActDiscRequest" routine is used
                   1821: (which corresponds to the {\sf S-ACTIVITY-DISCARD.REQUEST\/} action).
                   1822: \begin{quote}\index{SActDiscRequest}\small\begin{verbatim}
                   1823: int     SActDiscRequest (sd, reason, si)
                   1824: int     sd;
                   1825: int     reason;
                   1826: struct SSAPindication *si;
                   1827: \end{verbatim}\end{quote}
                   1828: The parameters to this procedure are:
                   1829: \begin{describe}
                   1830: \item[\verb"sd":] the session-descriptor;
                   1831: 
                   1832: \item[\verb"reason":] the reason for the discard
                   1833: (codes are listed in Table~\ref{SSAPexceptions});
                   1834: and,
                   1835: 
                   1836: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1837: updated only if the call fails.
                   1838: \end{describe}
                   1839: If the call to \verb"SActDiscRequest" is successful,
                   1840: then the activity discard has been queued for the remote user.
                   1841: When the {\sf S-ACTIVITY-DISCARD.CON\-FIR\-MA\-TION\/} event is received,
                   1842: the activity discard is complete.
                   1843: Otherwise the \verb"SSAPabort" structure contained in
                   1844: the \verb"SSAPindication" parameter
                   1845: \verb"si" contains the reason for failure.
                   1846: 
                   1847: Upon receiving a {\sf S-ACTIVITY-DISCARD.INDICATION\/} event,
                   1848: the user is required to generate a {\sf S-ACTIVITY-DISCARD.RESPONSE\/} action
                   1849: using the \verb"SActDiscResponse" routine.
                   1850: \begin{quote}\index{SActDiscResponse}\small\begin{verbatim}
                   1851: int     SActDiscResponse (sd, si)
                   1852: int     sd;
                   1853: struct SSAPindication *si;
                   1854: \end{verbatim}\end{quote}
                   1855: The parameters to this procedure are:
                   1856: \begin{describe}
                   1857: \item[\verb"sd":] the session-descriptor;
                   1858: and,
                   1859: 
                   1860: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1861: updated only if the call fails.
                   1862: \end{describe}
                   1863: If the call to \verb"SActDiscResponse" is successful,
                   1864: then the activity discard has been completed.
                   1865: Otherwise the \verb"SSAPabort" structure contained in
                   1866: the \verb"SSAPindication" parameter
                   1867: \verb"si" contains the reason for failure.
                   1868: 
                   1869: \subsubsection {Activity End}
                   1870: To end an activity in progress,
                   1871: the \verb"SActEndRequest" routine is used
                   1872: (which corresponds to the {\sf S-ACTIVITY-END.REQUEST\/} action).
                   1873: \begin{quote}\index{SActEndRequest}\small\begin{verbatim}
                   1874: int     SActEndRequest (sd, ssn, data, cc, si)
                   1875: int     sd;
                   1876: long   *ssn;
                   1877: char   *data;
                   1878: int     cc;
                   1879: struct SSAPindication *si;
                   1880: \end{verbatim}\end{quote}
                   1881: The parameters to this procedure are:
                   1882: \begin{describe}
                   1883: \item[\verb"sd":] the session-descriptor;
                   1884: 
                   1885: \item[\verb"ssn":] a pointer to a long integer which,
                   1886: on a successful return,
                   1887: will be updated to reflect the current serial-number ($V(M)-1$);
                   1888: 
                   1889: \item[\verb"data"/\verb"cc":] any additional data
                   1890: (and the length of that data, which may not exceed \verb"SV_SIZE" octets);
                   1891: and,
                   1892: 
                   1893: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1894: updated only if the call fails.
                   1895: \end{describe}
                   1896: If the call to \verb"SActEndRequest" is successful,
                   1897: then the activity end has been queued for the remote user.
                   1898: When the {\sf S-ACTIVITY-END.CONFIRMATION\/} event is received,
                   1899: the activity end is complete.
                   1900: Otherwise the \verb"SSAPabort" structure contained in
                   1901: the \verb"SSAPindication" parameter
                   1902: \verb"si" contains the reason for failure.
                   1903: 
                   1904: Upon receiving a {\sf S-ACTIVITY-END.INDICATION\/} event,
                   1905: the user is required to call the \verb"SActEndResponse" routine
                   1906: to generate a {\sf S-ACTIVITY-END.RESPONSE\/} action.
                   1907: \begin{quote}\index{SActEndResponse}\small\begin{verbatim}
                   1908: int     SActEndResponse (sd, data, cc, si)
                   1909: int     sd;
                   1910: char   *data;
                   1911: int     cc;
                   1912: struct SSAPindication *si;
                   1913: \end{verbatim}\end{quote}
                   1914: The parameters to this procedure are:
                   1915: \begin{describe}
                   1916: \item[\verb"sd":] the session-descriptor;
                   1917: 
                   1918: \item[\verb"data"/\verb"cc":] any additional data
                   1919: (and the length of that data, which may not exceed \verb"SV_SIZE" octets);
                   1920: and,
                   1921: 
                   1922: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1923: updated only if the call fails.
                   1924: \end{describe}
                   1925: If the call to \verb"SActEndResponse" is successful,
                   1926: then the activity end has been completed.
                   1927: Otherwise the \verb"SSAPabort" structure contained in
                   1928: the \verb"SSAPindication" parameter
                   1929: \verb"si" contains the reason for failure.
                   1930: 
                   1931: \subsection    {Exception Reporting}
                   1932: To report an exception and place the connection in a special error-recovery
                   1933: state,
                   1934: the \verb"SUReportRequest" routine is called
                   1935: (which corresponds to the {\sf S-U-EXCEPTION-REPORT.REQUEST\/} action).
                   1936: \begin{quote}\index{SUReportRequest}\small\begin{verbatim}
                   1937: int    SUReportRequest (sd, reason, data, cc, si)
                   1938: int    sd;
                   1939: int     reason;
                   1940: char   *data;
                   1941: int    cc;
                   1942: struct SSAPindication  *si;
                   1943: \end{verbatim}\end{quote}
                   1944: The parameters to this procedure are:
                   1945: \begin{describe}
                   1946: \item[\verb"sd":] the session-descriptor;
                   1947: 
                   1948: \item[\verb"reason":] the reason for the report
                   1949: (codes are listed in Table~\ref{SSAPexceptions});
                   1950: 
                   1951: \item[\verb"data"/\verb"cc":] any report data
                   1952: (and the length of that data, which may not exceed \verb"SP_SIZE" octets);
                   1953: and,
                   1954: 
                   1955: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1956: updated only if the call fails.
                   1957: \end{describe}
                   1958: If the call to \verb"SUReportRequest" is successful,
                   1959: then the connection is placed in an error state,
                   1960: and any data queued for the connection may be lost until recovery is complete.
                   1961: Otherwise the \verb"SSAPabort" structure contained in
                   1962: the \verb"SSAPindication" parameter
                   1963: \verb"si" contains the reason for failure.
                   1964: 
                   1965: Typically,
                   1966: error recovery can be achieved by giving away the data token or by aborting
                   1967: the connection (discussed next).
                   1968: Error recovery is discussed in greater detail in the ISO session service
                   1969: specification.
                   1970: 
                   1971: \subsection    {User-initiated Aborts}
                   1972: To unilaterally initiate an abort of the connection,
                   1973: the \verb"SUAbortRequest" routine is called
                   1974: (which corresponds to the {\sf S-U-ABORT.REQUEST\/} action).
                   1975: \begin{quote}\index{SUAbortRequest}\small\begin{verbatim}
                   1976: int    SUAbortRequest (sd, data, cc, si)
                   1977: int    sd;
                   1978: char   *data;
                   1979: int    cc;
                   1980: struct SSAPindication  *si;
                   1981: \end{verbatim}\end{quote}
                   1982: The parameters to this procedure are:
                   1983: \begin{describe}
                   1984: \item[\verb"sd":] the session-descriptor;
                   1985: 
                   1986: \item[\verb"data"/\verb"cc":] any abort data
                   1987: (and the length of that data, which may not exceed \verb"SA_SIZE" octets);
                   1988: and,
                   1989: 
                   1990: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   1991: updated only if the call fails.
                   1992: \end{describe}
                   1993: If the call to \verb"SUAbortRequest" is successful,
                   1994: then the connection is immediately closed,
                   1995: and any data queued for the connection may be lost.
                   1996: 
                   1997: \subsection    {Asynchronous Event Handling}
                   1998: The data transfer events discussed thus far have been synchronous in nature.
                   1999: Some users of the session service may wish an asynchronous interface.
                   2000: The \verb"SSetIndications" routine is used to change the service associated
                   2001: with a session-descriptor to or from an asynchronous interface.
                   2002: \begin{quote}\index{SSetIndications}\small\begin{verbatim}
                   2003: int     SSetIndications (sd, data, tokens, sync, activity,
                   2004:                 report, finish, abort, si)
                   2005: int     sd;
                   2006: int   (*data) (),
                   2007:       (*tokens) (),
                   2008:       (*sync) (),
                   2009:       (*activity) (),
                   2010:       (*report) (),
                   2011:       (*finish) (),
                   2012:       (*abort) ();
                   2013: struct SSAPindication  *si;
                   2014: \end{verbatim}\end{quote}
                   2015: The parameters to this procedure are:
                   2016: \begin{describe}
                   2017: \item[\verb"sd":] the session-descriptor;
                   2018: 
                   2019: \item[\verb"data":] the address of an event-handler routine to be invoked when
                   2020: data has arrived;
                   2021: 
                   2022: \item[\verb"tokens":] the address of an event-handler routine to be invoked
                   2023: when a token management event occurs;
                   2024: 
                   2025: \item[\verb"sync":] the address of an event-handler routine to be invoked
                   2026: when a synchronization management event occurs;
                   2027: 
                   2028: \item[\verb"activity":] the address of an event-handler routine to be invoked
                   2029: when an activity management event occurs;
                   2030: 
                   2031: \item[\verb"report":] the address of an event-handler routine to be invoked
                   2032: when an exception report event occurs;
                   2033: 
                   2034: \item[\verb"finish":] the address of an event-handler routine to be invoked
                   2035: when the connection is ready to be released;
                   2036: 
                   2037: \item[\verb"abort":] the address of an event-handler routine to be invoked when
                   2038: a user-initiated abort (a {\sf S-U-ABORT.INDICATION\/} event occurs)
                   2039: or a provider-initiated abort
                   2040: (a {\sf S-P-ABORT.INDICATION\/} event occurs);
                   2041: and,
                   2042: 
                   2043: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
                   2044: only if the call fails.
                   2045: \end{describe}
                   2046: If the service is to be made asynchronous,
                   2047: then all event handlers are specified,
                   2048: otherwise,
                   2049: if the service is to be made synchronous,
                   2050: then no event handlers should be specified
                   2051: (use the manifest constant \verb"NULLIFP").
                   2052: The most likely reason for the call failing is \verb"SC_WAITING",
                   2053: which indicates that an event is waiting for the user.
                   2054: 
                   2055: When an event-handler is invoked,
                   2056: future invocations of the event-hander are blocked until it returns.
                   2057: The return value of the event-handler is ignored.
                   2058: Further,
                   2059: during the execution of a synchronous call to the library,
                   2060: the event-handler will be blocked from being invoked.
                   2061: 
                   2062: When an event associated with data arrival occurs,
                   2063: the event-handler routine is invoked with two parameters:
                   2064: \begin{quote}\small\begin{verbatim}
                   2065: (*data) (sd, sx);
                   2066: int     sd;
                   2067: struct SSAPdata *sx;
                   2068: \end{verbatim}\end{quote}
                   2069: The parameters are:
                   2070: \begin{describe}
                   2071: \item[\verb"sd":] the session-descriptor;
                   2072: and,
                   2073: 
                   2074: \item[\verb"sx":] a pointer to the \verb"SSAPdata" structure containing
                   2075: the data.
                   2076: \end{describe}
                   2077: Note that the data contained in the structure was allocated via \man malloc(3),
                   2078: and should be released with the \verb"SXFREE" macro
                   2079: (described on page~\pageref{SXFREE}) when no longer needed.
                   2080: 
                   2081: When an event associated with token management arrives
                   2082: the event-handler routine is invoked with two parameters:
                   2083: \begin{quote}\small\begin{verbatim}
                   2084: (*tokens) (sd, st);
                   2085: int       sd;
                   2086: struct SSAPtoken *st;
                   2087: \end{verbatim}\end{quote}
                   2088: The parameters are:
                   2089: \begin{describe}
                   2090: \item[\verb"sd":] the session-descriptor;
                   2091: and,
                   2092: 
                   2093: \item[\verb"st":] a pointer to the \verb"SSAPtoken" structure containing
                   2094: the token management information.
                   2095: \end{describe}
                   2096: 
                   2097: When an event associated with synchronization management arrives
                   2098: the event-handler routine is invoked with two parameters:
                   2099: \begin{quote}\small\begin{verbatim}
                   2100: (*sync) (sd, sn);
                   2101: int       sd;
                   2102: struct SSAPsync *sn;
                   2103: \end{verbatim}\end{quote}
                   2104: The parameters are:
                   2105: \begin{describe}
                   2106: \item[\verb"sd":] the session-descriptor;
                   2107: and,
                   2108: 
                   2109: \item[\verb"sn":] a pointer to the \verb"SSAPsync" structure containing
                   2110: the synchronization management information.
                   2111: \end{describe}
                   2112: 
                   2113: When an event associated with activity management arrives
                   2114: the event-handler routine is invoked with two parameters:
                   2115: \begin{quote}\small\begin{verbatim}
                   2116: (*activity) (sd, sv);
                   2117: int       sd;
                   2118: struct SSAPactivity *sv;
                   2119: \end{verbatim}\end{quote}
                   2120: The parameters are:
                   2121: \begin{describe}
                   2122: \item[\verb"sd":] the session-descriptor;
                   2123: and,
                   2124: 
                   2125: \item[\verb"sv":] a pointer to the \verb"SSAPactivity" structure containing
                   2126: the activity management information.
                   2127: \end{describe}
                   2128: 
                   2129: When an event associated with exception reporting arrives
                   2130: the event-handler routine is invoked with two parameters:
                   2131: \begin{quote}\small\begin{verbatim}
                   2132: (*report) (sd, sp);
                   2133: int       sd;
                   2134: struct SSAPreport *sp;
                   2135: \end{verbatim}\end{quote}
                   2136: The parameters are:
                   2137: \begin{describe}
                   2138: \item[\verb"sd":] the session-descriptor;
                   2139: and,
                   2140: 
                   2141: \item[\verb"sp":] a pointer to the \verb"SSAPreport" structure containing
                   2142: the exception report information.
                   2143: \end{describe}
                   2144: 
                   2145: When an event associated with connection termination arrives
                   2146: the event-handler routine is invoked with two parameters:
                   2147: \begin{quote}\small\begin{verbatim}
                   2148: (*finish) (sd, sf);
                   2149: int       sd;
                   2150: struct SSAPfinish *sf;
                   2151: \end{verbatim}\end{quote}
                   2152: The parameters are:
                   2153: \begin{describe}
                   2154: \item[\verb"sd":] the session-descriptor;
                   2155: and,
                   2156: 
                   2157: \item[\verb"sf":] a pointer to the \verb"SSAPfinish" structure containing
                   2158: information concerning the request to terminate the connection.
                   2159: \end{describe}
                   2160: 
                   2161: When an event associated with a user- or provider-initiated abort occurs,
                   2162: the event-handler is invoked with two parameters:
                   2163: \begin{quote}\small\begin{verbatim}
                   2164: (*abort) (sd, sa);
                   2165: int      sd;
                   2166: struct SSAPabort *sa;
                   2167: \end{verbatim}\end{quote}
                   2168: The parameters are:
                   2169: \begin{describe}
                   2170: \item[\verb"sd":] the session-descriptor;
                   2171: and,
                   2172: 
                   2173: \item[\verb"sa":] a pointer to the \verb"SSAPabort" structure
                   2174: indicating why the connection was aborted.
                   2175: \end{describe}
                   2176: Note that the session-descriptor is no longer valid at the instant the
                   2177: call is made.
                   2178: 
                   2179: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
                   2180: \bf NOTE:&     The \man libssap(3n) library uses the SIGEMT signal to provide
                   2181:                these services.
                   2182:                Programs using asynchronous session-descriptors should NOT
                   2183:                use SIGEMT for other purposes.
                   2184: \end{tabular}}\]
                   2185: 
                   2186: \subsection    {Synchronous Event Multiplexing}
                   2187: A user of the session service may wish to manage multiple
                   2188: session-de\-scrip\-tors simultaneously;
                   2189: the routine \verb"SSelectMask" is provided for this purpose.
                   2190: This routine updates a file-descriptor mask and associated counter for use
                   2191: with \verb"xselect".
                   2192: \begin{quote}\index{SSelectMask}\small\begin{verbatim}
                   2193: int     SSelectMask (sd, mask, nfds, si)
                   2194: int     sd;
                   2195: fd_set *mask,
                   2196: int    *nfds;
                   2197: struct SSAPindication  *si;
                   2198: \end{verbatim}\end{quote}
                   2199: The parameters to this procedure are:
                   2200: \begin{describe}
                   2201: \item[\verb"sd":] the session-descriptor;
                   2202: 
                   2203: \item[\verb"mask":] a pointer to a file-descriptor mask meaningful to
                   2204: \verb"xselect";
                   2205: 
                   2206: \item[\verb"nfds":] a pointer to an integer-valued location meaningful to
                   2207: \verb"xselect";
                   2208: and,
                   2209: 
                   2210: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
                   2211: only if the call fails.
                   2212: \end{describe}
                   2213: If the call is successful, then the \verb"mask" and \verb"nfds" parameters can
                   2214: be used as arguments to \verb"xselect".
                   2215: The most likely reason for the call failing is \verb"SC_WAITING",
                   2216: which indicates that an event is waiting for the user.
                   2217: 
                   2218: If \verb"xselect" indicates that the session-descriptor is ready for reading,
                   2219: \verb"SReadRequest" should be called with the \verb"secs" parameter equal to
                   2220: \verb"OK".
                   2221: If the network activity does not constitute an entire event for the user,
                   2222: then \verb"SReadRequest" will return \verb"NOTOK" with error code
                   2223: \verb"SC_TIMER".
                   2224: 
                   2225: \section      {Connection Release}
                   2226: The \verb"SRelRequest" routine is used to request the release a connection,
                   2227: and corresponds to a {\sf S-RELEASE.REQUEST\/} action.
                   2228: The SSAP attempts to gracefully drain any queued data before closing
                   2229: the connection.
                   2230: \begin{quote}\index{SRelRequest}\small\begin{verbatim}
                   2231: int     SRelRequest (sd, data, cc, secs, sr, si)
                   2232: int     sd;
                   2233: char   *data;
                   2234: int     cc;
                   2235: int     secs;
                   2236: struct SSAPrelease  *sr;
                   2237: struct SSAPindication  *si;
                   2238: \end{verbatim}\end{quote}
                   2239: The parameters to this procedure are:
                   2240: \begin{describe}
                   2241: \item[\verb"sd":] the session-descriptor;
                   2242: 
                   2243: \item[\verb"data"/\verb"cc":] any final data
                   2244: (and the length of that data,
                   2245: which may not exceed \verb"SF_SIZE" octets);
                   2246: 
                   2247: \item[\verb"secs":] the maximum number of seconds to wait for a response
                   2248: (use the manifest constant \verb"NOTOK" if no time-out is desired);
                   2249: 
                   2250: \item[\verb"sr":] a pointer to a \verb"SSAPrelease" structure, which is updated
                   2251: only if the call succeeds;
                   2252: and,
                   2253: 
                   2254: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
                   2255: only if the call fails.
                   2256: \end{describe}
                   2257: If the call to \verb"SRelRequest" is successful,
                   2258: then this corresponds to a {\sf S-RELEASE.CONFIRMATION\/} event,
                   2259: and it returns information in the \verb"sr" parameter,
                   2260: which is a pointer to a \verb"SSAPrelease" structure.
                   2261: \begin{quote}\index{SSAPrelease}\small\begin{verbatim}
                   2262: struct SSAPrelease {
                   2263:     int     sr_affirmative;
                   2264: 
                   2265: #define SR_SIZE         512
                   2266:     int     sr_cc;
                   2267:     char    sr_data[SR_SIZE];
                   2268: };
                   2269: \end{verbatim}\end{quote}
                   2270: The elements of this structure are:
                   2271: \begin{describe}
                   2272: \item[\verb"sr\_affirmative":] the acceptance indicator;
                   2273: and,
                   2274: 
                   2275: \item[\verb"sr\_data"/\verb"sr\_cc":] any final data
                   2276: (and the length of that data).
                   2277: \end{describe}
                   2278: If the call to \verb"SRelRequest" is successful,
                   2279: and the \verb"sr_affirmative" element is set,
                   2280: then the connection has been closed.
                   2281: If the call is successful,
                   2282: but the \verb"sr_affirmative" element is not set (i.e., zero),
                   2283: then the request to close the connection has been rejected by the remote user,
                   2284: and the connection is still open.
                   2285: Otherwise the \verb"SSAPabort" structure contained in
                   2286: the \verb"SSAPindication" parameter
                   2287: \verb"si" contains the reason for failure.
                   2288: 
                   2289: Note that if a non-negative value is given to the \verb"secs" parameter and a
                   2290: response is not received within this number of seconds,
                   2291: then the value contained in the \verb"sa_reason" element is \verb"SC_TIMER".
                   2292: The user can then call the routine \verb"SRelRetryRequest" to continue waiting
                   2293: for a response:
                   2294: \begin{quote}\index{SRelRetryRequest}\small\begin{verbatim}
                   2295: int     SRelRetryRequest (sd, secs, sr, si)
                   2296: int     sd;
                   2297: int     secs;
                   2298: struct SSAPrelease  *sr;
                   2299: struct SSAPindication  *si;
                   2300: \end{verbatim}\end{quote}
                   2301: The parameters to this procedure are:
                   2302: \begin{describe}
                   2303: \item[\verb"sd":] the session-descriptor;
                   2304: 
                   2305: \item[\verb"secs":] the maximum number of seconds to wait for a response
                   2306: (use the manifest constant \verb"NOTOK" if no time-out is desired);
                   2307: 
                   2308: \item[\verb"sr":] a pointer to a \verb"SSAPrelease" structure, which is updated
                   2309: only if the call succeeds;
                   2310: and,
                   2311: 
                   2312: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
                   2313: only if the call fails.
                   2314: \end{describe}
                   2315: If the call to \verb"SRelRetryRequest" is successful,
                   2316: and the \verb"sr_affirmative" element is set,
                   2317: then the connection has been closed.
                   2318: If the call is successful,
                   2319: but the \verb"sr_affirmative" element is not set (i.e., zero),
                   2320: then the request to close the connection has been rejected by the remote user,
                   2321: and the connection is still open.
                   2322: Otherwise the \verb"SSAPabort" structure contained in
                   2323: the \verb"SSAPindication" parameter
                   2324: \verb"si" contains the reason for failure.
                   2325: As expected,
                   2326: the value \verb"SC_TIMER" indicates that no response was received within the
                   2327: time given by the \verb"secs" parameter.
                   2328: 
                   2329: Upon receiving a {\sf S-RELEASE.INDICATION\/} event,
                   2330: the user is required to generate a {\sf S-RELEASE.RESPONSE\/} action
                   2331: using the \verb"SRelResponse" routine.
                   2332: \begin{quote}\index{SRelResponse}\small\begin{verbatim}
                   2333: int     SRelResponse (sd, status, data, cc, si)
                   2334: int     sd;
                   2335: int     status,
                   2336:         cc;
                   2337: char   *data;
                   2338: struct SSAPindication  *si;
                   2339: \end{verbatim}\end{quote}
                   2340: The parameters to this procedure are:
                   2341: \begin{describe}
                   2342: \item[\verb"sd":] the session-descriptor;
                   2343: 
                   2344: \item[\verb"status":] the acceptance indicator
                   2345: (either \verb"SC_ACCEPT" if the connection is to be closed,
                   2346: or \verb"SC_REJECTED" otherwise);
                   2347: 
                   2348: \item[\verb"data"/\verb"cc":] any final data (and the length of that data,
                   2349: which may not exceed \verb"SR_SIZE" octets);
                   2350: and,
                   2351: 
                   2352: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
                   2353: updated only if the call fails.
                   2354: \end{describe}
                   2355: If the call to \verb"SRelResponse" is successful,
                   2356: and if the \verb"result" parameter is set to \verb"SC_ACCEPT",
                   2357: then the connection has been closed.
                   2358: If the call is successful,
                   2359: but the \verb"result" parameter is not \verb"SC_ACCEPT",
                   2360: then the connection still remains open.
                   2361: Note that in order to specify a value other tha \verb"SC_ACCEPT" for the
                   2362: \verb"result" parameter to \verb"SRelResponse",
                   2363: the release token must exist but must not be owned by the user making the
                   2364: call to \verb"SRelResponse".%
                   2365: \footnote{Gentle reader, we don't write the standards;
                   2366: we just try to implement them.}
                   2367: 
                   2368: \section      {Restrictions on User Data}
                   2369: The \man libssap(3n) contains partial support for the use of unlimited user
                   2370: data for session services.
                   2371: With the exception of the {\sf S-DATA\/} and the {\sf S-TYPED-DATA\/} services,
                   2372: the initial session service limited the amount of user data that could be
                   2373: present. 
                   2374: With the introduction of the unlimited user data
                   2375: addendum\cite{ISO.SS.UserData,ISO.SP.UserData} to the session service and
                   2376: protocol,
                   2377: this restriction has been lifted.
                   2378: 
                   2379: During connection establishment,
                   2380: the \man libssap(3n) library will attempt to negotate the use of unlimited
                   2381: user data.
                   2382: If this negotiation fails,
                   2383: then session services which permit user data,
                   2384: other than {\sf S-DATA\/} and {\sf S-TYPED-DATA},
                   2385: are limited to 512~octets of user data.%
                   2386: \footnote{Strictly speaking,
                   2387: the {\sf S-U-ABORT} service permits only 9~octets of user data.
                   2388: This limitation is unreasonable~---~upto 512~octets will be permitted.}
                   2389: 
                   2390: If the negotation succeeds,
                   2391: then session services which permit user data,
                   2392: other than {\sf S-DATA\/} and {\sf S-TYPED-DATA},
                   2393: are limited to 65400~octets of user data,
                   2394: with the exception of the {\sf S-CONNECT.REQUEST\/} primitive,
                   2395: which is limited to 10240~octets of user data
                   2396: (the {\sf S-CONNECT.RESPONSE\/} primitive is limited to 65528~octets).%
                   2397: \footnote{Strictly speaking,
                   2398: the amount should be unlimited.
                   2399: However this full generality is not available at this time.}
                   2400: 
                   2401: There is one further limitation however:
                   2402: although the initiator of a connection can send upto 10240~octets,
                   2403: due to limitations in the \unix/ kernel,
                   2404: if the \man tsapd(8c) is dispatching based on session selector,
                   2405: then a responder can accept upto approximately 1536~octets.
                   2406: To avoid this problem,
                   2407: have \man tsapd(8c) dispatch based on transport selector
                   2408: (see Section~\ref{service:standard} in \volone/).
                   2409: 
                   2410: \section      {Error Conventions}
                   2411: All of the routines in this library return the manifest constant \verb"NOTOK"
                   2412: on error,
                   2413: and also update the \verb"si" parameter given to the routine.
                   2414: The \verb"si_abort" element of the \verb"SSAPindication" structure contains a
                   2415: \verb"SSAPabort" structure detailing the reason for the failure.
                   2416: The \verb"sa_reason" element of this latter structure can be given as a
                   2417: parameter to the routine \verb"SErrString" which returns a null-terminated
                   2418: diagnostic string.
                   2419: \begin{quote}\index{SErrString}\small\begin{verbatim}
                   2420: char   *SErrString (c)
                   2421: int     c;
                   2422: \end{verbatim}\end{quote}
                   2423: 
                   2424: \section      {Compiling and Loading}
                   2425: Programs using the \man libssap(3n) library should include
                   2426: \verb"<isode/ssap.h>".
                   2427: The programs should also be loaded with \verb"-lssap" and \verb"-ltsap"
                   2428: (this latter library contains the routines which implement the transport
                   2429: services used by the session provider).
                   2430: 
                   2431: \section      {An Example}
                   2432: Let's consider how one might construct a source entity that resides on the
                   2433: SSAP.
                   2434: This entity will use a synchronous interface.
                   2435: 
                   2436: There are two parts to the program:
                   2437: initialization and data transfer;
                   2438: release will occur when the standard input has been exhausted.
                   2439: In our example,
                   2440: we assume that the routine \verb"error" results in the process being
                   2441: terminated after printing a diagnostic.
                   2442: 
                   2443: In Figure~\ref{initSSsource},
                   2444: the initialization steps for the source entity,
                   2445: including the outer {\em C\/} wrapper,
                   2446: is shown.
                   2447: First, a lookup is done in the ISO services database,
                   2448: and the \verb"SSAPaddr" is initialized.
                   2449: The \verb"SSAPref" is zeroed.
                   2450: Next, for each token associated with the session requirements,
                   2451: initial ownership of that token is claimed.
                   2452: Finally,
                   2453: the call to \verb"SConnRequest" is made.
                   2454: If the call is successful,
                   2455: a check is made to see if the remote user accepted the connection.
                   2456: If so,
                   2457: the session-descriptor is captured,
                   2458: along with the negotiated requirements and initial token settings.
                   2459: 
                   2460: In Figure~\ref{dataSSsource} on page~\pageref{dataSSsource},
                   2461: the data transfer loop is realized.
                   2462: The source entity reads a line from the standard input,
                   2463: and then queues that line for sending to the remote side.
                   2464: When an end-of-file occurs on the standard input,
                   2465: the source entity requests release and then gracefully terminates.
                   2466: Although no checking is done in this example,
                   2467: for the calls to \verb"SDataRequest" and \verb"SRelRequest",
                   2468: on failure
                   2469: a check for the operational error \verb"SC_OPERATION" should be made.
                   2470: For \verb"SDataRequest",
                   2471: this would occur when the data token was not owned by the user;
                   2472: for \verb"SRelRequest",
                   2473: this would occur when the release token was not owned by the user.
                   2474: \clearpage
                   2475: \tagrind[tp]{grind5b-3a}{Initializing the SSAP source entity}{initSSsource}
                   2476: \clearpage
                   2477: \tagrind[tp]{grind5b-3b}{Initializing the SSAP source entity (continued)}\empty
                   2478: \clearpage
                   2479: \tagrind[tp]{grind5b-4}{Data Transfer for the SSAP source entity}%
                   2480:        {dataSSsource}.
                   2481: 
                   2482: \section      {For Further Reading}
                   2483: The ISO specification for session services is defined in
                   2484: \cite{ISO.SP.Service},
                   2485: while the complementary CCITT recommendation is defined in
                   2486: \cite{CCITT.SP.Service}.
                   2487: The corresponding protocol definitions are \cite{ISO.SP.Protocol} and
                   2488: \cite{CCITT.SP.Protocol}, respectively.
                   2489: 
                   2490: %%% \section  {Changes Since the Last Release}\label{ssap:changes}
                   2491: %%% A brief summary of the major changes between v~\ssaprevrsn/ and
                   2492: %%% v~\ssapvrsn/ are now presented.
                   2493: %%% These are the user-visible changes only;
                   2494: %%% changes of a strictly internal nature are not discussed.
                   2495: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.