|
|
1.1 root 1: /* rt2ssinitiat.c - RTPM: initiator */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/rtsap/RCS/rt2ssinitiat.c,v 7.2 90/07/27 08:47:57 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/rtsap/RCS/rt2ssinitiat.c,v 7.2 90/07/27 08:47:57 mrose Exp $
9: *
10: *
11: * $Log: rt2ssinitiat.c,v $
12: * Revision 7.2 90/07/27 08:47:57 mrose
13: * update
14: *
15: * Revision 7.1 90/07/01 21:07:10 mrose
16: * pepsy
17: *
18: * Revision 6.1 89/06/24 00:55:57 mrose
19: * reason
20: *
21: * Revision 6.0 89/03/18 23:43:20 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 <signal.h>
41: #include "RTS-types.h"
42: #include "OACS-types.h"
43: #include "rtpkt.h"
44: #include "isoservent.h"
45: #include "tailor.h"
46:
47: /* RT-BEGIN.REQUEST (X.410 OPEN.REQUEST) */
48:
49: int RtBeginRequest2 (called, calling, mode, turn, data, rtc, rti)
50: struct RtSAPaddr *called, *calling;
51: int mode,
52: turn;
53: PE data;
54: struct RtSAPconnect *rtc;
55: struct RtSAPindication *rti;
56: {
57: SBV smask;
58: int result;
59:
60: isodetailor (NULLCP, 0);
61:
62: missingP (called);
63: switch (mode) {
64: case RTS_MONOLOGUE:
65: case RTS_TWA:
66: break;
67:
68: default:
69: return rtsaplose (rti, RTS_PARAMETER, NULLCP,
70: "bad value for mode parameter");
71: }
72: switch (turn) {
73: case RTS_INITIATOR:
74: case RTS_RESPONDER:
75: break;
76:
77: default:
78: return rtsaplose (rti, RTS_PARAMETER, NULLCP,
79: "bad value for turn parameter");
80: }
81: missingP (rtc);
82: bzero ((char *) rtc, sizeof *rtc);
83: missingP (rti);
84:
85: smask = sigioblock ();
86:
87: result = RtBeginRequestAux (called, calling, mode, turn, data, rtc, rti);
88:
89: (void) sigiomask (smask);
90:
91: return result;
92: }
93:
94: /* */
95:
96: static int RtBeginRequestAux (called, calling, mode, turn, data, rtc, rti)
97: struct RtSAPaddr *called, *calling;
98: int mode,
99: turn;
100: PE data;
101: struct RtSAPconnect *rtc;
102: struct RtSAPindication *rti;
103: {
104: int len,
105: result,
106: settings;
107: char *base;
108: #ifdef notdef
109: register struct isoservent *is;
110: #endif
111: register PE pe,
112: p,
113: q,
114: r;
115: register struct assocblk *acb;
116: struct SSAPref srs;
117: register struct SSAPref *sr = &srs;
118: struct SSAPconnect scs;
119: register struct SSAPconnect *sc = &scs;
120: struct SSAPindication sis;
121: register struct SSAPindication *si = &sis;
122: register struct SSAPabort *sa = &si -> si_abort;
123: struct type_OACS_PAccept *paccpt = (struct type_OACS_PAccept *)0;
124:
125: if ((acb = newacblk ()) == NULL)
126: return rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");
127:
128: /* begin PConnect PSDU */
129: if ((pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_CONS, PE_CONS_SET)) == NULLPE) {
130: no_mem: ;
131: result = rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");
132: goto out1;
133: }
134: if (set_add (pe, p = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS, PCONN_DTS))
135: == NOTOK
136: || set_add (p, num2prim (SYN_X409, PE_CLASS_CONT, DTS_SYNTAX))
137: == NOTOK
138: || set_add (pe, p = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
139: PCONN_DATA)) == NOTOK
140: || (DEFAULT_CKPOINT != PCONN_CK_DFLT
141: && set_add (p, num2prim (DEFAULT_CKPOINT, PE_CLASS_CONT,
142: PCONN_DATA_CK)) == NOTOK)
143: || (DEFAULT_WINDOW != PCONN_WD_DFLT
144: && set_add (p, num2prim (DEFAULT_WINDOW, PE_CLASS_CONT,
145: PCONN_DATA_WD)) == NOTOK)
146: || set_add (p, num2prim (mode == RTS_TWA ? PCONN_DM_TWA
147: : PCONN_DM_MONO, PE_CLASS_CONT, PCONN_DATA_DM)) == NOTOK
148: || set_add (p, q = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
149: PCONN_DATA_CN)) == NOTOK
150: || set_add (q, r = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
151: CN_OPEN)) == NOTOK
152: || set_add (r, data ? data : pe_alloc (PE_CLASS_CONT,
153: PE_FORM_PRIM, 0)) == NOTOK
154: || set_add (p, num2prim ((int) ntohs (called -> rta_port),
155: PE_CLASS_CONT, PCONN_DATA_AP)) == NOTOK)
156: goto no_mem;
157: /* end PConnect PSDU */
158:
159: PLOGP (rtsap_log,OACS_PConnect, pe, "PConnect", 0);
160:
161: if (pe2ssdu (pe, &base, &len) == NOTOK)
162: goto no_mem;
163:
164: if (data)
165: (void) pe_extract (pe, data), data = NULLPE;
166: pe_free (pe);
167: pe = NULLPE;
168:
169: #ifdef notdef /* SEK doesn't like this */
170: if (called -> rta_addr.sa_selectlen == 0) {
171: if ((is = getisoserventbyname ("rts", "ssap")) == NULL) {
172: result = rtsaplose (rti, RTS_ADDRESS, NULLCP,
173: "ssap/rts: unknown entity");
174: goto out2;
175: }
176: if (is -> is_selectlen > SSSIZE) { /* XXX */
177: result = rosaplose (rti, RTS_ADDRESS, NULLCP,
178: "ssap/rts: selector too long (%d octets)",
179: is -> is_selectlen);
180: goto out2;
181: }
182: bcopy (is -> is_selector, called -> rta_addr.sa_selector,
183: called -> rta_addr.sa_selectlen = is -> is_selectlen);
184: }
185: #endif
186:
187: acb -> acb_requirements = RTS_MYREQUIRE;
188: settings = 0;
189: #define dotoken(requires,shift,bit,type) \
190: { \
191: if (acb -> acb_requirements & requires) \
192: if (turn == RTS_INITIATOR) \
193: settings |= ST_INIT_VALUE << shift; \
194: else \
195: settings |= ST_RESP_VALUE << shift; \
196: }
197: dotokens ();
198: #undef dotoken
199:
200: if ((sr = addr2ref (SLocalHostName ())) == NULL) {
201: result = rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");
202: goto out2;
203: }
204: acb -> acb_connect = *sr; /* struct copy */
205:
206: if (SConnRequest (sr, calling ? &calling -> rta_addr : NULLSA,
207: &called -> rta_addr, acb -> acb_requirements,
208: settings, SERIAL_NONE, base, len, NULLQOS, sc, si) == NOTOK) {
209: result = ss2rtslose (NULLACB, rti, "SConnRequest", sa);
210: goto out2;
211: }
212: free (base);
213:
214: if (sc -> sc_result == SC_ACCEPT) {
215: acb -> acb_fd = sc -> sc_sd;
216: acb -> acb_uabort = SUAbortRequest;
217: }
218: else
219: if (sc -> sc_result == SC_ABORT) {
220: acb -> acb_fd = NOTOK;
221:
222: (void) ss2rtsabort (acb, sa, rti);
223:
224: rtc -> rtc_sd = NOTOK;
225: rtc -> rtc_result = RTS_ABORTED;
226:
227: return OK;
228: }
229:
230: if ((pe = ssdu2pe (sc -> sc_data, sc -> sc_cc, NULLCP, &result))
231: == NULLPE) {
232: if (sc -> sc_result != SC_ACCEPT) {
233: bzero ((char *) sa, sizeof *sa);
234: sa -> sa_reason = sc -> sc_result;
235: acb -> acb_fd = NOTOK;
236: (void) ss2rtslose (acb, rti, "SConnRequest(pseudo)", sa);
237:
238: rtc -> rtc_sd = NOTOK;
239: rtc -> rtc_result = rti -> rti_abort.rta_reason;
240:
241: result = OK;
242: }
243: else
244: result = rtpktlose (acb, rti, result != PS_ERR_NMEM ? RTS_PROTOCOL
245: : RTS_CONGEST, NULLCP, "%s", ps_error (result));
246: goto out1;
247: }
248:
249: SCFREE (sc);
250:
251: if (sc -> sc_result != SC_ACCEPT) {
252: struct type_OACS_PRefuse *pref;
253:
254: if (parse_OACS_PRefuse (pe, 1, NULLIP, NULLVP, &pref) == NOTOK) {
255: result = pylose ();
256: goto out1;
257: }
258:
259: PLOGP (rtsap_log,OACS_PRefuse, pe, "PRefuse", 1);
260:
261: pe_free (pe);
262:
263: freeacblk (acb);
264:
265: rtc -> rtc_sd = NOTOK;
266: switch (pref->parm) {
267: case REFUSE_BUSY:
268: rtc -> rtc_result = RTS_BUSY;
269: break;
270:
271: case REFUSE_VALIDATE:
272: rtc -> rtc_result = RTS_VALIDATE;
273: break;
274:
275: case REFUSE_MODE:
276: rtc -> rtc_result = RTS_MODE;
277: break;
278:
279: default:
280: rtc -> rtc_result = RTS_PROTOCOL;
281: break;
282: }
283:
284: free_OACS_RefuseReason(pref);
285: return OK;
286: }
287:
288: acb -> acb_flags = ACB_CONN | ACB_RTS | ACB_INIT;
289: SetSS2RtService (acb);
290: if (turn == RTS_INITIATOR)
291: acb -> acb_flags |= ACB_TURN;
292: if (mode == RTS_TWA)
293: acb -> acb_flags |= ACB_TWA;
294: if ((acb -> acb_requirements = sc -> sc_requirements) != RTS_MYREQUIRE) {
295: result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
296: "desired session requirements denied");
297: goto out1;
298: }
299:
300: #define dotoken(requires,shift,bit,type) \
301: { \
302: if (acb -> acb_requirements & requires) \
303: switch (sc -> sc_settings & (ST_MASK << shift)) { \
304: case ST_INIT_VALUE << shift: \
305: acb -> acb_owned |= bit; \
306: acb -> acb_avail |= bit; \
307: break; \
308: \
309: case ST_RESP_VALUE << shift: \
310: acb -> acb_avail |= bit; \
311: break; \
312: \
313: default: \
314: result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP, \
315: "%s token management botched", type); \
316: goto out1; \
317: } \
318: }
319: dotokens ();
320: #undef dotoken
321: switch (turn) {
322: case RTS_INITIATOR:
323: if (acb -> acb_owned == acb -> acb_avail)
324: break;
325: result = rtsaplose (rti, RTS_PROTOCOL, NULLCP,
326: "token management botched");
327: goto out1;
328:
329: case RTS_RESPONDER:
330: if (acb -> acb_owned == 0)
331: break;
332: result = rtsaplose (rti, RTS_PROTOCOL, NULLCP,
333: "token management botched");
334: goto out1;
335: }
336: acb -> acb_ssdusize = sc -> sc_ssdusize;
337:
338: PLOGP (rtsap_log,OACS_PAccept, pe, "PAccept", 1);
339:
340: if (parse_OACS_PAccept (pe, 1, NULLIP, NULLVP, &paccpt) == NOTOK) {
341: result = pylose ();
342: goto out1;
343: }
344:
345: acb -> acb_ckpoint = paccpt -> pUserData -> checkpointSize;
346: acb -> acb_window = paccpt -> pUserData -> windowsize;
347:
348: rtc -> rtc_sd = acb -> acb_fd;
349: rtc -> rtc_result = RTS_ACCEPT;
350: {
351: struct type_OACS_ConnectionData *pdat = paccpt -> pUserData -> member_OACS_5;
352:
353: if (pdat -> offset == type_OACS_ConnectionData_open)
354: rtc -> rtc_data = pe_expunge (pe, pdat -> un.open);
355: else
356: rtc -> rtc_data = NULLPE;
357: }
358:
359: if (paccpt)
360: free_OACS_PAccept (paccpt);
361: return OK;
362:
363: out2: ;
364: free (base);
365:
366: out1: ;
367: SCFREE (sc);
368: if (pe) {
369: if (data)
370: (void) pe_extract (pe, data);
371: pe_free (pe);
372: }
373: freeacblk (acb);
374: if (paccpt)
375: free_OACS_PAccept (paccpt);
376:
377: return result;
378: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.