|
|
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.