|
|
1.1 root 1: /* rt2ssrespond.c - RTPM: responder */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/rtsap/RCS/rt2ssrespond.c,v 7.2 90/07/27 08:48:01 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/rtsap/RCS/rt2ssrespond.c,v 7.2 90/07/27 08:48:01 mrose Exp $
9: *
10: *
11: * $Log: rt2ssrespond.c,v $
12: * Revision 7.2 90/07/27 08:48:01 mrose
13: * update
14: *
15: * Revision 7.1 90/07/01 21:07:16 mrose
16: * pepsy
17: *
18: * Revision 6.0 89/03/18 23:43:23 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 "OACS-types.h"
39: #include "rtpkt.h"
40: #include "tailor.h"
41:
42: /* DATA */
43:
44: extern int acsap_conntype;
45:
46: /* RT-BEGIN.INDICATION (X.410 OPEN.INDICATION) */
47:
48: int RtBInit (vecp, vec, rts, rti)
49: int vecp;
50: char **vec;
51: struct RtSAPstart *rts;
52: struct RtSAPindication *rti;
53: {
54: int len,
55: result;
56: char *base;
57: register struct assocblk *acb;
58: register PE pe;
59: struct SSAPref ref;
60: struct SSAPstart sss;
61: register struct SSAPstart *ss = &sss;
62: struct SSAPindication sis;
63: register struct SSAPindication *si = &sis;
64: register struct SSAPabort *sa = &si -> si_abort;
65: struct type_OACS_PConnect *pcon;
66: int sc_reason = SC_CONGESTION;
67:
68: isodetailor (NULLCP, 0);
69:
70: missingP (vec);
71: missingP (rts);
72: missingP (rti);
73:
74: if ((acb = newacblk ()) == NULL)
75: return rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");
76: acb -> acb_flags |= ACB_RTS;
77: SetSS2RtService (acb);
78:
79: if (SInit (vecp, vec, ss, si) == NOTOK) {
80: (void) ss2rtslose (acb, rti, "SInit", sa);
81: goto out1;
82: }
83:
84: acb -> acb_fd = ss -> ss_sd;
85: acb -> acb_uabort = SUAbortRequest;
86:
87: base = NULLCP, len = 0;
88: acb -> acb_connect = ss -> ss_connect; /* struct copy */
89: if ((ss -> ss_requirements &= RTS_MYREQUIRE) != RTS_MYREQUIRE) {
90: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP,
91: "desired session requirements unavailable");
92: goto out2;
93: }
94: acb -> acb_requirements = ss -> ss_requirements;
95:
96: #define dotoken(requires,shift,bit,type) \
97: { \
98: if (acb -> acb_requirements & requires) \
99: switch (ss -> ss_settings & (ST_MASK << shift)) { \
100: case ST_INIT_VALUE << shift: \
101: acb -> acb_avail |= bit; \
102: break; \
103: \
104: case ST_RESP_VALUE << shift: \
105: acb -> acb_owned |= bit; \
106: acb -> acb_avail |= bit; \
107: break; \
108: \
109: default: \
110: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP, \
111: "%s token management botched", type); \
112: goto out2; \
113: } \
114: }
115: dotokens ();
116: #undef dotoken
117: if (acb -> acb_owned != 0 && acb -> acb_owned != acb -> acb_avail) {
118: (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP,
119: "token management botched");
120: goto out2;
121: }
122: if (acb -> acb_owned)
123: acb -> acb_flags |= ACB_TURN;
124: acb -> acb_settings = ss -> ss_settings;
125: acb -> acb_ssdusize = ss -> ss_ssdusize;
126:
127: if ((pe = ssdu2pe (ss -> ss_data, ss -> ss_cc, NULLCP, &result))
128: == NULLPE) {
129: (void) rtsaplose (rti, result != PS_ERR_NMEM ? RTS_PROTOCOL
130: : RTS_CONGEST, NULLCP, "%s", ps_error (result));
131: goto out2;
132: }
133:
134: SSFREE (ss);
135:
136: if (parse_OACS_PConnect (pe, 1, NULLIP, NULLVP, &pcon) == NOTOK) {
137: (void) pylose ();
138: pe_free (pe);
139: goto out2;
140: }
141:
142: PLOGP (rtsap_log,OACS_PConnect, pe, "PConnect", 1);
143:
144: if (pcon -> pUserData -> member_OACS_2->offset
145: == type_OACS_ConnectionData_recover) {
146: (void) rtsaplose (rti, RTS_CONGEST, NULLCP,
147: "rejecting attempted recovery");
148: pe_free (pe);
149: if ((pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_CONS, PE_CONS_SET))
150: && set_add (pe, num2prim (RTS_RECOVER, PE_CLASS_CONT,
151: PREF_REASON)) != NOTOK) {
152: PLOGP (rtsap_log,OACS_PRefuse, pe, "PRefuse", 0);
153: if (pe2ssdu (pe, &base, &len) == NOTOK) {
154: if (base)
155: free (base), base = NULL;
156: len = 0;
157: }
158: }
159: if (pe)
160: pe_free (pe);
161: free_OACS_PConnect(pcon);
162: sc_reason = SC_REJECTED;
163: goto out2;
164: }
165:
166: acb -> acb_ckpoint = acb -> acb_ssdusize >> 10;
167: if ((0 < pcon -> pUserData -> checkpointSize
168: && pcon -> pUserData -> checkpointSize < acb -> acb_ckpoint)
169: || acb -> acb_ckpoint <= 0)
170: acb -> acb_ckpoint = pcon -> pUserData -> checkpointSize;
171: acb -> acb_window = pcon -> pUserData -> windowSize;
172:
173: bzero ((char *) rts, sizeof *rts);
174: rts -> rts_sd = acb -> acb_fd;
175: rts -> rts_initiator.rta_addr = ss -> ss_calling; /* struct copy */
176: if (pcon->pUserData->dialogueMode == PCONN_DM_TWA)
177: rts -> rts_mode = RTS_TWA, acb -> acb_flags |= ACB_TWA;
178: else
179: rts -> rts_mode = RTS_MONOLOGUE;
180: rts -> rts_turn = acb -> acb_flags & ACB_TURN ? RTS_RESPONDER
181: : RTS_INITIATOR;
182: rts -> rts_port = htons ((u_short) pcon -> pUserData -> applicationProtocol);
183: if (pcon -> pUserData -> member_OACS_2 -> offset
184: == type_OACS_ConnectionData_open)
185: rts->rts_data = pe_expunge(pe, pcon-> pUserData -> member_OACS_2
186: -> un.open);
187: else
188: rts -> rts_data = NULLPE;
189:
190: free_OACS_PConnect(pcon);
191: return OK;
192:
193: out2: ;
194: bzero ((char *) &ref, sizeof ref);
195: (void) SConnResponse (acb -> acb_fd, &ref, NULLSA, sc_reason, 0, 0,
196: SERIAL_NONE, base, len, si);
197: acb -> acb_fd = NOTOK;
198: if (base)
199: free (base);
200:
201: out1: ;
202: SSFREE (ss);
203: freeacblk (acb);
204:
205: return NOTOK;
206: }
207:
208: /* RT-BEGIN.RESPONSE (X.410 OPEN.RESPONSE) */
209:
210: int RtBeginResponse (sd, status, data, rti)
211: int sd;
212: int status;
213: PE data;
214: struct RtSAPindication *rti;
215: {
216: int len,
217: result;
218: char *base;
219: register PE pe,
220: p,
221: q,
222: r;
223: register struct assocblk *acb;
224: struct SSAPref ref;
225: struct SSAPindication sis;
226: register struct SSAPindication *si = &sis;
227: register struct SSAPabort *sa = &si -> si_abort;
228:
229: if ((acb = findacblk (sd)) == NULL || (acb -> acb_flags & ACB_CONN))
230: return rtsaplose (rti, RTS_PARAMETER, NULLCP,
231: "invalid association descriptor");
232: if ((acb -> acb_flags & ACB_ACS) || !(acb -> acb_flags & ACB_RTS))
233: return rtsaplose (rti, RTS_OPERATION, NULLCP,
234: "not an association descriptor for RTS");
235: switch (status) {
236: case RTS_ACCEPT:
237: break;
238:
239: case RTS_MODE:
240: case RTS_VALIDATE:
241: case RTS_BUSY:
242: if (data)
243: return rtsaplose (rti, RTS_PARAMETER, NULLCP,
244: "user data not permitted when refusing association");
245: break;
246:
247: default:
248: return rtsaplose (rti, RTS_PARAMETER, NULLCP,
249: "bad value for status parameter");
250: }
251: missingP (rti);
252:
253: base = NULLCP;
254: switch (status) {
255: case RTS_ACCEPT:
256: /* begin PAccept PSDU */
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: if (set_add (pe, p = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
264: PACC_DTS)) == NOTOK
265: || set_add (p, num2prim (SYN_X409, PE_CLASS_CONT,
266: DTS_SYNTAX)) == NOTOK
267: || set_add (pe, p = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
268: PACC_DATA)) == NOTOK
269: || set_add (p, num2prim (acb -> acb_ckpoint,
270: PE_CLASS_CONT, PACC_DATA_CK)) == NOTOK
271: || set_add (p, num2prim (acb -> acb_window,
272: PE_CLASS_CONT, PACC_DATA_WD)) == NOTOK
273: || set_add (p, q = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
274: PACC_DATA_CN)) == NOTOK
275: || set_add (q, r = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
276: CN_OPEN)) == NOTOK
277: || set_add (r, data ? data : pe_alloc (PE_CLASS_UNIV,
278: PE_FORM_PRIM, PE_PRIM_NULL))
279: == NOTOK)
280: goto no_mem;
281: /* end PAccept PSDU */
282: status = SC_ACCEPT;
283: break;
284:
285: default:
286: /* begin PRefuse PSDU */
287: if ((pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_CONS, PE_CONS_SET))
288: == NULLPE
289: || set_add (pe, num2prim (status, PE_CLASS_CONT,
290: PREF_REASON)) == NOTOK)
291: goto no_mem;
292: /* end PRefuse PSDU */
293: status = SC_REJECTED;
294: break;
295: }
296:
297: #ifdef DEBUG
298: if (rtsap_log -> ll_events & LLOG_PDUS)
299: if (status == SC_ACCEPT)
300: pvpdu (rtsap_log, print_OACS_PAccept_P, pe, "PAccept", 0);
301: else
302: pvpdu (rtsap_log, print_OACS_PRefuse_P, pe, "PRefuse", 0);
303: #endif
304:
305: if (pe2ssdu (pe, &base, &len) == NOTOK)
306: goto no_mem;
307:
308: if (SConnResponse (acb -> acb_fd, &acb -> acb_connect, NULLSA, status,
309: acb -> acb_requirements, acb -> acb_settings, SERIAL_NONE,
310: base, len, si) == NOTOK) {
311: acb -> acb_fd = NOTOK;
312: (void) ss2rtslose (acb, rti, "SConnResponse", sa);
313: goto out3;
314: }
315:
316: if (status == SC_ACCEPT)
317: acb -> acb_flags |= ACB_CONN;
318: else {
319: acb -> acb_fd = NOTOK;
320: freeacblk (acb);
321: }
322: result = OK;
323:
324: out2: ;
325: if (pe) {
326: if (data)
327: (void) pe_extract (pe, data);
328: pe_free (pe);
329: }
330: if (base)
331: free (base);
332:
333: return result;
334:
335: out1: ;
336: bzero ((char *) &ref, sizeof ref);
337: (void) SConnResponse (acb -> acb_fd, &ref, NULLSA, SC_CONGEST, 0, 0,
338: SERIAL_NONE, NULLCP, 0, si);
339: acb -> acb_fd = NOTOK;
340: out3: ;
341: freeacblk (acb);
342: result = NOTOK;
343: goto out2;
344: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.