|
|
1.1 root 1: -- dse.py - help out co-resident DSE
2:
3: -- $Header: /f/osi/acsap/RCS/dse.py,v 7.2 90/07/09 14:31:05 mrose Exp $
4: --
5: --
6: -- $Log: dse.py,v $
7: -- Revision 7.2 90/07/09 14:31:05 mrose
8: -- sync
9: --
10: -- Revision 7.1 89/12/04 08:44:12 mrose
11: -- touch-up
12: --
13: -- Revision 7.0 89/11/23 21:22:09 mrose
14: -- Release 6.0
15: --
16:
17: --
18: -- NOTICE
19: --
20: -- Acquisition, use, and distribution of this module and related
21: -- materials are subject to the restrictions of a license agreement.
22: -- Consult the Preface in the User's Manual for the full terms of
23: -- this agreement.
24: --
25: --
26:
27:
28: DSE DEFINITIONS ::=
29: %{
30: #ifndef lint
31: static char *rcsid = "$Header: /f/osi/acsap/RCS/dse.py,v 7.2 90/07/09 14:31:05 mrose Exp $";
32: #endif
33:
34: #include <stdio.h>
35: #include "psap.h"
36: #include "isoaddrs.h"
37: #include "tailor.h"
38:
39: /* Encoding on "unrealNS" addresses based on
40:
41: "An interim approach to use of Network Addresses",
42: S.E. Kille, January 16, 1989
43:
44: */
45:
46: /* */
47:
48: #define getstr(ss,sl,ds,dl,dn,w) \
49: if (sl > dn) { \
50: advise (NULLCP, "%s too long", w); \
51: return NOTOK; \
52: } \
53: bcopy (ss, ds, dl = sl);
54:
55: %}
56:
57: BEGIN
58:
59: ENCODER build
60:
61: PSAPaddr
62: %{
63: register int n;
64: struct PSAPaddr *pa = (struct PSAPaddr *) parm;
65: struct SSAPaddr *sa = &pa -> pa_addr;
66: struct TSAPaddr *ta = &sa -> sa_addr;
67: register struct NSAPaddr *na,
68: *ca;
69: %}
70: ::=
71: SEQUENCE {
72: pSelector[0]
73: OCTET STRING
74: [[ o pa -> pa_selector $ pa -> pa_selectlen ]]
75: OPTIONAL << pa -> pa_selectlen >>,
76:
77: sSelector[1]
78: OCTET STRING
79: [[ o sa -> sa_selector $ sa -> sa_selectlen ]]
80: OPTIONAL << sa -> sa_selectlen >>,
81:
82: tSelector[2]
83: OCTET STRING
84: [[ o ta -> ta_selector $ ta -> ta_selectlen ]]
85: OPTIONAL << ta -> ta_selectlen >>,
86:
87: nAddress[3]
88: SET OF
89: %{
90: if ((ca = na2norm (na)) == NULLNA) {
91: advise (NULLCP,
92: "unable to normalize address, check logs");
93: return NOTOK;
94: }
95: %}
96: <<na = ta -> ta_addrs, n = ta -> ta_naddr; n > 0; na++, n-->>
97: OCTET STRING
98: [[ o ca -> na_address $ ca -> na_addrlen ]]
99: }
100:
101:
102: DECODER parse
103:
104: PSAPaddr
105: %{
106: struct PSAPaddr *pa = (struct PSAPaddr *) parm;
107: struct SSAPaddr *sa = &pa -> pa_addr;
108: struct TSAPaddr *ta = &sa -> sa_addr;
109: %}
110: ::=
111: %{
112: bzero ((char *) pa, sizeof *pa);
113: %}
114: SEQUENCE {
115: pSelector[0]
116: OCTET STRING
117: %{
118: getstr ($$, $$_len, pa -> pa_selector, pa -> pa_selectlen,
119: sizeof pa -> pa_selector, "psap selector");
120: %}
121: OPTIONAL,
122:
123:
124: sSelector[1]
125: OCTET STRING
126: %{
127: getstr ($$, $$_len, sa -> sa_selector, sa -> sa_selectlen,
128: sizeof sa -> sa_selector, "ssap selector");
129: %}
130: OPTIONAL,
131:
132: tSelector[2]
133: OCTET STRING
134: %{
135: getstr ($$, $$_len, ta -> ta_selector, ta -> ta_selectlen,
136: sizeof ta -> ta_selector, "tsap selector");
137: %}
138: OPTIONAL,
139:
140: nAddress[3]
141: SET OF
142: %{
143: if (ta -> ta_naddr >= NTADDR) {
144: advise (NULLCP, "too many network addresses");
145: return NOTOK;
146: }
147: %}
148: NSAPaddr
149: [[ p (char *) &ta -> ta_addrs[ta -> ta_naddr++] ]]
150: }
151:
152: NSAPaddr
153: %{
154: struct NSAPaddr *na = (struct NSAPaddr *) parm;
155: %}
156: ::=
157: OCTET STRING
158: %{
159: if (($$_len == 8)
160: && (($$[0] == 0x36) || ($$[0] == 0x37))) {
161: int xlen; /* SEK - X121 form */
162: register char *cp,
163: *cp2,
164: *dp;
165: char nsap[14];
166:
167: dp = nsap;
168: for (cp2 = (cp = $$ + 1) + 7; cp < cp2; cp++) {
169: register int j;
170:
171: if ((j = ((*cp & 0xf0) >> 4)) > 9)
172: goto concrete;
173: *dp++ = j + '0';
174:
175: if ((j = (*cp & 0x0f)) > 9) {
176: if (j != 0x0f)
177: goto concrete;
178: }
179: else
180: *dp++ = j + '0';
181: }
182:
183: for (cp = nsap, xlen = 14; *cp == '0'; cp++, xlen--)
184: continue;
185: na -> na_dtelen = xlen;
186: for (cp2 = na -> na_dte; xlen-- > 0; )
187: *cp2++ = *cp++;
188: *cp2 = NULL;
189: #ifdef BRIDGE_X25
190: na -> na_type = bridgediscrim (na) ? NA_BRG : NA_X25;
191: #else
192: na -> na_type = NA_X25;
193: #endif
194: na -> na_subnet = SUBNET_INT_X25;
195: }
196: else {
197: register struct ts_interim *ts,
198: *tp;
199:
200: tp = NULL;
201: for (ts = ts_interim; ts -> ts_name; ts++)
202: if ($$_len > ts -> ts_length
203: && (tp == NULL
204: || ts -> ts_length > tp -> ts_length)
205: && bcmp ($$, ts -> ts_prefix,
206: ts -> ts_length) == 0)
207: tp = ts;
208: if (tp) {
209: int i,
210: ilen,
211: rlen;
212: register char *cp,
213: *dp,
214: *ep;
215: char nsap[NASIZE * 2 + 1];
216:
217: dp = nsap;
218: for (cp = $$ + tp -> ts_length, ep = $$ + $$_len;
219: cp < ep;
220: cp++) {
221: register int j;
222:
223: if ((j = ((*cp & 0xf0) >> 4)) > 9) {
224: concrete: ;
225: LLOG (addr_log, LLOG_EXCEPTIONS,
226: ("invalid concrete encoding"));
227: goto realNS;
228: }
229: *dp++ = j + '0';
230:
231: if ((j = (*cp & 0x0f)) > 9) {
232: if (j != 0x0f)
233: goto concrete;
234: }
235: else
236: *dp++ = j + '0';
237: }
238: *dp = NULL;
239:
240: cp = nsap;
241: na -> na_subnet = tp -> ts_subnet;
242: switch (na -> na_type = tp -> ts_syntax) {
243: case NA_NSAP:
244: goto unrealNS;
245:
246: case NA_X25:
247: if (strlen (cp) < 1) {
248: LLOG (addr_log, LLOG_EXCEPTIONS,
249: ("missing DTE+CUDF indicator: %s",
250: nsap));
251: goto realNS;
252: }
253: (void) sscanf (cp, "%1d", &i);
254: cp += 1;
255: switch (i) {
256: case 0: /* DTE only */
257: break;
258:
259: case 1: /* DTE+PID */
260: case 2: /* DTE+CUDF */
261: if (strlen (cp) < 1) {
262: LLOG (addr_log, LLOG_EXCEPTIONS,
263: ("missing DTE+CUDF indicator: %s",
264: nsap));
265: goto realNS;
266: }
267: (void) sscanf (cp, "%1d", &ilen);
268: cp += 1;
269: rlen = ilen * 3;
270: if (strlen (cp) < rlen) {
271: LLOG (addr_log, LLOG_EXCEPTIONS,
272: ("bad DTE+CUDF length: %s",
273: nsap));
274: goto realNS;
275: }
276: if (i == 1) {
277: if (ilen > NPSIZE) {
278: LLOG (addr_log,
279: LLOG_EXCEPTIONS,
280: ("PID too long: %s",
281: nsap));
282: goto realNS;
283: }
284: dp = na -> na_pid;
285: na -> na_pidlen = ilen;
286: }
287: else {
288: if (ilen > CUDFSIZE) {
289: LLOG (addr_log,
290: LLOG_EXCEPTIONS,
291: ("CUDF too long: %s",
292: nsap));
293: goto realNS;
294: }
295: dp = na -> na_cudf;
296: na -> na_cudflen = ilen;
297: }
298: for (; rlen > 0; rlen -= 3) {
299: (void) sscanf (cp, "%3d", &i);
300: cp += 3;
301:
302: if (i > 255) {
303: LLOG (addr_log,
304: LLOG_EXCEPTIONS,
305: ("invalid PID/CUDF: %s",
306: nsap));
307: goto realNS;
308: }
309: *dp++ = i & 0xff;
310: }
311: break;
312:
313: default:
314: LLOG (addr_log, LLOG_EXCEPTIONS,
315: ("invalid DTE+CUDF indicator: %s",
316: nsap));
317: goto realNS;
318: }
319: (void) strcpy (na -> na_dte, cp);
320: na -> na_dtelen = strlen (na -> na_dte);
321:
322: #ifdef BRIDGE_X25
323: if (bridgediscrim (na))
324: na -> na_type = NA_BRG;
325: #endif
326: break;
327:
328: case NA_TCP:
329: if (strlen (cp) < 12) {
330: LLOG (addr_log, LLOG_EXCEPTIONS,
331: ("missing IP address: %s", nsap));
332: goto realNS;
333: }
334: {
335: int q[4];
336:
337: (void) sscanf (cp, "%3d%3d%3d%3d", q,
338: q + 1, q + 2, q + 3);
339: (void) sprintf (na -> na_domain,
340: "%d.%d.%d.%d",
341: q[0], q[1], q[2], q[3]);
342: }
343: cp += 12;
344:
345: if (*cp) {
346: if (strlen (cp) < 5) {
347: LLOG (addr_log, LLOG_EXCEPTIONS,
348: ("missing port: %s", nsap));
349: goto realNS;
350: }
351: (void) sscanf (cp, "%5d", &i);
352: cp += 5;
353: na -> na_port = htons ((u_short) i);
354:
355: if (*cp) {
356: if (strlen (cp) < 5) {
357: LLOG (addr_log, LLOG_EXCEPTIONS,
358: ("missing tset: %s", nsap));
359: goto realNS;
360: }
361: (void) sscanf (cp, "%5d", &i);
362: cp += 5;
363: na -> na_tset = (u_short) i;
364:
365: if (*cp)
366: LLOG (addr_log, LLOG_EXCEPTIONS,
367: ("extra TCP information: %s",
368: nsap));
369: }
370: }
371: break;
372:
373: default:
374: LLOG (addr_log, LLOG_NOTICE,
375: ("unknown syntax %d for DSP: %s",
376: ts -> ts_syntax, nsap));
377: goto realNS;
378: }
379: }
380: else {
381: realNS: ;
382: na -> na_type = NA_NSAP;
383: na -> na_subnet = SUBNET_REALNS;
384: unrealNS: ;
385: getstr ($$, $$_len, na -> na_address, na -> na_addrlen,
386: sizeof na -> na_address, "NSAP address");
387: }
388: }
389: %}
390:
391:
392: PRINTER print
393:
394: PSAPaddr ::=
395: SEQUENCE {
396: pSelector[0]
397: OCTET STRING
398: OPTIONAL,
399:
400: sSelector[1]
401: OCTET STRING
402: OPTIONAL,
403:
404: tSelector[2]
405: OCTET STRING
406: OPTIONAL,
407:
408: nAddress[3]
409: SET OF
410: OCTET STRING
411: }
412:
413: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.