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