|
|
1.1 root 1: % run this through LaTeX with the appropriate wrapper
2:
3: \chapter {Reliable Transfer}\label{librtsap}
4: The \man librtsap(3n) library implements the reliable transfer service (RTS).
5: The abstraction provided to applications is that of an {\em association\/}
6: for reliably transfering data.
7: Most applications use the remote operations facilities,
8: described in the previous chapter,
9: and do not directly use the reliable transfer service.%
10: \footnote{Actually, applications such as message-handling systems explicitly
11: use the reliable transfer service to perform association management,
12: and then optionally utilize the remote operations service for actual
13: communication (otherwise they use reliable transfer directly).
14: Both usages are permitted and encouraged in this implementation.}
15: However,
16: for those applications which do not base themselves in remote operations,
17: the reliable transfer interface is used.
18:
19: As with most models of OSI services,
20: the underlying assumption is one of a symmetric, asynchronous environment.
21: That is,
22: although peers exist at a given layer,
23: one does not necessary view a peer as either a client or a server.
24: Further,
25: the service provider may generate events for the service user without the
26: latter entity triggering the actions which led to the event.
27: For example,
28: in a synchronous environment,
29: an indication that data has arrived usually occurs only when the service user
30: asks the service provider to read data;
31: in an asynchronous environment,
32: the service provider may interrupt the service user at any time to announce
33: the arrival of data.
34:
35: The \verb"rtsap" module in this release initially uses a client/server
36: paradigm to start communications.
37: Once the connection is established,
38: a symmetric view is taken.
39: In addition,
40: initially the interface is synchronous;
41: however once the connection is established,
42: an asynchronous interface may be selected.
43:
44: All of the routines in the \man librtsap(3n) library are integer-valued.
45: They return the manifest constant \verb"OK" on success,
46: or \verb"NOTOK" otherwise.
47:
48: \section {Associations}\label{rts:associations}
49: As briefly mentioned earlier,
50: an association is the binding between two applications.
51: An association is formed when one application,
52: termed the {\em initiator},
53: specifies the address of a {\em responder\/} and asks the reliable transfer
54: service to establish a connection.
55:
56: There are three aspects of association management:
57: {\em association establishment},
58: {\em association release},
59: and,
60: {\em association abort}.
61: Each of these are now described in turn.
62: All of these facilities rely on the mechanisms described in
63: Section~\ref{acs:associations} on page~\pageref{acs:associations}.
64:
65: \subsection {Association Establishment}
66: The \man librtsap(3n) library distinguishes between the user which started an
67: assocoation,
68: the {\em initiator},
69: and the user which was subsequently bound to the association,
70: the {\em responder}.
71: We sometimes term these two entities the {\em client\/} and the {\em server},
72: respectively.
73:
74: \subsubsection {Addresses}
75: Addresses for the reliable transfer service entity consist of two parts:
76: a presentation address (as discussed in Section~\ref{psap:addresses} on
77: page~\pageref{psap:addresses} of \voltwo/),
78: and application-entity information
79: (as discussed in Section~\ref{acs:aei} on page~\pageref{acs:aei}).
80:
81: In Figure~\ref{getFTAMentity} on page~\pageref{getFTAMentity},
82: an example of how these components are determined is given.
83:
84: \subsubsection {Server Initialization}
85: The \man tsapd(8c) daemon,
86: upon accepting a connection from an initiating host,
87: consults the ISO services database to determine which program
88: on the local system implements the desired application context.
89: Once the program has been ascertained,
90: the daemon runs the program with any argument listed in the database.
91: In addition,
92: it appends some {\em magic arguments\/} to the argument vector.
93: Hence,
94: the very first action performed by the responder is to re-capcture the RTSE
95: state contained in the magic arguments.
96: This is done by calling the routine \verb"RtInit",
97: which on a successful return,
98: is equivalent to a {\sf RT-OPEN.INDICATION\/} from the reliable transfer
99: service provider.
100: \begin{quote}\index{RtInit}\small\begin{verbatim}
101: int RtInit (vecp, vec, rts, rti)
102: int vecp;
103: char **vec;
104: struct RtSAPstart *rts;
105: struct RtSAPindication *rti;
106: \end{verbatim}\end{quote}
107: The parameters to this procedure are:
108: \begin{describe}
109: \item[\verb"vecp":] the length of the argument vector;
110:
111: \item[\verb"vec":] the argument vector;
112:
113: \item[\verb"rts":] a pointer to a \verb"RtSAPstart" structure,
114: which is updated only if the call succeeds;
115: and,
116:
117: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure,
118: which is updated only if the call fails.
119: \end{describe}
120: If \verb"RtInit" is successful,
121: it returns information in the \verb"rts" parameter,
122: which is a pointer to a \verb"RtSAPstart" structure.
123: \begin{quote}\index{RtSAPstart}\small\begin{verbatim}
124: struct RtSAPstart {
125: int rts_sd;
126:
127: int rts_mode;
128: #define RTS_MONOLOGUE 0
129: #define RTS_TWA 1
130:
131: int rts_turn;
132: #define RTS_INITIATOR 0
133: #define RTS_RESPONDER 1
134:
135: PE rts_data;
136:
137: struct AcSAPstart rts_start;
138: };
139: \end{verbatim}\end{quote}
140: The elements of this structure are:
141: \begin{describe}
142: \item[\verb"rts\_sd":] the association-descriptor to be used to
143: reference this association;
144:
145: \item[\verb"rts\_mode":] the dialogue mode (either monologue or two-way
146: alternate),
147:
148: \item[\verb"rts\_turn":] the owner of the turn initially;
149:
150: \item[\verb"rts\_data":] any initial data (this is a pointer to a
151: \verb"PElement" structure, which is fully explained in Chapter~\ref{libpsap});
152: and,
153:
154: \item[\verb"rts\_start":] a \verb"AcSAPstart" structure
155: (consult page~\pageref{AcSAPstart}).
156: \end{describe}
157: Note that the \verb"rts_data" element is allocated via \man malloc(3) and
158: should be released by using the \verb"RTSFREE" macro when no longer referenced.
159: The \verb"RTSFREE" macro behaves as if it was defined as:
160: \begin{quote}\index{RTSFREE}\small\begin{verbatim}
161: void RTSFREE (rts)
162: struct RtSAPstart *rts;
163: \end{verbatim}\end{quote}
164: The macro frees only the data allocated by \verb"RtInit",
165: and not the \verb"RtSAPstart" structure itself.
166: Further,
167: \verb"RTSFREE" should be called only if the call to the \verb"RtInit"
168: routine returned \verb"OK".
169:
170: If the call to \verb"RtInit" is not successful,
171: then a {\sf RT-P-ABORT.INDICATION\/} event is simulated,
172: and the relevant information is returned in an encoded
173: \verb"RtSAPindication" structure
174: (discussed in Section~\ref{rts:transfer} on page~\pageref{rts:transfer}).
175:
176: After examining the information returned by \verb"RtInit" on a successful call
177: (and possibly after examining the argument vector),
178: the responder should either accept or reject the association.
179: For either response,
180: the responder should use
181: the \verb"RtOpenResponse" routine
182: (which corresponds to the {\sf RT-OPEN.RESPONSE\/} action).
183: \begin{quote}\index{RtOpenResponse}\small\begin{verbatim}
184: int RtOpenResponse (sd, status, context, respondtitle,
185: respondaddr, ctxlist, defctxresult, data, rti)
186: int sd,
187: status;
188: OID context;
189: AEI respondtitle;
190: struct PSAPaddr *respondaddr;
191: struct PSAPctxlist *ctxlist;
192: int defctxresult;
193: PE data;
194: struct RtSAPindication *rti;
195: \end{verbatim}\end{quote}
196: The parameters to this procedure are:
197: \begin{describe}
198: \item[\verb"sd":] the association-descriptor;
199:
200: \item[\verb"status":] the acceptance indicator
201: (either \verb"ACS_ACCEPT" if the association is to be accepted,
202: or one of the user-initiated rejection codes listed in
203: Table~\ref{AcSAPreasons} on page~\pageref{AcSAPreasons});
204:
205: \item[\verb"data":] any initial data
206: (regardless of whether the association is to be accepted);
207: and,
208:
209: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure,
210: which is updated only if the call fails.
211: \end{describe}
212: The remaining parameters are for the association control service,
213: consult the description of the \verb"AcAssocResponse" routine on
214: page~\pageref{AcAssocResponse}.
215:
216: If the call to \verb"RtOpenResponse" is successful,
217: and the \verb"status" parameter was set to \verb"ACS_ACCEPT",
218: then association establishment has now been completed.
219: If the call was successful,
220: but the \verb"status" parameter was not \verb"ACS_ACCEPT",
221: then the association has been rejected and the responder may exit.
222: Otherwise,
223: if the call failed and the reason is ``fatal'',
224: then the association is lost.
225:
226: \subsubsection {Client Initialization}
227: A program wishing to associate itself with another user of reliable transfer
228: services calls the \verb"RtOpenRequest" routine,
229: which corresponds to the {\sf RT-OPEN.REQUEST\/} action.
230: \begin{quote}\index{RtOpenRequest}\small\begin{verbatim}
231: int RtOpenRequest (mode, turn, context, callingtitle,
232: calledtitle, callingaddr, calledaddr, ctxlist,
233: defctxname, data, qos, rtc, rti)
234: int mode,
235: turn;
236: AEI callingtitle,
237: calledtitle;
238: OID context;
239: struct PSAPaddr *callingaddr,
240: *calledaddr;
241: int single;
242: struct PSAPctxlist *ctxlist;
243: OID defctxname;
244: PE data;
245: struct QOStype *qos;
246: struct RtSAPconnect *rtc;
247: struct RtSAPindication *rti;
248: \end{verbatim}\end{quote}
249: The parameters to this procedure are:
250: \begin{describe}
251: \item[\verb"mode":] the dialogue mode;
252:
253: \item[\verb"turn":] who gets the initial turn;
254:
255: \item[\verb"data":] any initial data;
256:
257: \item[\verb"qos":] the quality of service on the connection
258: (see Section~\ref{tsap:qos} in \voltwo/);
259:
260: \item[\verb"rtc":] a pointer to a \verb"RtSAPconnect" structure, which is
261: updated only if the call succeeds;
262: and,
263:
264: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
265: updated only if the call fails.
266: \end{describe}
267: The remaining parameters are for the association control service,
268: consult the description of the \verb"AcAssocRequest" routine on
269: page~\pageref{AcAssocRequest}.
270: If the call to \verb"RtOpenRequest" is successful
271: (this corresponds to a {\sf RT-OPEN.CON\-FIR\-MA\-TION\/} event),
272: it returns information in the \verb"rtc" parameter,
273: which is a pointer to a \verb"RtSAPconnect" structure.
274: \begin{quote}\index{RtSAPconnect}\small\begin{verbatim}
275: struct RtSAPconnect {
276: int rtc_sd;
277:
278: int rtc_result;
279:
280: PE rtc_data;
281:
282: struct AcSAPconnect rtc_connect;
283: };
284: \end{verbatim}\end{quote}
285: The elements of this structure are:
286: \begin{describe}
287: \item[\verb"rtc\_sd":] the association-descriptor to be used to
288: reference this association;
289:
290: \item[\verb"rtc\_result":] the association response;
291:
292: \item[\verb"rtc\_data":] any initial data
293: (regardless of whether the association was accepted);
294: and,
295:
296: \item[\verb"rtc\_connect":] a \verb"AcSAPconnect" structure
297: (consult page~\pageref{AcSAPconnect}).
298: \end{describe}
299: If the call to \verb"RtOpenRequest" is successful,
300: and the \verb"rtc_result" element is set to \verb"RTS_ACCEPT",
301: then association establishment has completed.
302: If the call is successful,
303: but the \verb"rtc_result" element is not \verb"RTS_ACCEPT",
304: then the association attempt has been rejected;
305: consult Table~\ref{RtSAPreasons} to determine the reason for the reject.
306: Otherwise, if the call fails then the association is not established and
307: the \verb"RtSAPabort" structure of the \verb"RtSAPindication" discriminated
308: union has been updated.
309:
310: Note that the \verb"rtc_data" element is allocated via \man malloc(3) and
311: should be released using the \verb"RTCFREE" macro when no longer referenced.
312: The \verb"RTCFREE" macro behaves as if it was defined as:
313: \begin{quote}\index{RTCFREE}\small\begin{verbatim}
314: void RTCFREE (rtc)
315: struct RtSAPconnect *rtc;
316: \end{verbatim}\end{quote}
317: The macro frees only the data allocated by \verb"RtOpenRequest",
318: and not the \verb"RtSAPconnect" structure itself.
319: Further,
320: \verb"RTCFREE" should be called only if the call to the \verb"RtOpenRequest"
321: routine returned \verb"OK".
322:
323: \subsection {Association Release}
324: The \verb"RtCloseRequest" routine is used to request the release of an
325: association,
326: and corresponds to a {\sf RT-CLOSE.REQUEST\/} action.
327: \begin{quote}\index{RtCloseRequest}\small\begin{verbatim}
328: int RtCloseRequest (sd, reason, data, acr, rti)
329: int sd,
330: reason;
331: PE data;
332: struct AcSAPrelease *acr;
333: struct RtSAPindication *rti;
334: \end{verbatim}\end{quote}
335: The parameters to this procedure:
336: \begin{describe}
337: \item[\verb"sd":] the association-descriptor;
338:
339: \item[\verb"reason":] the reason why the association should be released,
340: one of:
341: \[\begin{tabular}{|l|l|}
342: \hline
343: \multicolumn{1}{|c|}{\bf Value}&
344: \multicolumn{1}{c|}{\bf Reason}\\
345: \hline
346: \tt ACF\_NORMAL& normal\\
347: \tt ACF\_URGENT& urgent\\
348: \tt ACF\_UNDEFINED& undefined\\
349: \hline
350: \end{tabular}\]
351:
352: \item[\verb"data":] any final data;
353:
354: \item[\verb"acr":] a pointer to a \verb"AcSAPrelease" structure,
355: which is updated only if the call succeeds;
356: and,
357:
358: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure,
359: which is updated only if the call fails.
360: \end{describe}
361: If the call to \verb"RtCloseRequest" is successful,
362: then this corresponds to a {\sf RT-CLOSE.CONFIRMATION\/} event,
363: and it returns information in the \verb"acr" parameter,
364: which is a pointer to a \verb"AcSAPrelease" structure
365: (consult page~\pageref{AcSAPrelease}).
366:
367: If the call to \verb"RtCloseRequest" is successful,
368: then the association has been released.
369: Otherwise the \verb"RtSAPabort" element of the \verb"RtSAPindication"
370: parameter \verb"rti" contains the reason for failure.
371:
372: Upon receiving a {\sf RT-CLOSE.INDICATION\/} event,
373: the user is required to generate a {\sf RT-CLOSE.RESPONSE\/} action
374: using the \verb"RtCloseResponse" routine.
375: \begin{quote}\index{RtCloseResponse}\small\begin{verbatim}
376: int RtCloseResponse (sd, reason, data, rti)
377: int sd,
378: reason;
379: PE data;
380: struct RtSAPindication *rti;
381: \end{verbatim}\end{quote}
382: The parameters to this procedure:
383: \begin{describe}
384: \item[\verb"sd":] the association-descriptor;
385:
386: \item[\verb"reason":] the reason for the indicator,
387: one of:
388: \[\begin{tabular}{|l|l|}
389: \hline
390: \multicolumn{1}{|c|}{\bf Value}&
391: \multicolumn{1}{c|}{\bf Reason}\\
392: \hline
393: \tt ACR\_NORMAL& normal\\
394: \tt ACR\_NOTFINISHED& not finished\\
395: \tt ACR\_UNDEFINED& undefined\\
396: \hline
397: \end{tabular}\]
398:
399: \item[\verb"data":] any final data;
400: and,
401:
402: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure,
403: which is updated only if the call fails.
404: \end{describe}
405: If the call to \verb"RtCloseResponse" is successful,
406: then the association has been released.
407: If the call was successful,
408: but the \verb"reason" parameter was not \verb"ACR_NORMAL",
409: then the association remains established.
410:
411: \subsection {Association Abort}
412: To unilaterally abort an association,
413: the routine \verb"RtUAbortRequest" routine is used
414: which corresponds to the {\sf RT-U-ABORT.REQUEST\/} action.
415: \begin{quote}\index{RtUAbortRequest}\small\begin{verbatim}
416: int RtUAbortRequest (sd, data, rti)
417: int sd;
418: PE data;
419: struct RtSAPindication *rti;
420: \end{verbatim}\end{quote}
421: The parameters to this procedure:
422: \begin{describe}
423: \item[\verb"sd":] the association-descriptor;
424:
425: \item[\verb"data":] any abort data;
426: and,
427:
428: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure,
429: which is updated only if the call fails.
430: \end{describe}
431: If the call to \verb"RtUAbortRequest" is successful,
432: then the association is immediately relesaed,
433: and any data queued for the association may be lost.
434:
435: \section {Reliable Transfer}\label{rts:transfer}
436:
437: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
438: \bf NOTE:& Users should also consult Sectin~\ref{rts:revisited} on
439: page~\pageref{rts:revisited} for optional routines to
440: make RTS behave more sanely.
441: \end{tabular}}\]
442:
443: Once the association has been established,
444: an association-descriptor is used to reference the association.
445: This is usually the first parameter given to any of the remaining routines in
446: the \man librtsap(3n) library.
447: Further,
448: the last parameter is usually a pointer to a \verb"RtSAPindication"
449: structure.
450: If a call to one of these routines fails,
451: then the structure is updated.
452: \begin{quote}\index{RtSAPindication}\small\begin{verbatim}
453: struct RtSAPindication {
454: int rti_type;
455: #define RTI_TURN 0x00
456: #define RTI_TRANSFER 0x01
457: #define RTI_ABORT 0x02
458: #define RTI_CLOSE 0x03 (X.410 CLOSE)
459: #define RTI_FINISH 0x04 (RT-CLOSE)
460:
461: union {
462: struct RrSAPturn rti_un_turn;
463: struct RtSAPtransfer rti_un_transfer;
464: struct RtSAPabort rti_un_abort;
465: struct RtSAPclose rti_un_close;
466: struct AcSAPfinish rti_un_finish
467: } rti_un;
468: #define rti_turn rti_un.rti_un_turn
469: #define rti_transfer rti_un.rti_un_transfer
470: #define rti_abort rti_un.rti_un_abort
471: #define rti_close rti_un.rti_un_close
472: #define rti_finish rti_un.rti_un_finish
473: };
474: \end{verbatim}\end{quote}
475: As shown, this structure is really a discriminated union
476: (a structure with a tag element followed by a union).
477: Hence, on a failure return,
478: one first coerces a pointer to the \verb"RtSAPabort" structure contained
479: therein,
480: and then consults the elements of that structure.
481: \begin{quote}\index{RtSAPabort}\small\begin{verbatim}
482: struct RtSAPabort {
483: int rta_peer;
484:
485: int rta_reason;
486:
487: PE rta_udata;
488:
489: #define RTA_SIZE 512
490: int rta_cc;
491: char rta_data[RTA_SIZE];
492: };
493: \end{verbatim}\end{quote}
494: The elements of a \verb"RtSAPabort" structure are:
495: \begin{describe}
496: \item[\verb"rta\_peer":] if set, indicates a user-initiated abort
497: (a {\sf RT-U-A\-BORT.IN\-DI\-CA\-TION\/} event);
498: if not set, indicates a provider-initiated abort
499: (a {\sf RT-P-ABORT.INDICATION\/} event);
500:
501: \item[\verb"rta\_reason":] the reason for the abort
502: (codes are listed in Table~\ref{RtSAPreasons});
503:
504: \item[\verb"rta\_udata":] optionally, data associated with the user-initiated
505: abort;
506: and,
507:
508: \item[\verb"rta\_data"/\verb"rta\_cc":] a diagnostic string from the provider.
509: \end{describe}
510: \tagtable[tp]{2c-1}{RtSAP Failure Codes}{RtSAPreasons}
511: Note that the \verb"rta_udata" element is allocated via \man malloc(3) and
512: should be released using the \verb"RTAFREE" macro when no longer referenced.
513: The \verb"RTAFREE" macro behaves as if it was defined as:
514: \begin{quote}\index{RTAFREE}\small\begin{verbatim}
515: void RTAFREE (rta)
516: struct RtSAPabort *rta;
517: \end{verbatim}\end{quote}
518: The macro frees only the data allocated in the \verb"RtSAPabort" structure
519: and not the structure itself.
520:
521: On a failure return,
522: if the \verb"rta_reason" element of the \verb"RtSAPabort" structure is
523: associated with a fatal error,
524: the the association is released.
525: The \verb"RTS_FATAL" macro can be used to determine this.
526: \begin{quote}\index{RTS\_FATAL}\small\begin{verbatim}
527: int RTS_FATAL (r)
528: int r;
529: \end{verbatim}\end{quote}
530: For protocol purists,
531: the \verb"RTS_OFFICIAL" macro can be used to determine if the error is an
532: ``official'' error as defined by the specification,
533: or an ``unofficial'' error used by the implementation.
534: \begin{quote}\index{RTS\_OFFICIAL}\small\begin{verbatim}
535: int RTS_OFFICIAL (r)
536: int r;
537: \end{verbatim}\end{quote}
538:
539: \subsection {Sending Data}
540: When the user has the turn,
541: it can use the \verb"RtTransferRequest" routine
542: (this corresponds to the {\sf RT-TRANSFER.REQUEST\/} action)
543: to request the reliable transfer of a data structure.
544: \begin{quote}\index{RtTransferRequest}\small\begin{verbatim}
545: int RtTransferRequest (sd, data, secs, rti)
546: int sd;
547: PE data;
548: int secs;
549: struct RtSAPindication *rti;
550: \end{verbatim}\end{quote}
551: The parameters to this procedure are:
552: \begin{describe}
553: \item[\verb"sd":] the association-descriptor;
554:
555: \item[\verb"data":] the data to be transferred;
556:
557: \item[\verb"secs":] the amount of time, in seconds, permitted to transfer the
558: data (use the manifest constant \verb"NOTOK" if time is unimportant);
559: and,
560:
561: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
562: updated only if the call fails.
563: \end{describe}
564: If \verb"RtTransferRequest" succeeds,
565: then the data has been reliably transferred to the other user.
566: Otherwise the \verb"RtSAPabort" structure contained in
567: the \verb"RtSAPindication" parameter \verb"rti"
568: contains the reason for failure.
569:
570: \subsection {Receiving Data}
571: The \verb"RtWaitRequest" routine is used to wait for an event
572: (usually incoming data) to occur.
573: \begin{quote}\index{RtWaitRequest}\small\begin{verbatim}
574: int RtWaitRequest (sd, secs, rti)
575: int sd;
576: int secs;
577: struct RtSAPindication *rti;
578: \end{verbatim}\end{quote}
579: The parameters to this procedure are:
580: \begin{describe}
581: \item[\verb"sd":] the association-descriptor;
582:
583: \item[\verb"secs":] the maximum number of seconds to wait for the event
584: (a value of \verb"NOTOK" indicates that the call should block indefinitely,
585: whereas a value of \verb"OK" indicates that the call should not block at all,
586: e.g., a polling action);
587: and,
588:
589: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure,
590: which is always updated.
591: \end{describe}
592: Unlike the other routines in the \man librtsap(3n) library,
593: the \verb"RtWaitRequest" routine returns one of three values:
594: \verb"NOTOK" (on failure),
595: \verb"OK" (on reading data)
596: or
597: \verb"DONE" (when something else happens).
598:
599: If the call to \verb"RtWaitRequest" returns the manifest constant
600: \verb"NOTOK",
601: then the \verb"RtSAPabort" structure contained in
602: the \verb"RtSAPindication" parameter
603: \verb"rti" contains the reason for the failure.
604:
605: Otherwise if the call to \verb"RoWaitRequest" returns the manifest constant
606: \verb"OK",
607: then data has arrived.
608: This event is encoded in the \verb"rti" parameter,
609: depending on the value of the \verb"rti_type" element.
610: Currently,
611: when \verb"RoWaitRequest" returns \verb"OK",
612: the \verb"rti_type" element is set to \verb"RTI_TRANSFER",
613: which indicates that a {\sf RT-TRANSFER.REQUEST\/} event has occurred.
614:
615: Otherwise if the call to \verb"RtWaitRequest" returns the manifest constant
616: \verb"DONE",
617: then some event other than data arriving has occurred.
618: This event is also encoded in the \verb"rti" parameter,
619: depending on the value of the \verb"rti_type" element.
620: Currently,
621: when \verb"RoWaitRequest" returns \verb"DONE",
622: the \verb"rti_type" element is set to one of two values:
623: \[\begin{tabular}{|l|l|}
624: \hline
625: \multicolumn{1}{|c|}{\bf Value}&
626: \multicolumn{1}{c|}{\bf Event}\\
627: \hline
628: \tt RTI\_TURN& \sf RT-TURN-PLEASE.INDICATION\\
629: \hline
630: \tt RTI\_TURN& \sf RT-TURN-GIVE.INDICATION\\
631: \hline
632: \tt RTI\_CLOSE& \sf X.410 CLOSE.INDICATION\\
633: & \ \ (for old-style associations)\\
634: \hline
635: \tt RTI\_FINISH& \sf RT-CLOSE.INDICATION\\
636: \hline
637: \end{tabular}\]
638:
639: \subsubsection {Transfer Indication}
640: When an {\sf RT-TRANSFER.INDICATION\/} event occurs,
641: the \verb"rti_type" field of the \verb"rti" parameter contains the value
642: \verb"RTI_TRANSFER",
643: and a \verb"RtSAPtransfer" structure is contained inside the \verb"rti"
644: parameter.
645: \begin{quote}\index{RtSAPtransfer}\small\begin{verbatim}
646: struct RtSAPtransfer {
647: PE rtt_data;
648: };
649: \end{verbatim}\end{quote}
650: The elements of this structure are:
651: \begin{describe}
652: \item[\verb"rtt\_data":] the data received.
653: \end{describe}
654: Note that the \verb"rtt_data" element is allocated via \man malloc(3) and
655: should be released using the \verb"RTTFREE" macro when no longer referenced.
656: The \verb"RTTFREE" macro behaves as if it was defined as:
657: \begin{quote}\index{RTTFREE}\small\begin{verbatim}
658: void RTTFREE (rtt)
659: struct RtSAPtransfer *rtt;
660: \end{verbatim}\end{quote}
661: The macro frees only the data allocated in the \verb"RtSAPtransfer" structure
662: and not the structure itself.
663:
664: \subsubsection {Turn Indication}
665: When an {\sf RT-TURN-GIVE.INDICATION\/} or {\sf RT-TURN-PLEASE.INDICATION\/}
666: events occur,
667: the \verb"rti_type" field of the \verb"rti" parameter contains the value
668: \verb"RTI_TURN",
669: and a \verb"RtSAPturn" structure is contained inside the \verb"rti"
670: parameter.
671: \begin{quote}\index{RtSAPturn}\small\begin{verbatim}
672: struct RtSAPturn {
673: int rtu_please;
674:
675: int rtu_priority;
676: };
677: \end{verbatim}\end{quote}
678: The elements of this structure are:
679: \begin{describe}
680: \item[\verb"rtu\_please":] if set, indicates that a
681: {\sf RT-PLEASE-TURN.INDICATION\/} event has occurred;
682: if not set,
683: indicates that a {\sf RT-GIVE-TURN.IN\-DI\-CA\-TION\/} event has occurred;
684: and,
685:
686: \item[\verb"rtu\_priority":] the priority at which the turn is requested
687: (meaningful only if \verb"rtu_please" is set).
688: \end{describe}
689:
690: \subsubsection {Close Indication}
691: When an {\sf X.410 CLOSE.INDICATION\/} event occurs,
692: the \verb"rti_type" field of the \verb"rti" parameter contains the value
693: \verb"RTI_CLOSE",
694: and a \verb"RtSAPclose" structure is contained inside the \verb"rti"
695: parameter.
696: \begin{quote}\index{RtSAPclose}\small\begin{verbatim}
697: struct RtSAPclose {
698: int rtc_dummy;
699: };
700: \end{verbatim}\end{quote}
701:
702: \subsubsection {Finish Indication}
703: When an {\sf RT-CLOSE.INDICATION\/} event occurs,
704: the \verb"rti_type" field of the \verb"rti" parameter contains the value
705: \verb"RTI_FINISH",
706: and a \verb"AcSAPfinish" structure is contained inside the \verb"rti"
707: parameter.
708:
709: \subsection {Managing the Turn}
710: The user with the turn is permitted to send data to the other user.
711: To request the turn,
712: one invokes the \verb"RtPTurnRequest" routine,
713: which corresponds to the {\sf RT-PLEASE-TURN.REQUEST}.
714: \begin{quote}\index{RtPTurnRequest}\small\begin{verbatim}
715: int RtPTurnRequest (sd, priority, rti)
716: int sd;
717: int priority;
718: struct RtSAPindication *rti;
719: \end{verbatim}\end{quote}
720: The parameters to this procedure are:
721: \begin{describe}
722: \item[\verb"sd":] the association-descriptor;
723:
724: \item[\verb"priority":] the priority at which the turn is requested
725: (this is defined by each application);
726: and,
727:
728: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
729: updated only if the call fails.
730: \end{describe}
731: If the call to the \verb"RtPTurnRequest" routine succeeds,
732: then the turn has been requested of the remote user.
733: Otherwise the \verb"RtSAPabort" structure contained in
734: the \verb"RtSAPindication" parameter
735: \verb"rti" contains the reason for failure.
736:
737: To relinquish the turn,
738: one invokes the \verb"RtGTurnRequest" routine,
739: which corresponds to the {\sf RT-GIVE-TURN.REQUEST}.
740: \begin{quote}\index{RGPTurnRequest}\small\begin{verbatim}
741: int RtGTurnRequest (sd, rti)
742: int sd;
743: struct RtSAPindication *rti;
744: \end{verbatim}\end{quote}
745: The parameters to this procedure are:
746: \begin{describe}
747: \item[\verb"sd":] the association-descriptor;
748: and,
749:
750: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
751: updated only if the call fails.
752: \end{describe}
753: If the call to the \verb"RtGTurnRequest" routine succeeds,
754: then the turn has been relinquished to the remote user.
755: Otherwise the \verb"RtSAPabort" structure contained in
756: the \verb"RtSAPindication" parameter
757: \verb"rti" contains the reason for failure.
758:
759: \subsection {Asynchronous Event Handling}
760: The events discussed thus far have been synchronous in nature.
761: Some users of the reliable transfer service may wish an asynchronous interface.
762: The \verb"RtSetIndications" routine is used to change the service associated
763: with an association-descriptor to an asynchronous interface.
764: \begin{quote}\index{RtSetIndications}\small\begin{verbatim}
765: int RtSetIndications (sd, indication, rti)
766: int sd;
767: IFP indication;
768: struct RtSAPindication *rti;
769: \end{verbatim}\end{quote}
770: The parameters to this procedure are:
771: \begin{describe}
772: \item[\verb"sd":] the association-descriptor;
773:
774: \item[\verb"indication":] the address of an event-handler routine to be
775: invoked when an event occurs;
776: and,
777:
778: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
779: updated only if the call fails.
780: \end{describe}
781: If the service is to be made asynchronous,
782: then \verb"indication" is specified;
783: otherwise,
784: if the service is to be made synchronous,
785: it is not specified (use the manifest constant \verb"NULLIFP").
786: The most likely reason for the call failing is \verb"RTS_WAITING",
787: which indicates that an event is waiting for the user.
788:
789: When an event occurs,
790: the event-handler routine is invoked with two parameters:
791: \begin{quote}\small\begin{verbatim}
792: (*handler) (sd, rti);
793: int sd;
794: struct RtSAPindication *rti;
795: \end{verbatim}\end{quote}
796: The parameters are:
797: \begin{describe}
798: \item[\verb"sd":] the association-descriptor;
799: and,
800:
801: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure encoding
802: the event.
803: \end{describe}
804: Note that the data contained in the structure was allocated via \man malloc(3),
805: and should be released with the appropriate macro
806: (either \verb"RTTFREE" or \verb"RTPFREE")
807: when no longer needed.
808:
809: When an event-handler is invoked,
810: future invocations of the event-hander are blocked until it returns.
811: The return value of the event-handler is ignored.
812: Further,
813: during the execution of a synchronous call to the library,
814: the event-handler will be blocked from being invoked.
815:
816: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
817: \bf NOTE:& The \man librtsap(3n) library uses the SIGEMT signal to
818: provide these services.
819: Programs using asynchronous association-descriptors should NOT
820: use SIGEMT for other purposes.
821: \end{tabular}}\]
822:
823: \subsection {Synchronous Event Multiplexing}
824: A user of the reliable transfer service may wish to manage multiple
825: asso\-ci\-ation-descriptors simultaneously;
826: the routine \verb"RtSelectMask" is provided for this purpose.
827: This routine updates a file-descriptor mask and associated counter for use
828: with \verb"xselect" (consult Section~\ref{acs:select}),
829: as assocation-descriptors are file-descriptors.
830: \begin{quote}\index{RtSelectMask}\small\begin{verbatim}
831: int RtSelectMask (sd, mask, nfds, rti)
832: int sd;
833: fd_set *mask,
834: int *nfds;
835: struct RtSAPindication *rti;
836: \end{verbatim}\end{quote}
837: The parameters to this procedure are:
838: \begin{describe}
839: \item[\verb"sd":] the association-descriptor;
840:
841: \item[\verb"mask":] a pointer to a file-descriptor mask meaningful to
842: \verb"xselect";
843:
844: \item[\verb"nfds":] a pointer to an integer-valued location meaningful to
845: \verb"xselect";
846: and,
847:
848: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
849: updated only if the call fails.
850: \end{describe}
851: If the call is successful, then the \verb"mask" and \verb"nfds" parameters can
852: be used as arguments to \verb"xselect".
853: The most likely reason for the call failing is \verb"RTS_WAITING",
854: which indicates that an event is waiting for the user.
855:
856: If \verb"xselect" indicates that the association-descriptor is ready for
857: reading,
858: \verb"RtWaitRequest" should be called with the \verb"secs" parameter equal to
859: \verb"OK".
860: If the network activity does not constitute an entire event for the user,
861: then \verb"RtWaitRequest" will return \verb"NOTOK" with error code
862: \verb"RTS_TIMER".
863:
864: \subsection {Reliable Transfer (revisited)}\label{rts:revisited}
865: The mechanism provided by \verb"RtTransferRequest" may not be useful for
866: applications which have large amounts of data to transfer.
867: In most cases,
868: it is preferable to transfer data incrementally.
869: To provide for this functionality,
870: the routine \verb"RtSetDownTrans" is provided:
871: \begin{quote}\index{RtSetDownTrans}\small\begin{verbatim}
872: int RtSetDownTrans (sd, fnx, rti)
873: int sd;
874: IFP fnx;
875: struct RtSAPindication *rti;
876: \end{verbatim}\end{quote}
877: The parameters to this procedure are:
878: \begin{describe}
879: \item[\verb"sd":] the association descriptor;
880:
881: \item[\verb"fnx":] the address of an event-handler routine to be invoked when
882: data is needed; and,
883:
884: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
885: updated only if the call fails.
886: \end{describe}
887: If the \verb"fnx" parameter is some value other than the manifest constant
888: \verb"NULLIFP",
889: then upon successful return from \verb"RtSetDownTrans",
890: the behavior of the routine \verb"RtTransferRequest" is altered.
891: \begin{enumerate}
892: \item The \verb"data" parameter to \verb"RtTransferRequest" may be
893: \verb"NULLPE".
894:
895: \item In this case, the event-handler routine \verb"fnx" will be invoked
896: in order to retrieve a portion of the data to be transferred:
897: \begin{quote}\small\begin{verbatim}
898: result = (*fnx) (sd, base, len, size, ack, ssn, rti);
899: int sd;
900: char **base;
901: int *len,
902: size;
903: long ack,
904: ssn;
905: struct RtSAPindication *rti;
906: \end{verbatim}
907: \end{quote}
908: where \verb"sd" is the association-descriptor which was given to the routine
909: \verb"RtTransferRequest".
910:
911: \item If the \verb"base" parameter has the value \verb"NULLVP",
912: then a {\sf RT-PLEASE.IN\-DI\-CA\-TION\/} event is being signaled,
913: and the \verb"size" parameter has the value of the priority associated
914: with the event.
915:
916: \item Otherwise, the \verb"base" and \verb"len" parameters point to a
917: pointer/length pair which should be set by the event handler to upto
918: \verb"size" octets. The event handler is responsible for any
919: memory allocation (e.g., allocating a buffer of \verb"size" octets and
920: then assigning the address of the buffer to \verb"*base").
921: Once a buffer is chosen, the event handler should read upto
922: \verb"size" octets into the buffer and set \verb"*len" to the number
923: of octets actually read. The \verb"ssn" and \verb"ack" parameters
924: given the values of the last synchronization point requested and
925: acknolwedged (how this information should be used is unknown at this
926: time). If the value assigned to \verb"*len" is zero, then this
927: indicates that all data has been read and the transfer should be
928: completed.
929:
930: \item If the value of the \verb"size" is zero, then this indicates that the
931: provider could not negotiate a incremental transfer and the event
932: handler should allocate a buffer of arbitrary size, read all of the
933: data to be transferred into that one buffer, and then update
934: \verb"*base" and \verb"*len" accordingly.
935:
936: \item If the event handler encounters an error, it should return the
937: manifest constant \verb"NOTOK" (otherwise, it should return
938: \verb"OK").
939: If an error is signaled, the event handler should update the
940: \verb"rti" structure accordingly. The easiest way to do this is:
941: \begin{quote}\small\begin{verbatim}
942: return rtsaplose (rti, RTS_TRANSFER, NULLCP, "text");
943: \end{verbatim}\end{quote}
944: If the event is {\sf RT-PLEASE.REQUEST},
945: then signaling an error results in the provider generating an
946: {\sf S-ACTIVITY-INTERRUPT.REQUEST};
947: otherwise when an error is signaled, the provider will generate an
948: {\sf S-ACTIVITY-DISCARD.REQUEST\/} to abort the transfer.
949: \end{enumerate}
950:
951: For similar reasons,
952: the mechanism employed by \verb"RtWaitRequest" may not be useful for
953: applications which have large amounts of data to transfer.
954: Again,
955: in most cases it is preferable to transfer data incrementally.
956: To provide for this functionality,
957: the routine \verb"RtSetUpTrans" is provided:
958: \begin{quote}\index{RtSetUpTrans}\small\begin{verbatim}
959: int RtSetUpTrans (sd, fnx, rti)
960: int sd;
961: IFP fnx;
962: struct RtSAPindication *rti;
963: \end{verbatim}\end{quote}
964: The parameters to this procedure are:
965: \begin{describe}
966: \item[\verb"sd":] the association descriptor;
967:
968: \item[\verb"fnx":] the address of an event-handler routine to be invoked when
969: data has been received; and,
970:
971: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
972: updated only if the call fails.
973: \end{describe}
974: If the \verb"fnx" parameter is some value other than the manifest constant
975: \verb"NULLIFP",
976: then upon successful return from \verb"RtSetUpTrans",
977: the behavior of the routine \verb"RtWaitRequest" is altered when it returns an
978: {\sf RT-TRANSFER.INDICATION\/}
979: (the \verb"rti_type" field of the \verb"rti" parameter contains the value
980: \verb"RTI_TRANSFER",
981: and a \verb"RtSAPtransfer" structure is contained inside the \verb"rti"
982: parameter).
983: No data is returned by \verb"RtWaitRequest",
984: rather as data is received, the event routine is invoked:
985: \begin{enumerate}
986: \item When data is received, the event-handler routine \verb"fnx" will
987: be invoked
988: in order to store a portion of the data being transferred:
989: \begin{quote}\small\begin{verbatim}
990: result = (*fnx) (sd, event, addr, rti);
991: int sd;
992: int event;
993: caddr_t addr;
994: struct RtSAPindication *rti;
995: \end{verbatim}
996: \end{quote}
997: where \verb"sd" is the association-descriptor which was given to the routine
998: \verb"RtWaitRequest".
999:
1000: \item If the \verb"event" parameter has the value \verb"SI_DATA",
1001: then the \verb"addr" parameter is really a pointer to a
1002: \verb"struct qbuf" structure, and the event handler should
1003: traverse the qbuf writing out the data found therein.
1004:
1005: \item If the \verb"event" parameter has the value \verb"SI_SYNC",
1006: then the \verb"addr" parameter is really a pointer to a
1007: \verb"struct SSAPsync" structure, and the event handler should note
1008: the information contained therein.Currently, this will only
1009: occur when a {\sf S-MINOR-SYNC.INDICATION\/} event is signaled.
1010:
1011: \item If the \verb"event" parameter has the value \verb"SI_ACTIVITY",
1012: then the \verb"addr" parameter is really a pointer to a
1013: \verb"struct SSAPactivity" structure, and the event handler should note
1014: the information contained therein. Currently, there are four events
1015: that are signaled:
1016: \begin{itemize}
1017: \item {\sf S-ACTIVITY-START.INDICATION\/} which indicates that a
1018: transfer is about to begin;
1019:
1020: \item {\sf S-ACTIVITY-END.INDICATION\/} which indicates that a
1021: transfer is about to complete; and,
1022:
1023: \item {\sf S-ACTIVITY-INTERRUPT.IN\-DI\-CA\-TION\/} and\\ %%%
1024: {\sf S-ACTIVITY-DIS\-CARD.IN\-DI\-CA\-TION\/} which indicate
1025: that an activity is either suspended or aborted.
1026: \end{itemize}
1027:
1028: \item If the \verb"event" parameter has the value \verb"SI_REPORT",
1029: then the \verb"addr" parameter is really a pointer to a
1030: \verb"struct SSAPreport" structure, and the event handler should note
1031: the information contained therein. Currently, this will only
1032: occur when a {\sf S-U-EXCEPTION-REPORT.IN\-DI\-CA\-TION\/} event is
1033: signaled.
1034:
1035: \item If the event handler encounters an error, it should return the
1036: manifest constant \verb"NOTOK" (otherwise, it should return
1037: \verb"OK").
1038: If an error is signaled, the event handler should update the
1039: \verb"rti" structure accordingly. The easiest way to do this is:
1040: \begin{quote}\small\begin{verbatim}
1041: return rtsaplose (rti, RTS_TRANSFER, NULLCP, "text");
1042: \end{verbatim}\end{quote}
1043: If the event is {\sf S-ACTIVITY-INTERRUPT.INDICATION},
1044: {\sf S-ACTIVITY-INTERRUPT.INDICATION},
1045: or {\sf S-ACTIVITY-INTERRUPT.IN\-DI\-CA\-TION},
1046: then signaling an error is ignorred by the provider;
1047: otherwise, when an error is signaled, the provider will generate an
1048: {\sf S-U-EXCEPTION-REPORT.REQUEST\/} to abort the transfer.
1049: \end{enumerate}
1050:
1051: \section {Error Conventions}
1052: All of the routines in this library return the manifest constant \verb"NOTOK"
1053: on error,
1054: and also update the \verb"rti" parameter given to the routine.
1055: The \verb"rti_abort" element of the \verb"RtSAPindication" structure
1056: encodes the reason for the failure.
1057: One coerces a pointer to a \verb"RtSAPabort" structure,
1058: and consults the \verb"rta_reason" element of this latter structure.
1059: This element can be given as a
1060: parameter to the routine \verb"RtErrString" which returns a null-terminated
1061: diagnostic string.
1062: \begin{quote}\index{RtErrString}\small\begin{verbatim}
1063: char *RtErrString (c)
1064: int c;
1065: \end{verbatim}\end{quote}
1066:
1067: \section {Compiling and Loading}
1068: Programs using the \man librtsap(3n) library should include
1069: \verb"<isode/rtsap.h>",
1070: which automatically includes the header file \verb"<isode/psap.h>" described in
1071: Chapter~\ref{libpsap}.
1072: The programs should also be loaded with \verb"-lisode".
1073:
1074: \section {An Example}
1075: Let's consider how one might construct a generic server that uses
1076: reliable transfer services to establish an association,
1077: but then uses remote operation services to communicate with its peer.
1078: This entity will use a synchronous interface.
1079:
1080: There are two parts to the program:
1081: initialization and the request/reply loop.
1082: In our example,
1083: we assume that the routine \verb"error" results in the process being
1084: terminated after printing a diagnostic.
1085:
1086: In Figure~\ref{initRTSresponder},
1087: the initialization steps for the generic responder,
1088: including the outer {\em C\/} wrapper,
1089: is shown.
1090: First, the RtSAP state is re-captured by calling \verb"RtInit".
1091: If this succeeds,
1092: then the association is authenticated and any command line arguments
1093: (as defined in the \man isoservices(5) file described in
1094: Chapter~\ref{isoservices} of \voltwo/)
1095: are parsed.
1096: Assuming that the responder is satisfied with the proposed association,
1097: it calls \verb"RtOpenResponse" to accept the association.
1098: The \verb"RoSetService" routine is called to set the underlying service to be
1099: used for remote operations.
1100: Finally,
1101: the main request/reply loop is realized.
1102: The responder calls \verb"RoWaitRequest" to get the next event,
1103: and then calls \verb"ros_indication" to decode that event.
1104:
1105: Figure~\ref{doROSresponder} on page~\pageref{doROSresponder}
1106: contains the definition of the
1107: \verb"ros_indication" routine and associated routines.
1108: Since the reliable transfer service was used to establish the association,
1109: a different closing handler must be used.
1110: This is shown in Figure~\ref{finRTSresponder}.
1111: {\let\small=\scriptsize %%% yikes!
1112: \clearpage
1113: \tagrind[tp]{grind2c-2}{Initializing the generic RTS responder}%
1114: {initRTSresponder}
1115: \clearpage
1116: \tagrind[tp]{grind2c-3}{Finalizing the generic RTS responder}%
1117: {finRTSresponder}}
1118:
1119: \section {For Further Reading}
1120: \cite{MHS.RTS} is the CCITT recommendation describing the reliable transfer
1121: service.
1122: The draft CCITT work which assumes the use of new-style associations is
1123: defined in \cite{CCITT.RTS.Service} and \cite{CCITT.RTS.Protocol}.
1124: Similarly,
1125: the corresponding ISO work is
1126: \cite{ISO.RTS.Service} and \cite{ISO.RTS.Protocol}.
1127:
1128: %%% \section {Changes Since the Last Release}\label{rtsap:changes}
1129: %%% A brief summary of the major changes between v~\rtsaprevrsn/ and
1130: %%% v~\rtsapvrsn/ are now presented.
1131: %%% These are the user-visible changes only;
1132: %%% changes of a strictly internal nature are not discussed.
1133:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.