|
|
1.1 root 1: /* rt2ss.c - RTPM: SSAP interface */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/rtsap/RCS/rt2ss.c,v 7.2 90/07/01 21:07:02 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/rtsap/RCS/rt2ss.c,v 7.2 90/07/01 21:07:02 mrose Exp $
9: *
10: *
11: * $Log: rt2ss.c,v $
12: * Revision 7.2 90/07/01 21:07:02 mrose
13: * pepsy
14: *
15: * Revision 6.2 89/06/23 11:28:36 mrose
16: * touch-up
17: *
18: * Revision 6.1 89/05/31 15:02:28 mrose
19: * sek
20: *
21: * Revision 6.0 89/03/18 23:43:15 mrose
22: * Release 5.0
23: *
24: */
25:
26: /*
27: * NOTICE
28: *
29: * Acquisition, use, and distribution of this module and related
30: * materials are subject to the restrictions of a license agreement.
31: * Consult the Preface in the User's Manual for the full terms of
32: * this agreement.
33: *
34: */
35:
36:
37: /* LINTLIBRARY */
38:
39: #include <stdio.h>
40: #include "RTS-types.h"
41: #include "OACS-types.h"
42: #include "rtpkt.h"
43: #include "tailor.h"
44:
45: /* DATA */
46:
47: #define doSSabort ss2rtsabort
48:
49:
50: int ssDATAser (), ssTOKENser (), ssSYNCser (), ssACTIVITYser (),
51: ssREPORTser (), ssFINISHser (), ssABORTser ();
52:
53:
54: long time ();
55:
56: /* */
57:
58: int rt2sspturn (acb, priority, rti)
59: register struct assocblk *acb;
60: int priority;
61: register struct RtSAPindication *rti;
62: {
63: int result,
64: len;
65: char *base;
66: PE pe;
67: struct SSAPindication sis;
68: struct SSAPindication *si = &sis;
69: struct SSAPabort *sa = &si -> si_abort;
70:
71: if (!(acb -> acb_flags & ACB_TWA))
72: return rtsaplose (rti, RTS_OPERATION, NULLCP,
73: "mode of association is monologue");
74: if (acb -> acb_flags & ACB_TURN)
75: return rtsaplose (rti, RTS_OPERATION, NULLCP, "turn owned by you");
76:
77: /* begin Priority PSDU (pseudo) */
78: if ((pe = int2prim (priority)) == NULLPE)
79: return rtsaplose (rti, RTS_CONGEST, NULLCP, NULLCP);
80: /* end Priority PSDU */
81:
82: PLOGP (rtsap_log,OACS_Priority, pe, "Priority", 0);
83:
84: result = pe2ssdu (pe, &base, &len);
85: pe_free (pe);
86: if (result == NOTOK)
87: return rtsaplose (rti, RTS_CONGEST, NULLCP, NULLCP);
88:
89: result = SPTokenRequest (acb -> acb_fd, ST_DAT_TOKEN, base, len, si);
90: free (base);
91:
92: if (result == NOTOK) {
93: (void) ss2rtslose (acb, rti, "SPTokenRequest", sa);
94: freeacblk (acb);
95: }
96:
97: return result;
98: }
99:
100: /* */
101:
102: int rt2ssgturn (acb, rti)
103: register struct assocblk *acb;
104: register struct RtSAPindication *rti;
105: {
106: struct SSAPindication sis;
107: struct SSAPindication *si = &sis;
108: struct SSAPabort *sa = &si -> si_abort;
109:
110: if (!(acb -> acb_flags & ACB_TWA))
111: return rtsaplose (rti, RTS_OPERATION, NULLCP,
112: "mode of association is monologue");
113: if (!(acb -> acb_flags & ACB_TURN))
114: return rtsaplose (rti, RTS_OPERATION, NULLCP, "turn not owned by you");
115: if (acb -> acb_flags & ACB_ACT)
116: return rtsaplose (rti, RTS_OPERATION, NULLCP, "transfer in progress");
117:
118: if (SGControlRequest (acb -> acb_fd, si) == NOTOK) {
119: (void) ss2rtslose (acb, rti, "SGControlRequest", sa);
120: freeacblk (acb);
121: return NOTOK;
122: }
123:
124: acb -> acb_flags &= ~(ACB_TURN | ACB_PLEASE);
125:
126: return OK;
127: }
128:
129: /* */
130:
131: int rt2sstrans (acb, data, secs, rti)
132: register struct assocblk *acb;
133: register PE data;
134: int secs;
135: register struct RtSAPindication *rti;
136: {
137: register int cc,
138: size;
139: int result,
140: len;
141: long clock,
142: limit;
143: register char *dp;
144: char *base;
145: PE pe;
146: struct SSAPactid ids;
147: register struct SSAPactid *id = &ids;
148: struct SSAPindication sis;
149: struct SSAPindication *si = &sis;
150: struct SSAPabort *sa = &si -> si_abort;
151: struct RtSAPabort *rta = &rti -> rti_abort;
152:
153: if (!(acb -> acb_flags & ACB_TURN))
154: return rtsaplose (rti, RTS_OPERATION, NULLCP, "turn not owned by you");
155: if (acb -> acb_flags & ACB_ACT)
156: return rtsaplose (rti, RTS_OPERATION, NULLCP, "transfer in progress");
157:
158: if ((pe = int2prim (acb -> acb_actno)) == NULLPE)
159: return rtsaplose (rti, RTS_CONGEST, NULLCP, NULLCP);
160: result = pe2ssdu (pe, &base, &len);
161: pe_free (pe);
162: if (result == NOTOK)
163: return rtsaplose (rti, RTS_CONGEST, NULLCP, NULLCP);
164: bcopy (base, id -> sd_data, (int) (id -> sd_len = len));
165: free (base);
166: base = NULL;
167:
168: if (SActStartRequest (acb -> acb_fd, id, NULLCP, 0, si) == NOTOK) {
169: (void) ss2rtslose (acb, rti, "SActStartRequest", sa);
170: goto out;
171: }
172:
173: acb -> acb_flags |= ACB_ACT;
174:
175: if (data && pe2ssdu (data, &base, &len) == NOTOK) {
176: (void) rtsaplose (rti, RTS_CONGEST, NULLCP, NULLCP);
177: goto out;
178: }
179:
180: result = OK;
181: if (acb -> acb_ckpoint == 0) {
182: if (data == NULLPE) {
183: if ((*acb -> acb_downtrans) (acb -> acb_fd, &base, &len, 0, 0L,
184: 0L, rti) == NOTOK) {
185: bad_trans: ;
186: if (SActDiscRequest (acb -> acb_fd, SP_LOCAL, si) == NOTOK) {
187: (void) ss2rtslose (acb, rti, "SActDiscRequest", sa);
188: goto out;
189: }
190: goto done;
191: }
192: if (len == 0) {
193: base = NULL;
194: goto done;
195: }
196: }
197:
198: if (SDataRequest (acb -> acb_fd, base, len, si) == NOTOK) {
199: (void) ss2rtslose (acb, rti, "SDataRequest", sa);
200: goto out;
201: }
202: }
203: else {
204: size = acb -> acb_ckpoint << 10; /* units of 1024 octets */
205: if (acb -> acb_ssdusize >= 0x0100) /* at least 256 octets */
206: size = min (size, acb -> acb_ssdusize);
207: acb -> acb_ssn = acb -> acb_ack = 0L;
208: if (secs != NOTOK) {
209: (void) time (&limit);
210: limit += secs;
211: }
212:
213: if (data == NULLPE) {
214: if ((*acb -> acb_downtrans) (acb -> acb_fd, &base, &len, size,
215: acb -> acb_ssn, acb -> acb_ack,
216: rti) == NOTOK)
217: goto bad_trans;
218: if (len == 0) {
219: base = NULL;
220: goto done;
221: }
222: }
223:
224: dp = base, cc = min (len, size);
225: if (SDataRequest (acb -> acb_fd, dp, cc, si) == NOTOK) {
226: (void) ss2rtslose (acb, rti, "SDataRequest", sa);
227: goto out;
228: }
229:
230: for (dp += cc, len -= cc;
231: data == NULLPE || len > 0;
232: dp += cc, len -= cc) {
233: if (data == NULLPE && len == 0) {
234: if ((*acb -> acb_downtrans) (acb -> acb_fd, &base, &len, size,
235: acb -> acb_ssn, acb -> acb_ack,
236: rti) == NOTOK)
237: goto bad_trans;
238: if (len == 0) {
239: base = NULL;
240: break;
241: }
242: dp = base;
243: }
244:
245: if (secs != NOTOK) {
246: (void) time (&clock);
247: if (limit < clock) {
248: result = NOTOK;
249: break;
250: }
251: }
252:
253: if (SMinSyncRequest (acb -> acb_fd, SYNC_CONFIRM,
254: &acb -> acb_ssn, NULLCP, 0, si) == NOTOK) {
255: (void) ss2rtslose (acb, rti, "SMinSyncRequest", sa);
256: goto out;
257: }
258:
259: if (acb -> acb_ssn - acb -> acb_ack > acb -> acb_window) {
260: do {
261: if (RtWaitRequestAux (acb, NOTOK, 1, rti) == NOTOK) {
262: if (RTS_FATAL (rta -> rta_reason))
263: acb = NULLACB;
264: goto out;
265: }
266: }
267: while (acb -> acb_ssn - acb -> acb_ack > acb -> acb_window);
268:
269: #ifdef notdef
270: /* avoid silly window syndrome */
271: while (acb -> acb_ssn != acb -> acb_ack)
272: if (RtWaitRequestAux (acb, OK, 1, rti) == NOTOK)
273: if (rta -> rta_reason != RTS_TIMER) {
274: if (RTS_FATAL (rta -> rta_reason))
275: acb = NULLACB;
276: goto out;
277: }
278: else
279: break;
280: #endif
281: }
282:
283: cc = min (len, size);
284: if (SDataRequest (acb -> acb_fd, dp, cc, si) == NOTOK) {
285: (void) ss2rtslose (acb, rti, "SDataRequest", sa);
286: goto out;
287: }
288: }
289: }
290: if (data)
291: free (base);
292: base = NULL;
293:
294: done: ;
295: switch (result) {
296: case OK:
297: if (SActEndRequest (acb -> acb_fd, &acb -> acb_ssn, NULLCP, 0,
298: si) == NOTOK) {
299: (void) ss2rtslose (acb, rti, "SActEndRequest", sa);
300: goto out;
301: }
302: break;
303:
304: default:
305: acb -> acb_flags |= ACB_TIMER;
306: if (SActDiscRequest (acb -> acb_fd, SP_LOCAL, si) == NOTOK) {
307: (void) ss2rtslose (acb, rti, "SActDiscRequest", sa);
308: goto out;
309: }
310: break;
311: }
312:
313: while (acb -> acb_flags & ACB_ACT)
314: if (RtWaitRequestAux (acb, NOTOK, 1, rti) == NOTOK) {
315: if (RTS_FATAL (rta -> rta_reason))
316: acb = NULLACB;
317: goto out;
318: }
319:
320: acb -> acb_flags &= ~ACB_TIMER;
321: acb -> acb_actno++;
322:
323: return result;
324:
325: out: ;
326: if (data && base)
327: free (base);
328: if (acb)
329: freeacblk (acb);
330:
331: return NOTOK;
332: }
333:
334: /* */
335:
336: int rt2sswait (acb, secs, trans, rti)
337: register struct assocblk *acb;
338: int secs,
339: trans;
340: register struct RtSAPindication *rti;
341: {
342: int result;
343: struct SSAPdata sxs;
344: register struct SSAPdata *sx = &sxs;
345: struct SSAPindication sis;
346: register struct SSAPindication *si = &sis;
347:
348: for (;;) {
349: switch (result = SReadRequest (acb -> acb_fd, sx, secs, si)) {
350: case NOTOK:
351: return doSSabort (acb, &si -> si_abort, rti);
352:
353: case OK:
354: if (doSSdata (acb, sx, rti) == NOTOK)
355: return NOTOK;
356: continue;
357:
358: case DONE:
359: switch (si -> si_type) {
360: case SI_TOKEN:
361: if ((result = doSStoken (acb, &si -> si_token, trans,
362: rti)) != OK)
363: return result;
364: continue;
365:
366: case SI_SYNC:
367: if ((result = doSSsync (acb, &si -> si_sync, rti)) != OK
368: || trans)
369: return result;
370: continue;
371:
372: case SI_ACTIVITY:
373: if ((result = doSSactivity (acb, &si -> si_activity, rti)) != OK
374: || trans)
375: return (result != DONE ? result : OK);
376: continue;
377:
378: case SI_REPORT:
379: if (doSSreport (acb, &si -> si_report, rti) == NOTOK)
380: return NOTOK;
381: continue;
382:
383: case SI_FINISH:
384: return doSSfinish (acb, &si -> si_finish, rti);
385:
386: default:
387: (void) rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
388: "unknown indication (0x%x) from session",
389: si -> si_type);
390: break;
391: }
392: break;
393:
394: default:
395: (void) rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
396: "unexpected return from SReadRequest=%d", result);
397: break;
398: }
399: break;
400: }
401:
402: freeacblk (acb);
403: return NOTOK;
404: }
405:
406: /* define vectors for INDICATION events */
407:
408: #define e(i) (indication ? (i) : NULLIFP)
409:
410:
411: int rt2ssasync (acb, indication, rti)
412: register struct assocblk *acb;
413: IFP indication;
414: struct RtSAPindication *rti;
415: {
416: struct SSAPindication sis;
417: struct SSAPindication *si = &sis;
418: struct SSAPabort *sa = &si -> si_abort;
419:
420: if (SSetIndications (acb -> acb_fd, e (ssDATAser), e (ssTOKENser),
421: e (ssSYNCser), e (ssACTIVITYser), e (ssREPORTser),
422: e (ssFINISHser), e (ssABORTser), si) == NOTOK)
423: switch (sa -> sa_reason) {
424: case SC_WAITING:
425: return rtsaplose (rti, RTS_WAITING, NULLCP, NULLCP);
426:
427: default:
428: (void) ss2rtslose (acb, rti, "SSetIndications", sa);
429: freeacblk (acb);
430: return NOTOK;
431: }
432:
433: if (acb -> acb_rtsindication = indication)
434: acb -> acb_flags |= ACB_ASYN;
435: else
436: acb -> acb_flags &= ~ACB_ASYN;
437:
438: return OK;
439: }
440:
441: #undef e
442:
443: /* map association descriptors for select() */
444:
445: int rt2ssmask (acb, mask, nfds, rti)
446: register struct assocblk *acb;
447: fd_set *mask;
448: int *nfds;
449: struct RtSAPindication *rti;
450: {
451: struct SSAPindication sis;
452: struct SSAPindication *si = &sis;
453: struct SSAPabort *sa = &si -> si_abort;
454:
455: if (SSelectMask (acb -> acb_fd, mask, nfds, si) == NOTOK)
456: switch (sa -> sa_reason) {
457: case SC_WAITING:
458: return rtsaplose (rti, RTS_WAITING, NULLCP, NULLCP);
459:
460: default:
461: (void) ss2rtslose (acb, rti, "SSelectMask", sa);
462: freeacblk (acb);
463: return NOTOK;
464: }
465:
466: return OK;
467: }
468:
469: /* protocol-level abort */
470:
471: int rt2sslose (acb, result)
472: register struct assocblk *acb;
473: int result;
474: {
475: int len;
476: char *base;
477: PE pe;
478: struct SSAPindication sis;
479:
480: base = NULL, len = 0;
481: /* begin AbortInformation PSDU (pseudo) */
482: if (pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_CONS, PE_CONS_SET)) {
483: if (set_add (pe, num2prim (result, PE_CLASS_CONT, 0)) != NOTOK)
484: (void) pe2ssdu (pe, &base, &len);
485:
486: PLOGP (rtsap_log,OACS_AbortInformation, pe, "AbortInformation",
487: 0);
488:
489:
490: pe_free (pe);
491: }
492: /* end AbortInformation PSDU */
493:
494: (void) SUAbortRequest (acb -> acb_fd, base, len, &sis);
495: if (!(acb -> acb_flags & ACB_STICKY))
496: acb -> acb_fd = NOTOK;
497:
498: if (base)
499: free (base);
500: }
501:
502: /* SSAP interface */
503:
504: static int doSSdata (acb, sx, rti)
505: register struct assocblk *acb;
506: register struct SSAPdata *sx;
507: struct RtSAPindication *rti;
508: {
509: register struct qbuf *qb;
510: struct SSAPindication sis;
511: register struct SSAPindication *si = &sis;
512: register struct SSAPabort *sa = &si -> si_abort;
513:
514: if (!(acb -> acb_flags & ACB_ACT)
515: || (acb -> acb_flags & ACB_TURN)
516: || sx -> sx_type != SX_NORMAL) {
517: (void) rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
518: "unexpected data indication (0x%x)", sx -> sx_type);
519: goto out;
520: }
521:
522: if (acb -> acb_uptrans) {
523: if ((*acb -> acb_uptrans) (acb -> acb_fd, SI_DATA,
524: (caddr_t) &sx -> sx_qbuf, rti) == NOTOK)
525: goto congested;
526:
527: goto done;
528: }
529:
530: if (acb -> acb_len > 0) {
531: unsigned int i;
532: register char *cp,
533: *dp;
534:
535: i = acb -> acb_len + sx -> sx_cc;
536: if (acb -> acb_realbase) {
537: if ((dp = malloc (i)) == NULL) {
538: congested: ;
539: if (SUReportRequest (acb -> acb_fd, SP_LOCAL, NULLCP, 0,
540: si) == NOTOK) {
541: (void) ss2rtslose (acb, rti, "SUReportRequest", sa);
542: goto out;
543: }
544: FREEACB (acb);
545: goto done;
546: }
547: bcopy (acb -> acb_base, dp, acb -> acb_len);
548: free (acb -> acb_realbase), acb -> acb_realbase = NULL;
549: }
550: else
551: if ((dp = realloc (acb -> acb_base, i)) == NULL)
552: goto congested;
553:
554: cp = dp + acb -> acb_len;
555: for (qb = sx -> sx_qbuf.qb_forw;
556: qb != &sx -> sx_qbuf;
557: qb = qb -> qb_forw)
558: if (qb -> qb_len) {
559: bcopy (qb -> qb_data, cp, qb -> qb_len);
560: cp += qb -> qb_len;
561: }
562: acb -> acb_base = dp;
563: acb -> acb_len = i;
564: }
565: else {
566: if ((qb = sx -> sx_qbuf.qb_forw) != &sx -> sx_qbuf
567: && qb -> qb_forw == &sx -> sx_qbuf) {
568: remque (qb);
569:
570: acb -> acb_realbase = (char *) qb;
571: acb -> acb_base = qb -> qb_data;
572: }
573: else
574: acb -> acb_base = qb2str (&sx -> sx_qbuf);
575:
576: acb -> acb_len = sx -> sx_cc;
577: }
578: done: ;
579: SXFREE (sx);
580:
581: return OK;
582:
583: out: ;
584: SXFREE (sx);
585:
586: freeacblk (acb);
587: return NOTOK;
588: }
589:
590: /* */
591:
592: static int doSStoken (acb, st, trans, rti)
593: register struct assocblk *acb;
594: register struct SSAPtoken *st;
595: int trans;
596: struct RtSAPindication *rti;
597: {
598: int result;
599: register PE pe;
600: struct SSAPindication sis;
601: register struct SSAPindication *si = &sis;
602: register struct SSAPabort *sa = &si -> si_abort;
603: struct type_OACS_Priority *priority;
604:
605: if (acb -> acb_flags & ACB_TWA)
606: switch (st -> st_type) {
607: case ST_CONTROL:
608: STFREE (st);
609: if (acb -> acb_flags & ACB_ACT)
610: break;
611: acb -> acb_owned = st -> st_owned;
612: acb -> acb_flags |= ACB_TURN;
613:
614: rti -> rti_type = RTI_TURN;
615: {
616: register struct RtSAPturn *rtu = &rti -> rti_turn;
617:
618: rtu -> rtu_please = 0;
619: }
620: return DONE;
621:
622: case ST_PLEASE:
623: pe = ssdu2pe (st -> st_data, st -> st_cc, NULLCP, &result);
624: STFREE (st);
625: if (pe == NULLPE) {
626: (void) rtpktlose (acb, rti, result != PS_ERR_NMEM
627: ? RTS_PROTOCOL : RTS_CONGEST, NULLCP,
628: ps_error (result));
629: goto out;
630: }
631: result = parse_OACS_Priority(pe, 1, NULLIP, NULLVP, &priority);
632:
633: #ifdef DEBUG
634: if (result != NOTOK && (rtsap_log -> ll_events & LLOG_PDUS))
635: pvpdu (rtsap_log, print_OACS_Priority_P, pe, "Priority",
636: 1);
637: #endif
638:
639: pe_free (pe);
640: if (result == NOTOK) {
641: (void) pylose ();
642: free_OACS_Priority(priority);
643: goto out;
644: }
645:
646: if (trans) {
647: if (acb -> acb_downtrans) {
648: if ((*acb -> acb_downtrans) (acb -> acb_fd, NULLVP,
649: NULLIP, priority -> parm,
650: 0L, 0L, rti) == NOTOK
651: && SActIntrRequest (acb -> acb_fd, SP_LOCAL,
652: si) == NOTOK) {
653: (void) ss2rtslose (acb, rti, "SActIntrRequest",sa);
654: free_OACS_Priority(priority);
655: goto out;
656: }
657: }
658: else {
659: acb -> acb_flags |= ACB_PLEASE;
660: acb -> acb_priority = priority -> parm;
661: }
662: free_OACS_Priority(priority);
663: return OK;
664: }
665:
666: rti -> rti_type = RTI_TURN;
667: {
668: register struct RtSAPturn *rtu = &rti -> rti_turn;
669:
670: rtu -> rtu_please = 1;
671: rtu -> rtu_priority = priority -> parm;
672: }
673: free_OACS_Priority(priority);
674: return DONE;
675:
676: default:
677: break;
678: }
679: (void) rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
680: "unexpected token indication (0x%x)", st -> st_type);
681:
682: out: ;
683: STFREE (st);
684:
685: freeacblk (acb);
686: return NOTOK;
687: }
688:
689: /* */
690:
691: static int doSSsync (acb, sn, rti)
692: register struct assocblk *acb;
693: register struct SSAPsync *sn;
694: struct RtSAPindication *rti;
695: {
696: struct SSAPindication sis;
697: register struct SSAPindication *si = &sis;
698: register struct SSAPabort *sa = &si -> si_abort;
699:
700: SNFREE (sn);
701:
702: if (acb -> acb_flags & ACB_ACT)
703: switch (sn -> sn_type) {
704: case SN_MINORIND: /* always confirm it */
705: if (acb -> acb_flags & ACB_TURN)
706: break;
707: if (acb -> acb_uptrans) {
708: if ((*acb -> acb_uptrans) (acb -> acb_fd, SI_SYNC,
709: (caddr_t) sn, rti) == NOTOK) {
710: if (SUReportRequest (acb -> acb_fd, SP_LOCAL,
711: NULLCP, 0, si) == NOTOK) {
712: (void) ss2rtslose (acb, rti, "SUReportRequest",sa);
713: goto out;
714: }
715: return OK;
716: }
717: }
718: if (SMinSyncResponse (acb -> acb_fd, sn -> sn_ssn,
719: NULLCP, 0, si) == NOTOK) {
720: (void) ss2rtslose (acb, rti, "SMinSyncResponse", sa);
721: goto out;
722: }
723: return OK;
724:
725: case SN_MINORCNF:
726: if (!(acb -> acb_flags & ACB_TURN))
727: break;
728: acb -> acb_ack = sn -> sn_ssn;
729: return OK;
730:
731: default:
732: break;
733: }
734: (void) rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
735: "unexpected sync indication (0x%x)", sn -> sn_type);
736:
737: out: ;
738: freeacblk (acb);
739:
740: return NOTOK;
741: }
742:
743: /* */
744:
745: static int doSSactivity (acb, sv, rti)
746: register struct assocblk *acb;
747: register struct SSAPactivity *sv;
748: struct RtSAPindication *rti;
749: {
750: int result;
751: register PE pe;
752: struct SSAPindication sis;
753: register struct SSAPindication *si = &sis;
754: register struct SSAPabort *sa = &si -> si_abort;
755:
756: SVFREE (sv);
757:
758: switch (sv -> sv_type) {
759: case SV_START:
760: if (acb -> acb_flags & (ACB_ACT | ACB_TURN))
761: break;
762: if (acb -> acb_uptrans) {
763: if ((*acb -> acb_uptrans) (acb -> acb_fd, SI_ACTIVITY,
764: (caddr_t) sv, rti) == NOTOK) {
765: if (SUReportRequest (acb -> acb_fd, SP_LOCAL,
766: NULLCP, 0, si) == NOTOK) {
767: (void) ss2rtslose (acb, rti, "SUReportRequest", sa);
768: goto out;
769: }
770: return OK;
771: }
772: }
773: acb -> acb_flags |= ACB_ACT;
774: return OK;
775:
776: case SV_RESUME: /* XXX: will support this later */
777: if (acb -> acb_flags & (ACB_ACT | ACB_TURN))
778: break;
779: if (SUReportRequest (acb -> acb_fd, SP_PROCEDURAL, NULLCP, 0,
780: si) == NOTOK) {
781: (void) ss2rtslose (acb, rti, "SUReportRequest", sa);
782: goto out;
783: }
784: acb -> acb_flags |= ACB_ACT;
785: return OK;
786:
787: case SV_INTRIND:
788: case SV_DISCIND:
789: if (!(acb -> acb_flags & ACB_ACT)
790: || (acb -> acb_flags & ACB_TURN))
791: break;
792: if (acb -> acb_uptrans)
793: (void) (*acb -> acb_uptrans) (acb -> acb_fd, SI_ACTIVITY,
794: (caddr_t) sv, rti);
795: if ((sv -> sv_type == SV_INTRIND
796: ? SActIntrResponse (acb -> acb_fd, si)
797: : SActDiscResponse (acb -> acb_fd, si)) == NOTOK) {
798: (void) ss2rtslose (acb, rti, sv -> sv_type == SV_INTRIND
799: ? "SActIntrResponse" : "SActDiscResponse", sa);
800: goto out;
801: }
802: FREEACB (acb);
803: acb -> acb_flags &= ~ACB_ACT;
804: return OK;
805:
806: case SV_INTRCNF:
807: case SV_DISCCNF:
808: if (!(acb -> acb_flags & ACB_ACT)
809: || !(acb -> acb_flags & ACB_TURN))
810: break;
811: acb -> acb_flags &= ~ACB_ACT;
812: (void) rtsaplose (rti, acb -> acb_flags & ACB_TIMER ? RTS_TIMER
813: : RTS_TRANSFER, NULLCP, NULLCP);
814: return OK;
815:
816: case SV_ENDIND:
817: if (!(acb -> acb_flags & ACB_ACT)
818: || (acb -> acb_flags & ACB_TURN))
819: break;
820: if (acb -> acb_uptrans) {
821: if ((*acb -> acb_uptrans) (acb -> acb_fd, SI_ACTIVITY,
822: (caddr_t) sv, rti) == NOTOK) {
823: if (SUReportRequest (acb -> acb_fd, SP_LOCAL, NULLCP, 0,
824: si) == NOTOK) {
825: (void) ss2rtslose (acb, rti, "SUReportRequest", sa);
826: goto out;
827: }
828:
829: return OK;
830: }
831:
832: pe = NULLPE;
833: goto end_it;
834: }
835:
836: if (acb -> acb_base) {
837: if (pe = ssdu2pe (acb -> acb_base, acb -> acb_len,
838: acb -> acb_realbase ? acb -> acb_realbase
839: : acb -> acb_base,
840: &result))
841: acb -> acb_realbase = acb -> acb_base = NULL;
842: }
843: else
844: pe = NULLPE, result = PS_ERR_EOF;
845: FREEACB (acb);
846: if (pe == NULLPE) {
847: if (result != PS_ERR_NMEM) {
848: (void) rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP, "%s",
849: ps_error (result));
850: goto out;
851: }
852: if (SUReportRequest (acb -> acb_fd, SP_LOCAL, NULLCP, 0, si)
853: == NOTOK) {
854: (void) ss2rtslose (acb, rti, "SUReportRequest", sa);
855: goto out;
856: }
857: return OK;
858: }
859:
860: end_it: ;
861: if (SActEndResponse (acb -> acb_fd, NULLCP, 0, si) == NOTOK) {
862: (void) ss2rtslose (acb, rti, "SActEndResponse", sa);
863: if (pe)
864: pe_free (pe);
865: goto out;
866: }
867: acb -> acb_flags &= ~ACB_ACT;
868:
869: rti -> rti_type = RTI_TRANSFER;
870: {
871: register struct RtSAPtransfer *rtt = &rti -> rti_transfer;
872:
873: rtt -> rtt_data = pe;
874: }
875: return DONE;
876:
877: case SV_ENDCNF:
878: if (!(acb -> acb_flags & ACB_ACT)
879: || !(acb -> acb_flags & ACB_TURN))
880: break;
881: acb -> acb_flags &= ~ACB_ACT;
882: return OK;
883:
884: default:
885: break;
886: }
887: (void) rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
888: "unexpected activity indication (0x%x)", sv -> sv_type);
889:
890: out: ;
891: freeacblk (acb);
892: return NOTOK;
893: }
894:
895: /* */
896:
897: static int doSSreport (acb, sp, rti)
898: register struct assocblk *acb;
899: register struct SSAPreport *sp;
900: struct RtSAPindication *rti;
901: {
902: struct SSAPindication sis;
903: register struct SSAPindication *si = &sis;
904: register struct SSAPabort *sa = &si -> si_abort;
905:
906: SPFREE (sp);
907:
908: if (!sp -> sp_peer) {
909: if (!(acb -> acb_flags & ACB_ACT))
910: goto out2;
911:
912: /* XXX: should try lots of things here, based on how many checkpoints have
913: been acknowledged, but, for now we'll treate everything as severe... */
914:
915: (void) rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
916: "unrecoverable provider-initiated exception report");
917: goto out1;
918: }
919:
920: if (!(acb -> acb_flags & ACB_ACT)
921: || !(acb -> acb_flags & ACB_TURN)) {
922: out2: ;
923: (void) rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
924: "unexpected exception report indication (0x%x)",
925: sp -> sp_peer);
926: goto out1;
927: }
928:
929: /* XXX: should try lots of things here, based on pp_reason,
930: but, for now we'll treat everything as SP_NOREASON... */
931:
932: if (acb -> acb_uptrans)
933: (void) (*acb -> acb_uptrans) (acb -> acb_fd, SI_REPORT,
934: (caddr_t) sp, rti);
935: if (SActDiscRequest (acb -> acb_fd, SP_NOREASON, si) != NOTOK)
936: return OK;
937: (void) ss2rtslose (acb, rti, "SActDiscRequest", sa);
938:
939: out1: ;
940: freeacblk (acb);
941: return NOTOK;
942: }
943:
944: /* */
945:
946: /* ARGSUSED */
947:
948: static int doSSfinish (acb, sf, rti)
949: register struct assocblk *acb;
950: struct SSAPfinish *sf;
951: struct RtSAPindication *rti;
952: {
953: SFFREE (sf);
954:
955: if (((acb -> acb_flags & ACB_INIT) && (acb -> acb_flags & ACB_TWA))
956: || (acb -> acb_flags & ACB_TURN)) {
957: (void) rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
958: "association management botched");
959: goto out;
960: }
961:
962: if (acb -> acb_flags & ACB_ACT) {
963: (void) rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
964: "unexpected release indication");
965: goto out;
966: }
967:
968: acb -> acb_flags |= ACB_FINN;
969: rti -> rti_type = RTI_CLOSE;
970: {
971: register struct RtSAPclose *rtc = &rti -> rti_close;
972:
973: bzero ((char *) rtc, sizeof *rtc);
974: }
975: return DONE;
976:
977: out: ;
978: freeacblk (acb);
979: return NOTOK;
980: }
981:
982: /* */
983:
984: int ss2rtsabort (acb, sa, rti)
985: register struct assocblk *acb;
986: register struct SSAPabort *sa;
987: struct RtSAPindication *rti;
988: {
989: int result;
990: register PE pe;
991: struct type_OACS_AbortInformation *pabi = 0;
992:
993: if (!sa -> sa_peer) {
994: if (sa -> sa_reason == SC_TIMER)
995: return rtsaplose (rti, RTS_TIMER, NULLCP, NULLCP);
996:
997: (void) ss2rtslose (acb, rti, NULLCP, sa);
998: goto out;
999: }
1000:
1001: if (sa -> sa_cc == 0) {
1002: (void) rtsaplose (rti, RTS_ABORTED, NULLCP, NULLCP);
1003: goto out;
1004: }
1005:
1006: if ((pe = ssdu2pe (sa -> sa_info, sa -> sa_cc, NULLCP, &result))
1007: == NULLPE) {
1008: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP, NULLCP);
1009: goto out;
1010: }
1011: /* acsap_abort = -1; */
1012: result = parse_OACS_AbortInformation (pe, 1, NULLIP, NULLVP, &pabi);
1013:
1014: #ifdef DEBUG
1015: if (result != NOTOK && (rtsap_log -> ll_events & LLOG_PDUS))
1016: pvpdu (rtsap_log, print_OACS_AbortInformation_P, pe,
1017: "AbortInformation", 1);
1018: #endif
1019:
1020: pe_free (pe);
1021: if (result == NOTOK) {
1022: (void) rtsaplose (rti, RTS_PROTOCOL, "%s", PY_pepy);
1023: free_OACS_AbortInformation (pabi);
1024: goto out;
1025: }
1026: if (pabi->member_OACS_6)
1027: result = pabi -> member_OACS_6 -> parm;
1028: else
1029: result = -1;
1030: switch (result) {
1031: case ABORT_LSP:
1032: case ABORT_TMP:
1033: result = RTS_REMOTE;
1034: break;
1035:
1036: default:
1037: result = RTS_PROTOCOL;
1038: break;
1039: }
1040: (void) rtsaplose (rti, result, NULLCP, NULLCP);
1041: free_OACS_AbortInformation (pabi);
1042:
1043: out: ;
1044: SAFREE (sa);
1045: if (!(acb -> acb_flags & ACB_STICKY))
1046: acb -> acb_fd = NOTOK;
1047: freeacblk (acb);
1048:
1049: return NOTOK;
1050: }
1051:
1052: /* */
1053:
1054: static int ssDATAser (sd, sx)
1055: int sd;
1056: register struct SSAPdata *sx;
1057: {
1058: IFP handler;
1059: register struct assocblk *acb;
1060: struct RtSAPindication rtis;
1061: register struct RtSAPindication *rti = &rtis;
1062:
1063: if ((acb = findacblk (sd)) == NULL)
1064: return;
1065: handler = acb -> acb_rtsindication;
1066:
1067: if (doSSdata (acb, sx, rti) != OK)
1068: (*handler) (sd, rti);
1069: }
1070:
1071: /* */
1072:
1073: static int ssTOKENser (sd, st)
1074: int sd;
1075: register struct SSAPtoken *st;
1076: {
1077: IFP handler;
1078: register struct assocblk *acb;
1079: struct RtSAPindication rtis;
1080: register struct RtSAPindication *rti = &rtis;
1081:
1082: if ((acb = findacblk (sd)) == NULL)
1083: return;
1084: handler = acb -> acb_rtsindication;
1085:
1086: if (doSStoken (acb, st, 0, rti) != OK)
1087: (*handler) (sd, rti);
1088: }
1089:
1090: /* */
1091:
1092: static int ssSYNCser (sd, sn)
1093: int sd;
1094: register struct SSAPsync *sn;
1095: {
1096: IFP handler;
1097: register struct assocblk *acb;
1098: struct RtSAPindication rtis;
1099: register struct RtSAPindication *rti = &rtis;
1100:
1101: if ((acb = findacblk (sd)) == NULL)
1102: return;
1103: handler = acb -> acb_rtsindication;
1104:
1105: if (doSSsync (acb, sn, rti) != OK)
1106: (*handler) (sd, rti);
1107: }
1108:
1109: /* */
1110:
1111: static int ssACTIVITYser (sd, sv)
1112: int sd;
1113: register struct SSAPactivity *sv;
1114: {
1115: IFP handler;
1116: register struct assocblk *acb;
1117: struct RtSAPindication rtis;
1118: register struct RtSAPindication *rti = &rtis;
1119:
1120: if ((acb = findacblk (sd)) == NULL)
1121: return;
1122: handler = acb -> acb_rtsindication;
1123:
1124: if (doSSactivity (acb, sv, rti) != OK)
1125: (*handler) (sd, rti);
1126: }
1127:
1128: /* */
1129:
1130: static int ssREPORTser (sd, sp)
1131: int sd;
1132: register struct SSAPreport *sp;
1133: {
1134: IFP handler;
1135: register struct assocblk *acb;
1136: struct RtSAPindication rtis;
1137: register struct RtSAPindication *rti = &rtis;
1138:
1139: if ((acb = findacblk (sd)) == NULL)
1140: return;
1141: handler = acb -> acb_rtsindication;
1142:
1143: if (doSSreport (acb, sp, rti) != OK)
1144: (*handler) (sd, rti);
1145: }
1146:
1147: /* */
1148:
1149: static int ssFINISHser (sd, sf)
1150: int sd;
1151: struct SSAPfinish *sf;
1152: {
1153: IFP handler;
1154: register struct assocblk *acb;
1155: struct RtSAPindication rtis;
1156: register struct RtSAPindication *rti = &rtis;
1157:
1158: if ((acb = findacblk (sd)) == NULL)
1159: return;
1160: handler = acb -> acb_rtsindication;
1161:
1162: (void) doSSfinish (acb, sf, rti);
1163:
1164: (*handler) (sd, rti);
1165: }
1166:
1167: /* */
1168:
1169: static int ssABORTser (sd, sa)
1170: int sd;
1171: register struct SSAPabort *sa;
1172: {
1173: IFP handler;
1174: register struct assocblk *acb;
1175: struct RtSAPindication rtis;
1176: register struct RtSAPindication *rti = &rtis;
1177:
1178: if ((acb = findacblk (sd)) == NULL)
1179: return;
1180: handler = acb -> acb_rtsindication;
1181:
1182: (void) doSSabort (acb, sa, rti);
1183:
1184: (*handler) (sd, rti);
1185: }
1186:
1187: /* */
1188:
1189: int ss2rtslose (acb, rti, event, sa)
1190: register struct assocblk *acb;
1191: register struct RtSAPindication *rti;
1192: char *event;
1193: register struct SSAPabort *sa;
1194: {
1195: int reason;
1196: char *cp,
1197: buffer[BUFSIZ];
1198:
1199: if (event)
1200: SLOG (rtsap_log, LLOG_EXCEPTIONS, NULLCP,
1201: (sa -> sa_cc > 0 ? "%s: %s [%*.*s]": "%s: %s", event,
1202: SErrString (sa -> sa_reason), sa -> sa_cc, sa -> sa_cc,
1203: sa -> sa_data));
1204:
1205: cp = "";
1206: switch (sa -> sa_reason) {
1207: case SC_SSAPID:
1208: case SC_SSUSER:
1209: case SC_ADDRESS:
1210: reason = RTS_ADDRESS;
1211: break;
1212:
1213: case SC_REFUSED:
1214: reason = RTS_REFUSED;
1215: break;
1216:
1217: case SC_CONGEST:
1218: reason = RTS_CONGEST;
1219: break;
1220:
1221: default:
1222: (void) sprintf (cp = buffer, " (%s at session)",
1223: SErrString (sa -> sa_reason));
1224: case SC_TRANSPORT:
1225: case SC_ABORT:
1226: reason = RTS_SESSION;
1227: break;
1228: }
1229:
1230: if (sa -> sa_cc > 0)
1231: return rtpktlose (acb, rti, reason, NULLCP, "%*.*s%s",
1232: sa -> sa_cc, sa -> sa_cc, sa -> sa_data, cp);
1233: else
1234: return rtpktlose (acb, rti, reason, NULLCP, "%s", *cp ? cp + 1 : cp);
1235: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.