|
|
1.1 ! root 1: /* rt2psrespond.c - RTPM: responder */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/rtsap/RCS/rt2psrespond.c,v 7.2 90/07/27 08:47:50 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/rtsap/RCS/rt2psrespond.c,v 7.2 90/07/27 08:47:50 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: rt2psrespond.c,v $ ! 12: * Revision 7.2 90/07/27 08:47:50 mrose ! 13: * update ! 14: * ! 15: * Revision 7.1 90/07/01 21:07:00 mrose ! 16: * pepsy ! 17: * ! 18: * Revision 6.0 89/03/18 23:43:13 mrose ! 19: * Release 5.0 ! 20: * ! 21: */ ! 22: ! 23: /* ! 24: * NOTICE ! 25: * ! 26: * Acquisition, use, and distribution of this module and related ! 27: * materials are subject to the restrictions of a license agreement. ! 28: * Consult the Preface in the User's Manual for the full terms of ! 29: * this agreement. ! 30: * ! 31: */ ! 32: ! 33: ! 34: /* LINTLIBRARY */ ! 35: ! 36: #include <stdio.h> ! 37: #include "RTS-types.h" ! 38: #include "rtpkt.h" ! 39: #include "tailor.h" ! 40: ! 41: /* RT-OPEN.INDICATION */ ! 42: ! 43: int RtInit_Aux (vecp, vec, rts, rti, dctx) ! 44: int vecp; ! 45: char **vec; ! 46: struct RtSAPstart *rts; ! 47: struct RtSAPindication *rti; ! 48: OID dctx; ! 49: { ! 50: int ctx, ! 51: i; ! 52: register PE pe; ! 53: register struct assocblk *acb; ! 54: register struct PSAPstart *ps; ! 55: register struct AcSAPstart *acs; ! 56: struct AcSAPindication acis; ! 57: register struct AcSAPindication *aci = &acis; ! 58: register struct AcSAPabort *aca = &aci -> aci_abort; ! 59: struct type_RTS_RTSE__apdus *rtpdu; ! 60: struct type_RTS_RTORQapdu *prtorq; ! 61: ! 62: isodetailor (NULLCP, 0); ! 63: ! 64: missingP (vec); ! 65: missingP (rts); ! 66: missingP (rti); ! 67: ! 68: acs = &rts -> rts_start; ! 69: ps = &acs -> acs_start; ! 70: ! 71: bzero ((char *) rts, sizeof *rts); ! 72: ! 73: if (AcInit (vecp, vec, acs, aci) == NOTOK) ! 74: return acs2rtslose (NULLACB, rti, "AcInit", aca); ! 75: if ((acb = findacblk (acs -> acs_sd)) == NULLACB) { ! 76: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP, "ACSE mangled"); ! 77: goto out; ! 78: } ! 79: acb -> acb_flags |= ACB_RTS; ! 80: acb -> acb_uabort = AcUAbortRequest; ! 81: SetPS2RtService (acb); ! 82: ! 83: acb -> acb_connect = ps -> ps_connect; /* struct copy */ ! 84: if ((ps -> ps_srequirements &= RTS_MYREQUIRE) != RTS_MYREQUIRE) { ! 85: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP, ! 86: "desired session requirements unavailable"); ! 87: goto out; ! 88: } ! 89: acb -> acb_requirements = ps -> ps_srequirements; ! 90: ! 91: #define dotoken(requires,shift,bit,type) \ ! 92: { \ ! 93: if (acb -> acb_requirements & requires) \ ! 94: switch (ps -> ps_settings & (ST_MASK << shift)) { \ ! 95: case ST_INIT_VALUE << shift: \ ! 96: acb -> acb_avail |= bit; \ ! 97: break; \ ! 98: \ ! 99: case ST_RESP_VALUE << shift: \ ! 100: acb -> acb_owned |= bit; \ ! 101: acb -> acb_avail |= bit; \ ! 102: break; \ ! 103: \ ! 104: default: \ ! 105: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP, \ ! 106: "%s token management botched", type); \ ! 107: goto out; \ ! 108: } \ ! 109: } ! 110: dotokens (); ! 111: #undef dotoken ! 112: if (acb -> acb_owned != 0 && acb -> acb_owned != acb -> acb_avail) { ! 113: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP, ! 114: "token management botched"); ! 115: goto out; ! 116: } ! 117: if (acb -> acb_owned) ! 118: acb -> acb_flags |= ACB_TURN; ! 119: acb -> acb_settings = ps -> ps_settings; ! 120: acb -> acb_ssdusize = ps -> ps_ssdusize; ! 121: ! 122: if ((pe = acs -> acs_info[0]) == NULLPE) { ! 123: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP, NULLCP); ! 124: goto out; ! 125: } ! 126: if (decode_RTS_RTSE__apdus (pe, 1, NULLIP, NULLVP, &rtpdu) == NOTOK) { ! 127: (void) pylose (); ! 128: goto out; ! 129: } ! 130: ! 131: PLOGP (rtsap_log,RTS_RTORQapdu, pe, "RTORQapdu", 1); ! 132: ! 133: if (rtpdu -> offset != type_RTS_RTSE__apdus_rtorq__apdu) { ! 134: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP, "Unexpected PDU"); ! 135: free_RTS_RTSE__apdus (rtpdu); ! 136: goto out; ! 137: } ! 138: ! 139: prtorq = rtpdu -> un.rtorq__apdu; ! 140: acb -> acb_ckpoint = acb -> acb_ssdusize >> 10; ! 141: if ((0 < prtorq -> checkpointSize ! 142: && prtorq -> checkpointSize < acb -> acb_ckpoint) ! 143: || acb -> acb_ckpoint <= 0) ! 144: acb -> acb_ckpoint = prtorq -> checkpointSize; ! 145: acb -> acb_window = prtorq -> windowSize; ! 146: ! 147: ctx = pe -> pe_context; ! 148: ! 149: { ! 150: register OID oid; ! 151: register struct PSAPcontext *pp; ! 152: ! 153: if (dctx) ! 154: oid = dctx; ! 155: else if ((oid = ode2oid (RT_ASN)) == NULLOID) { ! 156: (void) rtsaplose (rti, RTS_PARAMETER, NULLCP, ! 157: "%s: unknown", RT_ASN); ! 158: free_RTS_RTSE__apdus(rtpdu); ! 159: goto out; ! 160: } ! 161: ! 162: i = ps -> ps_ctxlist.pc_nctx - 1; ! 163: for (pp = ps -> ps_ctxlist.pc_ctx; i >= 0; i--, pp++) ! 164: if (pp -> pc_id == ctx) { ! 165: if (oid_cmp (pp -> pc_asn, oid)) { ! 166: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP, ! 167: "wrong ASN for RTSE (%s)", ! 168: sprintoid (pp -> pc_asn)); ! 169: free_RTS_RTSE__apdus(rtpdu); ! 170: goto out; ! 171: } ! 172: if (pp -> pc_result != PC_ACCEPT) { ! 173: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP, ! 174: "PCI for RTSE not accepted"); ! 175: free_RTS_RTSE__apdus(rtpdu); ! 176: goto out; ! 177: } ! 178: ! 179: acb -> acb_rtsid = ctx; ! 180: } ! 181: ! 182: if (acb -> acb_rtsid == PE_DFLT_CTX) { ! 183: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP, ! 184: "unable to find PCI for RTSE"); ! 185: free_RTS_RTSE__apdus(rtpdu); ! 186: goto out; ! 187: } ! 188: } ! 189: ! 190: rts -> rts_sd = acb -> acb_fd; ! 191: if (prtorq -> dialogueMode == RTORQ_DM_TWA) ! 192: rts -> rts_mode = RTS_TWA, acb -> acb_flags |= ACB_TWA; ! 193: else ! 194: rts -> rts_mode = RTS_MONOLOGUE; ! 195: rts -> rts_turn = acb -> acb_flags & ACB_TURN ? RTS_RESPONDER ! 196: : RTS_INITIATOR; ! 197: if (prtorq -> connectionDataRQ -> offset == type_RTS_ConnectionData_open) ! 198: (void) pe_extract(pe, rts -> rts_data = prtorq -> connectionDataRQ ! 199: -> un.open); ! 200: else ! 201: pe = NULLPE; ! 202: ! 203: for (i = acs -> acs_ninfo - 1; i >= 0; i--) ! 204: if (acs -> acs_info[i]) { ! 205: pe_free (acs -> acs_info[i]); ! 206: acs -> acs_info[i] = NULLPE; ! 207: } ! 208: acs -> acs_ninfo = 0; ! 209: ! 210: free_RTS_RTSE__apdus(rtpdu); ! 211: if (dctx) oid_free (dctx); ! 212: return OK; ! 213: ! 214: out: ; ! 215: /* XXX: should do RTORQ APDU, but can't give any useful info... */ ! 216: (void) AcAssocResponse (acs -> acs_sd, ACS_TRANSIENT, ACS_USER_NOREASON, ! 217: NULLOID, NULLAEI, NULLPA, &ps -> ps_ctxlist, ! 218: ps -> ps_defctxresult, 0, 0, SERIAL_NONE, 0, &ps -> ps_connect, ! 219: NULLPEP, 0, aci); ! 220: ! 221: ACSFREE (acs); ! 222: if (dctx) oid_free (dctx); ! 223: return NOTOK; ! 224: } ! 225: ! 226: /* RT-OPEN.RESPONSE */ ! 227: ! 228: int RtOpenResponse (sd, status, context, respondtitle, respondaddr, ! 229: ctxlist, defctxresult, data, rti) ! 230: int sd, ! 231: status; ! 232: AEI respondtitle; ! 233: OID context; ! 234: struct PSAPaddr *respondaddr; ! 235: struct PSAPctxlist *ctxlist; ! 236: int defctxresult; ! 237: PE data; ! 238: struct RtSAPindication *rti; ! 239: { ! 240: int result; ! 241: PE pe, ! 242: p, ! 243: q; ! 244: register struct assocblk *acb; ! 245: struct AcSAPindication acis; ! 246: register struct AcSAPindication *aci = &acis; ! 247: register struct AcSAPabort *aca = &aci -> aci_abort; ! 248: ! 249: if ((acb = findacblk (sd)) == NULL || (acb -> acb_flags & ACB_CONN)) ! 250: return rtsaplose (rti, RTS_PARAMETER, NULLCP, ! 251: "invalid association descriptor"); ! 252: if (!(acb -> acb_flags & ACB_ACS) || !(acb -> acb_flags & ACB_RTS)) ! 253: return rtsaplose (rti, RTS_OPERATION, NULLCP, ! 254: "not an association descritor for RTS"); ! 255: missingP (rti); ! 256: ! 257: if ((pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_CONS, PE_CONS_SET)) ! 258: == NULLPE) { ! 259: no_mem: ; ! 260: (void) rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory"); ! 261: goto out1; ! 262: } ! 263: switch (status) { ! 264: case ACS_ACCEPT: ! 265: /* begin RTOAC APDU */ ! 266: pe -> pe_class = PE_CLASS_CONT; pe -> pe_id = 17; ! 267: if (set_add (pe, num2prim (acb -> acb_ckpoint, PE_CLASS_CONT, ! 268: RTOAC_CKPOINT)) == NOTOK ! 269: || set_add (pe, num2prim (acb -> acb_window, PE_CLASS_CONT, ! 270: RTOAC_WINDOW)) == NOTOK ! 271: || set_add (pe, p = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS, ! 272: RTOAC_CONNDATA)) == NOTOK ! 273: || set_add (p, q = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS, ! 274: RTOAC_CD_OPEN)) == NOTOK ! 275: || set_add (q, data ? data : pe_alloc (PE_CLASS_UNIV, ! 276: PE_FORM_PRIM, PE_PRIM_NULL)) == NOTOK) ! 277: goto no_mem; ! 278: /* end RTOAC APDU */ ! 279: break; ! 280: ! 281: default: ! 282: /* begin RTORJ APDU */ ! 283: pe -> pe_class = PE_CLASS_CONT; pe -> pe_id = 18; ! 284: if (set_add (pe, p = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS, ! 285: RTORJ_USERDATA)) == NOTOK ! 286: || set_add (p, data ? data : pe_alloc (PE_CLASS_UNIV, ! 287: PE_FORM_PRIM, PE_PRIM_NULL)) == NOTOK) ! 288: goto no_mem; ! 289: /* end RTORJ APDU */ ! 290: break; ! 291: } ! 292: ! 293: if (ctxlist) { ! 294: register int i; ! 295: register struct PSAPcontext *pp; ! 296: ! 297: if (ctxlist -> pc_nctx > NPCTX) { ! 298: (void) rtsaplose (rti, RTS_PARAMETER, NULLCP, "too many contexts"); ! 299: goto out1; ! 300: } ! 301: ! 302: for (pp = ctxlist -> pc_ctx, i = ctxlist -> pc_nctx - 1; ! 303: i >= 0; ! 304: i--, pp++) ! 305: if (acb -> acb_rtsid == pp -> pc_id) { ! 306: if (pp -> pc_result != PC_ACCEPT) { ! 307: (void) acsaplose (aci, ACS_PARAMETER, NULLCP, ! 308: "PCI for RTSE not accepted"); ! 309: goto out1; ! 310: } ! 311: } ! 312: } ! 313: pe -> pe_context = acb -> acb_rtsid; ! 314: ! 315: #ifdef DEBUG ! 316: if (rtsap_log -> ll_events & LLOG_PDUS) ! 317: if (status == ACS_ACCEPT) ! 318: pvpdu (rtsap_log, print_RTS_RTSE__apdus_P, pe, "RTOACapdu", 0); ! 319: else ! 320: pvpdu (rtsap_log, print_RTS_RTSE__apdus_P, pe, "RTORJapdu", 0); ! 321: #endif ! 322: ! 323: result = AcAssocResponse (acb -> acb_fd, status, ! 324: status != ACS_ACCEPT ? ACS_USER_NOREASON : ACS_USER_NULL, ! 325: context, respondtitle, respondaddr, ctxlist, defctxresult, 0, ! 326: acb -> acb_requirements, SERIAL_NONE, acb -> acb_settings, ! 327: &acb -> acb_connect, &pe, 1, aci); ! 328: ! 329: if (result == NOTOK) { ! 330: (void) acs2rtslose (acb, rti, "AcAssocResponse", aca); ! 331: if (ACS_FATAL (aca -> aca_reason)) ! 332: goto out2; ! 333: else ! 334: goto out1; ! 335: } ! 336: ! 337: result = OK; ! 338: ! 339: out2: ! 340: if (pe) { ! 341: if (data) ! 342: (void) pe_extract (pe, data); ! 343: pe_free (pe); ! 344: } ! 345: ! 346: return result; ! 347: ! 348: out1: ; ! 349: (void) AcAssocResponse (acb -> acb_fd, ACS_TRANSIENT, ACS_USER_NOREASON, ! 350: NULLOID, NULLAEI, NULLPA, NULLPC, PC_ACCEPT, 0, 0, SERIAL_NONE, ! 351: 0, &acb -> acb_connect, NULLPEP, 0, aci); ! 352: ! 353: result = NOTOK; ! 354: goto out2; ! 355: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.