|
|
1.1 root 1: /* rt2psinitiat.c - RTPM: initiator */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/rtsap/RCS/rt2psinitiat.c,v 7.2 90/07/27 08:47:46 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/rtsap/RCS/rt2psinitiat.c,v 7.2 90/07/27 08:47:46 mrose Exp $
9: *
10: *
11: * $Log: rt2psinitiat.c,v $
12: * Revision 7.2 90/07/27 08:47:46 mrose
13: * update
14: *
15: * Revision 7.1 90/07/01 21:06:52 mrose
16: * pepsy
17: *
18: * Revision 6.0 89/03/18 23:43:09 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 <signal.h>
38: #include "RTS-types.h"
39: #include "rtpkt.h"
40: #include "tailor.h"
41:
42: /* RT-OPEN.REQUEST */
43:
44: int RtOpenRequest2 (mode, turn, context, callingtitle, calledtitle,
45: callingaddr, calledaddr, ctxlist, defctxname, data, qos, tctx,
46: rtc, rti)
47: int mode,
48: turn;
49: OID context;
50: AEI callingtitle,
51: calledtitle;
52: struct PSAPaddr *callingaddr,
53: *calledaddr;
54: struct PSAPctxlist *ctxlist;
55: OID defctxname;
56: PE data;
57: struct QOStype *qos;
58: OID tctx;
59: struct RtSAPconnect *rtc;
60: struct RtSAPindication *rti;
61: {
62: SBV smask;
63: int result;
64:
65: isodetailor (NULLCP, 0);
66:
67: switch (mode) {
68: case RTS_MONOLOGUE:
69: case RTS_TWA:
70: break;
71:
72: default:
73: return rtsaplose (rti, RTS_PARAMETER, NULLCP,
74: "bad value for mode parameter");
75: }
76: switch (turn) {
77: case RTS_INITIATOR:
78: case RTS_RESPONDER:
79: break;
80:
81: default:
82: return rtsaplose (rti, RTS_PARAMETER, NULLCP,
83: "bad value for turn parameter");
84: }
85: if (!ctxlist) {
86: static struct PSAPctxlist ctxs;
87:
88: ctxlist = &ctxs;
89: bzero ((char *) ctxlist, sizeof *ctxlist);
90: }
91: missingP (rtc);
92: bzero ((char *) rtc, sizeof *rtc);
93: missingP (rti);
94:
95: smask = sigioblock ();
96:
97: result = RtOpenRequestAux (mode, turn, context, callingtitle, calledtitle,
98: callingaddr, calledaddr, ctxlist, defctxname, data, qos, tctx,
99: rtc, rti);
100:
101: (void) sigiomask (smask);
102:
103: return result;
104: }
105:
106:
107: /* */
108:
109: static int RtOpenRequestAux (mode, turn, context, callingtitle, calledtitle,
110: callingaddr, calledaddr, ctxlist, defctxname, data, qos, tctx,
111: rtc, rti)
112: int mode,
113: turn;
114: OID context;
115: AEI callingtitle,
116: calledtitle;
117: struct PSAPaddr *callingaddr,
118: *calledaddr;
119: struct PSAPctxlist *ctxlist;
120: OID defctxname;
121: PE data;
122: struct QOStype *qos;
123: OID tctx;
124: struct RtSAPconnect *rtc;
125: struct RtSAPindication *rti;
126: {
127: register int i;
128: int result,
129: requirements,
130: offset,
131: rtsid,
132: settings;
133: PE pe,
134: p,
135: q;
136: register struct assocblk *acb;
137: struct SSAPref *sr;
138: register struct PSAPcontext *pp;
139: register struct AcSAPconnect *acc = &rtc -> rtc_connect;
140: register struct PSAPconnect *pc = &acc -> acc_connect;
141: struct AcSAPindication acis;
142: register struct AcSAPindication *aci = &acis;
143: register struct AcSAPabort *aca = &aci -> aci_abort;
144: struct type_RTS_RTSE__apdus *rtpdu;
145: struct type_RTS_RTOACapdu *prtoac;
146:
147: /* begin RTORQ APDU */
148: if ((pe = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS, 16)) == NULLPE) {
149: no_mem: ;
150: result = rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");
151: goto out1;
152: }
153: if ((DEFAULT_CKPOINT != PCONN_CK_DFLT
154: && set_add (pe, num2prim (DEFAULT_CKPOINT, PE_CLASS_CONT,
155: RTORQ_CKPOINT)) == NOTOK)
156: || (DEFAULT_WINDOW != PCONN_WD_DFLT
157: && set_add (pe, num2prim (DEFAULT_WINDOW,
158: PE_CLASS_CONT, RTORQ_WINDOW))
159: == NOTOK)
160: || set_add (pe, num2prim (mode == RTS_TWA ? RTORQ_DM_TWA
161: : RTORQ_DM_MONO, PE_CLASS_CONT, RTORQ_DIALOGUE))
162: == NOTOK
163: || set_add (pe, p = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
164: RTORQ_CONNDATA)) == NOTOK
165: || set_add (p, q = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
166: RTORQ_CD_OPEN)) == NOTOK
167: || set_add (q, data ? data : pe_alloc (PE_CLASS_CONT,
168: PE_FORM_PRIM, 0)) == NOTOK)
169: goto no_mem;
170: /* end RTORQ APDU */
171:
172: requirements = RTS_MYREQUIRE;
173: settings = 0;
174: #define dotoken(requires,shift,bit,type) \
175: { \
176: if (requirements & requires) \
177: if (turn == RTS_INITIATOR) \
178: settings |= ST_INIT_VALUE << shift; \
179: else \
180: settings |= ST_RESP_VALUE << shift; \
181: }
182: dotokens ();
183: #undef dotoken
184:
185: if ((sr = addr2ref (PLocalHostName ())) == NULL) {
186: result = rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");
187: goto out1;
188: }
189:
190: if (ctxlist -> pc_nctx >= NPCTX) {
191: result = rtsaplose (rti, RTS_PARAMETER, NULLCP,
192: "too many contexts");
193: goto out1;
194: }
195: {
196: register int ctx;
197: register OID oid;
198:
199: if (tctx)
200: oid = tctx; /* override standard context */
201: else if ((oid = ode2oid (RT_ASN)) == NULLOID) {
202: result = rtsaplose (rti, RTS_PARAMETER, NULLCP,
203: "%s: unknown", RT_ASN);
204: goto out1;
205: }
206:
207: i = ctxlist -> pc_nctx - 1, ctx = 1;
208: for (pp = ctxlist -> pc_ctx; i >= 0; i--, pp++) {
209: if (oid_cmp (pp -> pc_asn, oid) == 0) {
210: rtsid = pp -> pc_id;
211: offset = pp - ctxlist -> pc_ctx;
212:
213: pp = NULL;
214: goto ready;
215: }
216: if (ctx <= pp -> pc_id)
217: ctx = pp -> pc_id + 2;
218: }
219: pp -> pc_id = ctx;
220: if ((pp -> pc_asn = oid_cpy (oid)) == NULLOID)
221: goto no_mem;
222: pp -> pc_atn = NULLOID;
223:
224: rtsid = pp -> pc_id;
225: offset = -1;
226:
227: ctxlist -> pc_nctx++;
228: }
229: ready: ;
230: pe -> pe_context = rtsid;
231:
232: PLOGP (rtsap_log,RTS_RTSE__apdus, pe, "RTORQapdu", 0);
233:
234: result = AcAssocRequest (context, callingtitle, calledtitle, callingaddr,
235: calledaddr, ctxlist, defctxname, 0, requirements,
236: SERIAL_NONE, settings, sr, &pe, 1, qos, acc, aci);
237:
238: if (pp) {
239: oid_free (pp -> pc_asn);
240: pp -> pc_asn = NULLOID;
241: }
242:
243: if (data)
244: (void) pe_extract (pe, data);
245: pe_free (pe);
246: pe = NULLPE;
247:
248: if (result == NOTOK) {
249: (void) acs2rtslose (NULLACB, rti, "AcAssocRequest", aca);
250: goto out1;
251: }
252:
253: if (acc -> acc_result == ACS_ACCEPT) {
254: if ((acb = findacblk (acc -> acc_sd)) == NULLACB) {
255: result = rtpktlose (NULLACB, rti, RTS_PROTOCOL, NULLCP, "ACSE mangled");
256: goto out2;
257: }
258: }
259: else
260: if (acc -> acc_result == ACS_ABORTED) {
261: (void) acs2rtsabort (acb = NULLACB, aca, rti);
262:
263: rtc -> rtc_sd = NOTOK;
264: rtc -> rtc_result = RTS_ABORTED;
265:
266: result = OK;
267: goto out2;
268: }
269: else
270: acb = NULLACB;
271:
272: if ((pe = acc -> acc_info[0]) == NULLPE) {
273: if (acc -> acc_result != ACS_ACCEPT) {
274: aca -> aca_reason = acc -> acc_result;
275: (void) acs2rtslose (acb, rti, "AcAssocRequest(pseudo)", aca);
276:
277: rtc -> rtc_sd = NOTOK;
278: rtc -> rtc_result = rti -> rti_abort.rta_reason;
279:
280: result = OK;
281: }
282: else
283: if (acb)
284: result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP, NULLCP);
285: else
286: result = rtsaplose (rti, RTS_PROTOCOL, NULLCP, NULLCP);
287: goto out2;
288: }
289:
290: if (acc -> acc_result != ACS_ACCEPT) {
291: struct type_RTS_RTORJapdu *prtorj;
292:
293: if (decode_RTS_RTSE__apdus (pe, 1, NULLIP, NULLVP, &rtpdu) == NOTOK) {
294: result = pylose ();
295: goto out2;
296: }
297:
298: PLOGP (rtsap_log,RTS_RTSE__apdus, pe, "RTORJapdu", 1);
299:
300: if (rtpdu -> offset != type_RTS_RTSE__apdus_rtorj__apdu) {
301: result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
302: "Unexpected PDU");
303: free_RTS_RTSE__apdus (rtpdu);
304: goto out2;
305: }
306: prtorj = rtpdu -> un.rtorj__apdu;
307:
308: rtc -> rtc_sd = NOTOK;
309: rtc -> rtc_result = RTS_REJECT;
310: (void) pe_extract (pe, rtc -> rtc_data = prtorj -> userDataRJ);
311:
312: for (i = acc -> acc_ninfo - 1; i >= 0; i--)
313: if (acc -> acc_info[i]) {
314: pe_free (acc -> acc_info[i]);
315: acc -> acc_info[i] = NULLPE;
316: }
317: acc -> acc_ninfo = 0;
318:
319: free_RTS_RTSE__apdus (rtpdu);
320: return OK;
321: }
322:
323: acb -> acb_flags |= ACB_RTS | ACB_INIT;
324: acb -> acb_uabort = AcUAbortRequest;
325: SetPS2RtService (acb);
326: if (turn == RTS_INITIATOR)
327: acb -> acb_flags |= ACB_TURN;
328: if (mode == RTS_TWA)
329: acb -> acb_flags |= ACB_TWA;
330: acb -> acb_connect = *sr; /* struct copy */
331: if ((acb -> acb_requirements = pc -> pc_srequirements) != RTS_MYREQUIRE) {
332: result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
333: "desired session requirements denied");
334: goto out2;
335: }
336: #define dotoken(requires,shift,bit,type) \
337: { \
338: if (acb -> acb_requirements & requires) \
339: switch (pc -> pc_settings & (ST_MASK << shift)) { \
340: case ST_INIT_VALUE << shift: \
341: acb -> acb_owned |= bit; \
342: acb -> acb_avail |= bit; \
343: break; \
344: \
345: case ST_RESP_VALUE << shift: \
346: acb -> acb_avail |= bit; \
347: break; \
348: \
349: default: \
350: result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP, \
351: "%s token management botched", type); \
352: goto out2; \
353: } \
354: }
355: dotokens ();
356: #undef dotoken
357: switch (turn) {
358: case RTS_INITIATOR:
359: if (acb -> acb_owned == acb -> acb_avail)
360: break;
361: result = rtsaplose (rti, RTS_PROTOCOL, NULLCP,
362: "token management botched");
363: goto out2;
364:
365: case RTS_RESPONDER:
366: if (acb -> acb_owned == 0)
367: break;
368: result = rtsaplose (rti, RTS_PROTOCOL, NULLCP,
369: "token management botched");
370: goto out2;
371: }
372: acb -> acb_ssdusize = pc -> pc_ssdusize;
373:
374: if (decode_RTS_RTSE__apdus (pe, 1, NULLIP, NULLVP, &rtpdu) == NOTOK) {
375: result = pylose ();
376: goto out3;
377: }
378:
379: PLOGP (rtsap_log,RTS_RTSE__apdus, pe, "RTOACapdu", 1);
380:
381: if (rtpdu -> offset != type_RTS_RTSE__apdus_rtoac__apdu) {
382: result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
383: "Unexpected PDU");
384: goto out3;
385: }
386:
387: prtoac = rtpdu -> un.rtoac__apdu;
388: acb -> acb_ckpoint = prtoac->checkpointSize;
389: acb -> acb_window = prtoac->windowSize;
390:
391: if ((i = offset) < 0)
392: i = pc -> pc_ctxlist.pc_nctx - 1;
393: pp = pc -> pc_ctxlist.pc_ctx + i;
394: if (pp -> pc_id != rtsid) {
395: result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
396: "RTSE PCI not found");
397: goto out3;
398: }
399: if (pp -> pc_result != PC_ACCEPT) {
400: result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
401: "RTSE PCI rejected");
402: goto out3;
403: }
404:
405: if (offset < 0)
406: pc -> pc_ctxlist.pc_nctx--;
407: acb -> acb_rtsid = rtsid;
408:
409: rtc -> rtc_sd = acb -> acb_fd;
410: rtc -> rtc_result = RTS_ACCEPT;
411: if (prtoac -> connectionDataAC -> offset == type_RTS_ConnectionData_open)
412: rtc -> rtc_data = prtoac -> connectionDataAC -> un.open;
413: else
414: rtc -> rtc_data = NULL;
415: (void) pe_extract (pe, rtc -> rtc_data);
416:
417: for (i = acc -> acc_ninfo - 1; i >= 0; i--)
418: if (acc -> acc_info[i]) {
419: pe_free (acc -> acc_info[i]);
420: acc -> acc_info[i] = NULLPE;
421: }
422: acc -> acc_ninfo = 0;
423:
424: free_RTS_RTSE__apdus (rtpdu);
425: if (tctx) oid_free (tctx);
426: return OK;
427:
428: out3:
429: free_RTS_RTSE__apdus (rtpdu);
430: out2: ;
431: ACCFREE (acc);
432: if (acb)
433: freeacblk (acb);
434:
435: out1: ;
436: if (tctx) oid_free (tctx);
437: if (pe) {
438: if (data)
439: (void) pe_extract (pe, data);
440: pe_free (pe);
441: }
442:
443: return result;
444: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.