|
|
1.1 root 1: /* sunlink.c - X.25 abstractions for SunLink X25 */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/compat/RCS/sunlink.c,v 7.2 90/07/27 08:41:49 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/compat/RCS/sunlink.c,v 7.2 90/07/27 08:41:49 mrose Exp $
9: *
10: * Contributed by John Pavel, Department of Trade and Industry/National
11: * Physical Laboratory in the UK
12: *
13: *
14: * $Log: sunlink.c,v $
15: * Revision 7.2 90/07/27 08:41:49 mrose
16: * update
17: *
18: * Revision 7.1 90/07/09 14:32:22 mrose
19: * sync
20: *
21: * Revision 7.0 89/11/23 21:23:42 mrose
22: * Release 6.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 "general.h"
41: #include "manifest.h"
42: #include "tailor.h"
43:
44: /* SUN UNIX: SunLink X25 */
45:
46: #ifdef X25
47:
48: #include "x25.h"
49: #include "isoaddrs.h"
50:
51: #ifdef SUN_X25
52:
53: #define CALLING 0
54: #define CALLED 1
55: #define PROBE (-1)
56:
57: /* */
58:
59: #ifdef DEBUG
60: void print_x25_facilities ();
61: #endif
62:
63: /* */
64:
65: /* ARGSUSED */
66:
67: int start_x25_client (local, priv)
68: struct NSAPaddr *local;
69: int priv;
70: {
71: int sd;
72:
73: if ((sd = socket (AF_X25, SOCK_STREAM, 0)) == NOTOK) {
74: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("socket"));
75: return NOTOK;
76: }
77:
78: return sd;
79: }
80:
81: /* */
82:
83: int start_x25_server (local, backlog, opt1, opt2)
84: struct NSAPaddr *local;
85: int backlog,
86: opt1,
87: opt2;
88: {
89: CONN_DB sbuf,
90: xbuf;
91: CONN_DB *sock = &sbuf,
92: *xs = &xbuf;
93: int sd, onoff;
94:
95: if ((sd = socket (AF_X25, SOCK_STREAM, 0)) == NOTOK) {
96: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("socket"));
97: return NOTOK;
98: }
99:
100: onoff = 0;
101: if (ioctl (sd, X25_CALL_ACPT_APPROVAL, (char *) &onoff) == NOTOK) {
102: SLOG (compat_log, LLOG_EXCEPTIONS, "failed",
103: ("X25_CALL_ACPT_APPROVAL"));
104: (void) close_x25_socket (sd);
105: return NOTOK;
106: }
107:
108: if (ioctl (sd, X25_RD_HOSTADR, (char *) xs) == NOTOK) {
109: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("X25_RD_HOSTADR"));
110: (void) close_x25_socket (sd);
111: return NOTOK;
112: }
113: /* if null DTE in /etc/x25params
114: then ALWAYS use null DTE for
115: listen if PID is specified */
116: if (xs -> hostlen == 0 && local -> na_pidlen > 0) {
117: if (local -> na_pidlen > NPSIZE)
118: local -> na_pidlen = NPSIZE;
119: *sock = *xs; /* struct copy */
120: bzero((char *) sock -> data, NPSIZE);
121: bcopy (local -> na_pid, (char *) sock -> data, local -> na_pidlen);
122: bcopy (local -> na_cudf, (char *) sock -> data + NPSIZE,
123: local -> na_cudflen);
124: sock -> datalen = local -> na_pidlen + local -> na_cudflen;
125: }
126: else
127: sock = gen2if(local, sock, ADDR_LISTEN);
128:
129: /* Adopt the convention that if a null DTE is given,
130: we should get the one from /etc/x25params */
131: if(!local->na_dtelen) {
132: /* Now set the generic local address */
133: local = if2gen(local, xs, ADDR_LOCAL);
134: /* Modified by INRIA to avoid a null local address */
135: if (!local->na_dtelen) {
136: local->na_dtelen = 1;
137: local->na_dte[0] = '0';
138: }
139: }
140:
141: if (bind (sd, (struct sockaddr *) sock, sizeof(CONN_DB)) == NOTOK) {
142: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("bind"));
143: (void) close_x25_socket (sd);
144: return NOTOK;
145: }
146:
147: #ifndef BSD43
148: if (opt1)
149: (void) setsockopt (sd, SOL_SOCKET, opt1, NULLCP, 0);
150: if (opt2)
151: (void) setsockopt (sd, SOL_SOCKET, opt2, NULLCP, 0);
152: #else
153: onoff = 1;
154: if (opt1)
155: (void) setsockopt (sd, SOL_SOCKET, opt1, (char *)&onoff, sizeof onoff);
156: if (opt2)
157: (void) setsockopt (sd, SOL_SOCKET, opt2, (char *)&onoff, sizeof onoff);
158: #endif
159:
160: if (set_x25_facilities(sd, CALLED, "Acceptable") == NOTOK) {
161: (void) close_x25_socket (sd);
162: return NOTOK;
163: }
164:
165: (void) listen (sd, backlog);
166:
167: return sd;
168: }
169:
170: /* */
171:
172: int join_x25_server (fd, remote)
173: register int fd;
174: register struct NSAPaddr *remote;
175: {
176: CONN_DB sbuf;
177: CONN_DB *sock = &sbuf;
178: register int nfd;
179:
180: if ((sock = gen2if (remote, sock, ADDR_REMOTE)) == NULL)
181: return NOTOK;
182:
183: if (set_x25_facilities(fd, CALLING, "Proposed") == NOTOK)
184: return NOTOK;
185: #ifdef ANY_LINK
186: sock -> hostlen |= ANY_LINK;
187: #endif
188: if ((nfd = connect (fd, (struct sockaddr *)sock, sizeof (CONN_DB)))
189: == NOTOK) {
190: if (compat_log -> ll_events & LLOG_EXCEPTIONS)
191: (void) log_cause_and_diag(fd); /* Sun's documentation throwns
192: no light as to whether, or
193: not this will result in any
194: useful information */
195: }
196: #ifdef DEBUG
197: else
198: if (compat_log -> ll_events & LLOG_DEBUG)
199: (void) log_x25_facilities(fd, CALLING, "Effective Calling");
200: #endif
201: #ifdef ANY_LINK
202: sock -> hostlen &= ~ANY_LINK;
203: #endif
204: remote = if2gen (remote, sock, ADDR_REMOTE);
205:
206: return nfd;
207: }
208:
209: /* */
210:
211: int join_x25_client (fd, remote)
212: int fd;
213: struct NSAPaddr *remote;
214: {
215: CONN_DB sbuf;
216: CONN_DB *sock = &sbuf;
217: int len = sizeof *sock;
218: int nfd;
219:
220: if ((nfd = accept (fd, (struct sockaddr *) sock, &len)) == NOTOK) {
221: if (compat_log -> ll_events & LLOG_EXCEPTIONS)
222: (void) log_cause_and_diag(fd); /* Sun's documentation throwns
223: no light as to whether, or
224: not this will result in any
225: useful information */
226: }
227: #ifdef DEBUG
228: else
229: if (compat_log -> ll_events & LLOG_DEBUG)
230: (void) log_x25_facilities(fd, CALLED, "Effective Called");
231: #endif
232: if (nfd < 0) return nfd;
233:
234: /* May also need to send call accept packet if using
235: * FAST_ACPT_CLR, or X25_CALL_ACPT_APPROVAL
236: * there was a SUNLINK bug in this area
237: *
238: * May as well try it -- if it fails, so what ??
239: */
240: if (ioctl(nfd,X25_SEND_CALL_ACPT, NULLCP) < 0)
241: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("X25_SEND_CALL_ACPT"));
242:
243: remote = if2gen (remote, sock, ADDR_REMOTE);
244:
245: return nfd;
246: }
247:
248: /* */
249:
250: /* There is a bug whereby if the thruput is set, calls fail. [email protected] */
251:
252: int sun_fixed_thruput = 0;
253:
254: /* Set up X.25 Facilities. Note that setting even one value causes
255: the default (/etc/x25params) values to be set explicitly on the
256: call request (and probably also call accept). This can screw
257: things up, if your /etc/x25params has not been properly
258: localised as is normally the case. */
259:
260: int set_x25_facilities(sd, coc, caption)
261: int sd, coc;
262: char *caption;
263: {
264: FACILITY_DB facilities;
265:
266: bzero ((char *) &facilities, sizeof facilities);
267:
268: if (coc != CALLED
269: && ioctl (sd, X25_RD_FACILITY, (char *) &facilities) == NOTOK) {
270: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("X25_RD_FACILITY"));
271: return NOTOK;
272: }
273:
274: if (coc == PROBE
275: || !(coc == CALLED
276: || reverse_charge || recvpktsize || sendpktsize
277: || recvwndsize || sendwndsize || recvthruput
278: || sendthruput || cug_req /* || cug_index */
279: || fast_select_type || rpoa_req /* || rpoa */)) {
280: if (facilities.recvpktsize)
281: recvpktsize = facilities.recvpktsize;
282: if (facilities.sendpktsize)
283: sendpktsize = facilities.sendpktsize;
284:
285: return OK;
286: }
287:
288: if (reverse_charge)
289: facilities.reverse_charge = reverse_charge;
290: if (recvpktsize)
291: facilities.recvpktsize = recvpktsize;
292: if (sendpktsize)
293: facilities.sendpktsize = sendpktsize;
294: if (recvwndsize)
295: facilities.recvwndsize = recvwndsize;
296: if (sendwndsize)
297: facilities.sendwndsize = sendwndsize;
298: if (sun_fixed_thruput) { /* get round Sun bug */
299: if (recvthruput)
300: facilities.recvthruput = recvthruput;
301: if (sendthruput)
302: facilities.sendthruput = sendthruput;
303: }
304: else
305: facilities.recvthruput = facilities.sendthruput = 0;
306: if (cug_req)
307: facilities.cug_req = cug_req;
308: if (cug_index)
309: facilities.cug_index = cug_index;
310: if (fast_select_type)
311: facilities.fast_select_type = fast_select_type;
312: /* May as well accept FCS calls */
313: else
314: if (coc == CALLED)
315: facilities.fast_select_type = FAST_ACPT_CLR;
316: if (rpoa_req)
317: facilities.rpoa_req = rpoa_req;
318: if (rpoa)
319: facilities.rpoa = rpoa;
320:
321: #ifdef DEBUG
322: if (compat_log -> ll_events & LLOG_DEBUG)
323: print_x25_facilities (facilities, coc, caption);
324: #endif
325:
326: if (ioctl (sd, X25_WR_FACILITY, (char *) &facilities) == NOTOK) {
327: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("X25_WR_FACILITY"));
328: return NOTOK;
329: }
330:
331: #ifdef notyet
332: if (facilities.recvpktsize)
333: recvpktsize = facilities.recvpktsize;
334: if (facilities.sendpktsize)
335: sendpktsize = facilities.sendpktsize;
336: #endif
337:
338: return OK;
339: }
340:
341: /* */
342:
343: int log_cause_and_diag(fd)
344: int fd;
345: {
346: X25_CAUSE_DIAG diag;
347:
348: if (ioctl(fd, X25_RD_CAUSE_DIAG, (char *) &diag) == NOTOK) {
349: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("X25_RD_CAUSE_DIAG"));
350: return NOTOK;
351: }
352:
353: return elucidate_x25_err ((int) diag.flags, (char *) diag.data);
354:
355: }
356:
357: /* */
358:
359: #ifdef DEBUG
360:
361: static int log_x25_facilities (fd, coc, caption)
362: int fd;
363: int coc;
364: char *caption;
365: {
366: FACILITY_DB f;
367:
368: if (ioctl (fd, X25_RD_FACILITY, (char *) &f) == NOTOK) {
369: SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("X25_RD_FACILITY"));
370: return NOTOK;
371: }
372:
373: print_x25_facilities (f, coc, caption);
374:
375: return OK;
376: }
377:
378: /* */
379:
380: static void print_x25_facilities (f, coc, caption)
381: FACILITY_DB f;
382: int coc;
383: char *caption;
384: {
385: int baud;
386:
387: DLOG (compat_log, LLOG_DEBUG, ("%s X.25 Facilities:", caption));
388:
389: switch (f.reverse_charge) {
390: case 0:
391: DLOG (compat_log, LLOG_DEBUG, ((coc == CALLED)
392: ? "reverse charging not requested"
393: : "reverse charging not allowed"));
394: break;
395:
396: case 1:
397: DLOG (compat_log, LLOG_DEBUG, ((coc == CALLING)
398: ? "reverse charging requested"
399: : "reverse charging allowed"));
400: break;
401:
402: default:
403: DLOG (compat_log, LLOG_DEBUG, ("invalid reverse_charge: %d",
404: f.reverse_charge));
405: break;
406: }
407:
408: switch (f.recvpktsize) {
409: case 0:
410: DLOG (compat_log, LLOG_DEBUG, ("default recv packet size"));
411: break;
412:
413: case 16:
414: case 32:
415: case 64:
416: case 128:
417: case 256:
418: case 512:
419: case 1024:
420: DLOG (compat_log, LLOG_DEBUG, ("recv packet size %d",
421: f.recvpktsize));
422: break;
423:
424: default:
425: DLOG (compat_log, LLOG_DEBUG, ("invalid recv packet size %d",
426: f.recvpktsize));
427: break;
428: }
429:
430: switch (f.sendpktsize) {
431: case 0:
432: DLOG (compat_log, LLOG_DEBUG, ("default send packet size"));
433: break;
434:
435: case 16:
436: case 32:
437: case 64:
438: case 128:
439: case 256:
440: case 512:
441: case 1024:
442: DLOG (compat_log, LLOG_DEBUG, ("send packet size %d",
443: f.sendpktsize));
444: break;
445:
446: default:
447: DLOG (compat_log, LLOG_DEBUG, ("invalid send packet size %d",
448: f.sendpktsize));
449: break;
450: }
451:
452: DLOG (compat_log, LLOG_DEBUG,
453: (f.recvwndsize == 0 ? "default recv window size"
454: : 1 <= f.recvwndsize && f.recvwndsize <= 127
455: ? "recv window size %d"
456: : "invalid recv window size %d",
457: f.recvwndsize));
458:
459: DLOG (compat_log, LLOG_DEBUG,
460: (f.sendwndsize == 0 ? "default send window size"
461: : 1 <= f.sendwndsize && f.sendwndsize <= 127
462: ? "send window size %d"
463: : "invalid send window size %d",
464: f.sendwndsize));
465:
466: switch (f.recvthruput) {
467: case 0:
468: DLOG (compat_log, LLOG_DEBUG, ("default recv throughput"));
469: break;
470:
471: case 3:
472: baud = 75;
473: print_recv: ;
474: DLOG (compat_log, LLOG_DEBUG, ("recv throughput %dbps", baud));
475: break;
476:
477: case 4:
478: baud = 150;
479: goto print_recv;
480:
481: case 5:
482: baud = 300;
483: goto print_recv;
484:
485: case 6:
486: baud = 600;
487: goto print_recv;
488:
489: case 7:
490: baud = 1200;
491: goto print_recv;
492:
493: case 8:
494: baud = 2400;
495: goto print_recv;
496:
497: case 9:
498: baud = 4800;
499: goto print_recv;
500:
501: case 10:
502: baud = 9600;
503: goto print_recv;
504:
505: case 11:
506: baud = 19200;
507: goto print_recv;
508:
509: case 12:
510: baud = 48000;
511: goto print_recv;
512:
513: default:
514: DLOG (compat_log, LLOG_DEBUG, ("invalid recv throughput %d",
515: f.recvthruput));
516: break;
517: }
518:
519: switch (f.sendthruput) {
520: case 0:
521: DLOG (compat_log, LLOG_DEBUG, ("default send throughput"));
522: break;
523:
524: case 3:
525: baud = 75;
526: print_send: ;
527: DLOG (compat_log, LLOG_DEBUG, ("send throughput %dbps", baud));
528: break;
529:
530: case 4:
531: baud = 150;
532: goto print_send;
533:
534: case 5:
535: baud = 300;
536: goto print_send;
537:
538: case 6:
539: baud = 600;
540: goto print_send;
541:
542: case 7:
543: baud = 1200;
544: goto print_send;
545:
546: case 8:
547: baud = 2400;
548: goto print_send;
549:
550: case 9:
551: baud = 4800;
552: goto print_send;
553:
554: case 10:
555: baud = 9600;
556: goto print_send;
557:
558: case 11:
559: baud = 19200;
560: goto print_send;
561:
562: case 12:
563: baud = 48000;
564: goto print_send;
565:
566: default:
567: DLOG (compat_log, LLOG_DEBUG, ("invalid send throughput %d",
568: f.sendthruput));
569: break;
570: }
571:
572: switch (f.cug_req) {
573: case 0:
574: DLOG (compat_log, LLOG_DEBUG, ("no closed user group"));
575: break;
576:
577: case 1:
578: DLOG (compat_log, LLOG_DEBUG, ("closed user group 0x%x (BCD)",
579: f.cug_req));
580: break;
581:
582: default:
583: DLOG (compat_log, LLOG_DEBUG, ("invalid closed user group %d",
584: f.cug_req));
585: break;
586: }
587:
588: switch (f.fast_select_type) {
589: case FAST_OFF:
590: DLOG (compat_log, LLOG_DEBUG, ("don't use fast select"));
591: break;
592:
593: case FAST_CLR_ONLY:
594: DLOG (compat_log, LLOG_DEBUG, ("clear is fast select response"));
595: break;
596:
597: case FAST_ACPT_CLR:
598: DLOG (compat_log, LLOG_DEBUG,
599: ("clear or call accepted is fast select response"));
600: break;
601:
602: default:
603: DLOG (compat_log, LLOG_DEBUG, ("invalid fast select type %d",
604: f.fast_select_type));
605: break;
606: }
607:
608: switch (f.rpoa_req) {
609: case 0:
610: DLOG (compat_log, LLOG_DEBUG, ("no RPOA transit request"));
611: break;
612:
613: case 1:
614: DLOG (compat_log, LLOG_DEBUG, ("RPOA transit request 0x%x",
615: f.rpoa_req));
616: break;
617:
618: default:
619: DLOG (compat_log, LLOG_DEBUG, ("invalid RPOA transit request %d",
620: f.rpoa_req));
621: }
622: }
623: #endif
624: #endif
625:
626: elucidate_x25_err (flags, pkt)
627: int flags;
628: char * pkt;
629: {
630: char * cp;
631:
632: if (flags & (1 << RECV_DIAG)) {
633: SLOG (compat_log, LLOG_EXCEPTIONS, NULLCP,
634: (( flags & (1 << DIAG_TYPE) ) ? "cleared 0x%02x" : "reset 0x%02x",
635: pkt[0] ));
636:
637: if ((flags) & (1 << DIAG_TYPE)) /* cleared */
638: switch(pkt[0]) {
639: case 0x00:
640: cp = "DTE Clearing";
641: break;
642:
643: case 0x01:
644: cp = "Number Busy";
645: break;
646:
647: case 0x09:
648: cp = "Out of Order";
649: break;
650:
651: case 0x11:
652: cp = "Remote Procedure Error";
653: break;
654:
655: case 0x19:
656: cp = "Reverse Charging not subscribed";
657: break;
658:
659: case 0x03:
660: cp = "Invalid Facility Request";
661: break;
662:
663: case 0x0B:
664: cp = "Access Barred";
665: break;
666:
667: case 0x13:
668: cp = "Local Procedure Error";
669: break;
670:
671: case 0x05:
672: cp = "Network Congestion";
673: break;
674:
675: case 0x0D:
676: cp = "Not Obtainable";
677: break;
678:
679: case 0x21:
680: cp = "DTE Incompatible Call";
681: break;
682:
683: case 0x29:
684: cp = "Fast Select Acceptance not Subscribed";
685: break;
686:
687: default:
688: SLOG (compat_log, LLOG_EXCEPTIONS, NULLCP,
689: ("clearing cause 0x2%x", pkt[0]));
690: goto next;
691: }
692: else /* reset */
693: switch(pkt[0]) {
694: case 0x00:
695: cp = "DTE Reset";
696: break;
697:
698: case 0x01:
699: cp = "Out of Order (PVC Only)";
700: break;
701:
702: case 0x03:
703: cp = "Remote Procedure Error";
704: break;
705:
706: case 0x05:
707: cp = "Local Procedure Error";
708: break;
709:
710: case 0x07:
711: cp = "Network Congestion";
712: break;
713:
714: case 0x09:
715: cp = "Remote DTE Operational (PVC Only)";
716: break;
717:
718: case 0x0F:
719: cp = "Network Operational (PVC Only";
720: break;
721:
722: default:
723: SLOG (compat_log, LLOG_EXCEPTIONS, NULLCP,
724: ("resetting cause 0x%2x", pkt[0]));
725: goto next;
726:
727: }
728: SLOG (compat_log, LLOG_EXCEPTIONS, NULLCP, ("%s%s",
729: ( flags & (1 << DIAG_TYPE) ) ? "clearing cause " :
730: "resetting cause ", cp));
731:
732: next: ;
733: /* The following may only be applicable to PSS in the UK */
734: /* In any case, if someone is keen, they can stuff it all
735: into a text file and read it out */
736:
737: switch (pkt[1]) {
738: case 0x00:
739: cp = "NO ADDITIONAL INFORMATION";
740: break;
741:
742: case 0x01:
743: cp = "INVALID P(S)\tRESET";
744: break;
745:
746: case 0x02:
747: cp = "INVALID P(R)\tRESET";
748: break;
749:
750: case 0x11:
751: cp = "PACKET TYPE INVALID FOR STATE r1\tRESTART";
752: break;
753:
754: case 0x12:
755: cp = "PACKET TYPE INVALID FOR STATE r2\tRESTART";
756: break;
757:
758: case 0x13:
759: cp = "PACKET TYPE INVALID FOR STATE r3\tRESTART";
760: break;
761:
762: case 0x14:
763: cp = "PACKET TYPE INVALID FOR STATE p1\tCLEAR";
764: break;
765:
766: case 0x15:
767: cp = "PACKET TYPE INVALID FOR STATE p2\tCLEAR";
768: break;
769:
770: case 0x16:
771: cp = "PACKET TYPE INVALID FOR STATE p3\tCLEAR";
772: break;
773:
774: case 0x17:
775: cp = "PACKET TYPE INVALID FOR STATE p4\tCLEAR";
776: break;
777:
778: case 0x18:
779: cp = "PACKET TYPE INVALID FOR STATE p5\tRESET";
780: break;
781:
782: case 0x19:
783: cp = "PACKET TYPE INVALID FOR STATE p6\tCLEAR";
784: break;
785:
786: case 0x1A:
787: cp = "PACKET TYPE INVALID FOR STATE p7\tCLEAR";
788: break;
789:
790: case 0x1B:
791: cp = "PACKET TYPE INVALID FOR STATE d1\tRESET";
792: break;
793:
794: case 0x1C:
795: cp = "PACKET TYPE INVALID FOR STATE d2\tRESET";
796: break;
797:
798: case 0x1D:
799: cp = "PACKET TYPE INVALID FOR STATE d3\tRESET";
800: break;
801:
802: case 0x20:
803: cp = "PACKET NOT ALLOWED";
804: break;
805:
806: case 0x21:
807: cp = "UNIDENTIFIABLE PACKET";
808: break;
809:
810: case 0x22:
811: cp = "CALL ON ONE-WAY LOGICAL CHANNEL\tCLEAR";
812: break;
813:
814: case 0x23:
815: cp = "INVALID PACKET TYPE ON PVC\tRESET";
816: break;
817:
818: case 0x24:
819: cp = "PACKET ON UNASSIGNED LCN\tCLEAR";
820: break;
821:
822: case 0x25:
823: cp = "REJECT NOT SUBSCRIBED TO\tRESET";
824: break;
825:
826: case 0x26:
827: cp = "PACKET TOO SHORT\tRESET";
828: break;
829:
830: case 0x27:
831: cp = "PACKET TOO LONG\tRESET";
832: break;
833:
834: case 0x28:
835: cp = "INVALID GFI\tCLEAR";
836: break;
837:
838: case 0x29:
839: cp = "RESTART WITH NON-ZERO BITS 5-16";
840: break;
841:
842: case 0x2A:
843: cp = "PACKET TYPE NOT COMPATIBLE WITH FACILITY\tCLEAR";
844: break;
845:
846: case 0x2B:
847: cp = "UNAUTHORISED INTERRUPT CONF\tRESET";
848: break;
849:
850: case 0x2C:
851: cp = "UNAUTHORISED INTERRUPT\tRESET";
852: break;
853:
854: case 0x31:
855: cp = "TIMER EXPIRED; INCOMING CALL";
856: break;
857:
858: case 0x32:
859: cp = "TIMER EXPIRED;\tCLEAR INDICATION";
860: break;
861:
862: case 0x33:
863: cp = "TIMER EXPIRED;\tRESET INDICATION";
864: break;
865:
866: case 0x34:
867: cp = "TIMER EXPIRED;\tRESTART IND";
868: break;
869:
870: case 0x40:
871: cp = "UNSPECIFIED CALL SET-UP PROBLEM CLEAR";
872: break;
873:
874: case 0x41:
875: cp = "FACILITY CODE NOT ALLOWED\tCLEAR";
876: break;
877:
878: case 0x42:
879: cp = "FACILITY PARAMETER NOT ALLOWED\tCLEAR";
880: break;
881:
882: case 0x43:
883: cp = "INVALID CALLED ADDRESS\tCLEAR";
884: break;
885:
886: case 0x44:
887: cp = "INVALID CALLING ADDRESS\tCLEAR";
888: break;
889:
890: case 0x90:
891: cp = "DTE/DCE CONGESTION\tRESET";
892: break;
893:
894: case 0x91:
895: cp = "RECEIVED FAST SELECT CLEAR REQUEST";
896: break;
897:
898: case 0x92:
899: cp = "LINE RESTARTING BY INMC COMMAND\tRESTART";
900: break;
901:
902: case 0xA0:
903: cp = "NON-ZERO RESET CAUSE FROM DTE\tRESET";
904: break;
905:
906: case 0xA1:
907: cp = "DATA PACKET TOO LONG\tRESET";
908: break;
909:
910: case 0xA2:
911: cp = "INTERRUPT PACKET TOO LONG\tRESET";
912: break;
913:
914: case 0xA3:
915: cp = "INT PACKET TOO SHORT; NO USER DATA\tRESET";
916: break;
917:
918: case 0xA4:
919: cp = "INT CONFIRMATION PACKET TOO LONG\tRESET";
920: break;
921:
922: case 0xA5:
923: cp = "RR PACKET TOO LONG\tRESET";
924: break;
925:
926: case 0xA6:
927: cp = "RNR PACKET TOO LONG\tRESET";
928: break;
929:
930: case 0xA7:
931: cp = "RESET PACKET TOO LONG\tRESET";
932: break;
933:
934: case 0xA8:
935: cp = "RESET CONF PACKET TOO LONG\tRESET";
936: break;
937:
938: case 0xA9:
939: cp = "INVALID `Q' BIT IN DATA PACKET\tRESET";
940: break;
941:
942: case 0xAA:
943: cp = "PACKET WINDOW RANGE EXCEEDED\tRESET";
944: break;
945:
946: case 0xAB:
947: cp = "UNABLE TO TRANSMIT PACKET\tRESET";
948: break;
949:
950: case 0xAC:
951: cp = "diagnostic `Q' BIT SET IN NON-DATA PACKET\tRESET";
952: break;
953:
954: case 0xAD:
955: cp = "OUTSTANDING PACKET COUNT LESS THAN ZERO\tRESET";
956: break;
957:
958: case 0xAE:
959: cp = "RETRANSMISSION ERROR\tRESET";
960: break;
961:
962: case 0xAF:
963: cp = "RESET PACKET TOO SHORT (NO CAUSE)\tRESET";
964: break;
965:
966: case 0xB0:
967: cp = "REJECT PACKET TOO LONG\tRESET";
968: break;
969:
970: case 0xB1:
971: cp = "INVALID 1D PACKET\tRESET";
972: break;
973:
974: case 0xB2:
975: cp = "UNSUCCESSFUL RECONNECTION RESNC\tCLEAR";
976: break;
977:
978: case 0xB3:
979: cp = "NON-RECONNECT CALL IN STATE C1\tCLEAR";
980: break;
981:
982: case 0xB4:
983: cp = "SECOND 1D PACKET FROM DTE\tCLEAR";
984: break;
985:
986: case 0xB5:
987: cp = "BAD DATA TRANSFER STATE IN RECONNECT\tCLEAR";
988: break;
989:
990: case 0xB6:
991: cp = "PACKET FORMAT INVALID\tCLEAR";
992: break;
993:
994: case 0xB7:
995: cp = "FACILITY BYTE COUNT TOO LARGE\tCLEAR";
996: break;
997:
998: case 0xB8:
999: cp = "INVALID PACKET DETECTED\tCLEAR";
1000: break;
1001:
1002: case 0xB9:
1003: cp = "FACILITY/UTILITY FIELD BYTE COUNT > 63\tCLEAR";
1004: break;
1005:
1006: case 0xBA:
1007: cp = "OUTGOING CALLS BARRED\tCLEAR";
1008: break;
1009:
1010: case 0xBB:
1011: cp = "INCOMING CALLS BARRED\tCLEAR";
1012: break;
1013:
1014: case 0xBC:
1015: cp = "CLEARING OF PVC\tCLEAR";
1016: break;
1017:
1018: case 0xBD:
1019: cp = "CALLED ADDRESS TOO LONG\tCLEAR";
1020: break;
1021:
1022: case 0xBE:
1023: cp = "CALLED ADDRESS TOO SHORT\tCLEAR";
1024: break;
1025:
1026: case 0xBF:
1027: cp = "CALLING ADDRESS TOO LONG\tCLEAR";
1028: break;
1029:
1030: case 0xC0:
1031: cp = "CALLING ADDRESS TOO SHORT\tCLEAR";
1032: break;
1033:
1034: case 0xC1:
1035: cp = "BCD ERROR IN CALL ADDRESS\tCLEAR";
1036: break;
1037:
1038: case 0xC2:
1039: cp = "BCD ERROR IN CALLING ADDRESS\tCLEAR";
1040: break;
1041:
1042: case 0xC3:
1043: cp = "USER DATA FIELD TOO LONG\tCLEAR";
1044: break;
1045:
1046: case 0xC4:
1047: cp = "NO BUFFER AVAILABLE\tCLEAR";
1048: break;
1049:
1050: case 0xC5:
1051: cp = "LOCAL DTE IS NOT ENHANCED\tCLEAR";
1052: break;
1053:
1054: case 0xC6:
1055: cp = "FACILITY NEGOTIATION INVALID\tCLEAR";
1056: break;
1057:
1058: case 0xC7:
1059: cp = "MANDATORY UTILITY NOT INPUT\tCLEAR";
1060: break;
1061:
1062: case 0xC8:
1063: cp = "BUFFER NO AVAILABLE FOR TNIC\tCLEAR";
1064: break;
1065:
1066: case 0xC9:
1067: cp = "OVERFLOW OF TNIC IN BUFFER\tCLEAR";
1068: break;
1069:
1070: case 0xCA:
1071: cp = "DTE LINE CONGESTED\tCLEAR";
1072: break;
1073:
1074: case 0xCB:
1075: cp = "TABLE ERROR IN PACKET PROCEDURES";
1076: break;
1077:
1078: case 0xCC:
1079: cp = "INSERT TABLE OVERFLOW";
1080: break;
1081:
1082: case 0xCD:
1083: cp = "DELETE TABLE OVERFLOW";
1084: break;
1085:
1086: case 0xD0:
1087: cp = "TRUNK LINE RESTART\tRESTART";
1088: break;
1089:
1090: case 0xD1:
1091: cp = "INVALID EVENT IN STATE p2";
1092: break;
1093:
1094: case 0xD2:
1095: cp = "INVALID EVENT IN STATE p3";
1096: break;
1097:
1098: case 0xD3:
1099: cp = "INVALID 1D EVENT IN STATE d1";
1100: break;
1101:
1102: case 0xD4:
1103: cp = "CALL COLLISION ON TRUNK LINE";
1104: break;
1105:
1106: case 0xD5:
1107: cp = "NO BUFFER AVAILABLE";
1108: break;
1109:
1110: case 0xD6:
1111:
1112: cp = "CALL COLLISION ON DTE LINE";
1113: break;
1114:
1115: case 0xD7:
1116: cp = "DTE RESTART";
1117: break;
1118:
1119: case 0xD8:
1120: cp = "CALL REQUEST TO TRUNK LINE TIMEOUT";
1121: break;
1122:
1123: case 0xD9:
1124: cp = "RECONNECT SET-UP TIMED OUT";
1125: break;
1126:
1127: case 0xDA:
1128: cp = "INVALID OUTPUT SIDE STATE";
1129: break;
1130:
1131: case 0xDB:
1132: cp = "ERROR DETECTED IN BLINK PACKET QUEUE PROCEDURE";
1133: break;
1134:
1135: case 0xDC:
1136: cp = "RESET INDICATION RETRANSMISSION COUNT EXPIRED";
1137: break;
1138:
1139: case 0xDD:
1140: cp = "INVALID OUTPUT SIDE STATE";
1141: break;
1142:
1143: case 0xDE:
1144: cp = "BLIND BUFFER QUEUE OVERFLOW IN STATE d4";
1145: break;
1146:
1147: case 0xDF:
1148: cp = "BLIND BUFFER QUEUE OVERFLOW IN STATE c1";
1149: break;
1150:
1151: case 0xE0:
1152: cp = "BLIND BUFFER QUEUE OVERFLOW IN STATE c2";
1153: break;
1154:
1155: case 0xE1:
1156: cp = "CLEAR PACKET BYTE COUNT TOO LARGE OR TOO SMALL";
1157: break;
1158:
1159: case 0xE2:
1160: cp = "NON-ZERO\tCLEAR CAUSE";
1161: break;
1162:
1163: case 0xE3:
1164: cp = "CLEAR CONF PACKET BYTE COUNT TOO SMALL OR TOO LARGE";
1165: break;
1166:
1167: case 0xE4:
1168: cp = "CALL COLLISION";
1169: break;
1170:
1171: case 0xE5:
1172: cp = "INVALID TP LOAD REQUEST CALL PKT";
1173: break;
1174:
1175: case 0xE6:
1176: cp = "MAXIMUM HOPCOUNT EXCEEDED";
1177: break;
1178:
1179: case 0xE7:
1180: cp = "ROUTING LOOP DETECTED";
1181: break;
1182:
1183: case 0xE8:
1184: cp = "PVC CALL REQUEST FAILURE";
1185: break;
1186:
1187: case 0xE9:
1188: cp = "RECONNECT CALL REQUEST FAILED";
1189: break;
1190:
1191: case 0xEA:
1192: cp = "NO LC AVAILABLE ON OUTPUT SIDE";
1193: break;
1194:
1195: case 0xEB:
1196: cp = "NO BUFFER AVAILABLE";
1197: break;
1198:
1199: case 0xEC:
1200: cp = "CALL REDIRECTION CLEAR";
1201: break;
1202:
1203: case 0xED:
1204: cp = "NO PATH ROUTE CALL";
1205: break;
1206:
1207: case 0xEE:
1208: cp = "CALL ROUTED TO DTE LINE";
1209: break;
1210:
1211: case 0xEF:
1212: cp = "CALL CANNOT BE REROUTED";
1213: break;
1214:
1215: case 0xF0:
1216: cp = "ADDRESS NOT IN ROUTING TABLES";
1217: break;
1218:
1219: case 0xF1:
1220: cp = "ROUTING TABLE CHANGE DURING CALL ROUTING";
1221: break;
1222:
1223: case 0xF2:
1224: cp = "NO LC AVAILABLE ON FAKE TRUNK";
1225: break;
1226:
1227: case 0xF3:
1228: cp = "REMOTE DTE DOWN ON A PVC";
1229: break;
1230:
1231: case 0xF4:
1232: cp = "INVALID EVENT DETECTED";
1233: break;
1234:
1235: case 0xF5:
1236: cp = "INVALID PACKET RECEIVED; STATE d4";
1237: break;
1238:
1239: case 0xF6:
1240: cp = "INVALID PACKET RECEIVED; STATE d5";
1241: break;
1242:
1243: case 0xF7:
1244: cp = "INVALID PACKET RECEIVED; STATE p8";
1245: break;
1246:
1247: case 0xF8:
1248: cp = "INTERNAL PROCESSING FAILURE";
1249: break;
1250:
1251: case 0xF9:
1252: cp = "INVALID RESTART INDICATION";
1253: break;
1254:
1255: case 0xFA:
1256: cp = "LINE STATUS CHANGE IN STATE r4";
1257: break;
1258:
1259: case 0xFB:
1260: cp = "INVALID PACKET RECEIVED; STATE r4";
1261: break;
1262:
1263: case 0xFC:
1264: cp = "INVALID PACKET RECEIVED; STATE r3";
1265: break;
1266:
1267: case 0xFD:
1268: cp = "LINE STATUS CHANGE IN STATE r2";
1269: break;
1270:
1271: case 0xFE:
1272: cp = "LINE STATUS CHANGE IN STATE r1";
1273: break;
1274:
1275: case 0xFF:
1276: cp = "LINE STATUS CHANGE IN STATE r0";
1277: break;
1278:
1279: default:
1280: SLOG (compat_log, LLOG_EXCEPTIONS, NULLCP,
1281: ("diagnostic: 0x%2x", pkt[1]));
1282: goto done;
1283: }
1284: SLOG (compat_log, LLOG_EXCEPTIONS, NULLCP, ("diagnostic %s", cp));
1285: }
1286: else /* Not RECV_DIAG */
1287: if (flags)
1288: SLOG (compat_log, LLOG_EXCEPTIONS, NULLCP,
1289: ("diag flags: 0x%02x", flags));
1290:
1291: done: ;
1292: return OK;
1293: }
1294:
1295: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.