|
|
1.1 ! root 1: /* text2spkt.c - read/write a SPDU thru a debug filter */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/ssap/RCS/text2spkt.c,v 7.0 89/11/23 22:25:54 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/ssap/RCS/text2spkt.c,v 7.0 89/11/23 22:25:54 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: text2spkt.c,v $ ! 12: * Revision 7.0 89/11/23 22:25:54 mrose ! 13: * Release 6.0 ! 14: * ! 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: /* LINTLIBRARY */ ! 29: ! 30: #include <stdio.h> ! 31: #include "spkt.h" ! 32: #include "logger.h" ! 33: ! 34: ! 35: #define sprintc(v,b) sprintb ((int) (v), (b)) ! 36: ! 37: /* */ ! 38: ! 39: #define SPDU_TYPE(e) (void) ll_printf (lp, "%sCODE/ %s\n", rw, e) ! 40: ! 41: #define DMASK "\020\01RELEASE\02USER\03PROTOCOL\04UNKNOWN" ! 42: #define EMASK "\020\01BEGIN\02END" ! 43: #define OMASK "\020\01EXTD" ! 44: #define RMASK \ ! 45: "\020\01HALFDUPLEX\02DUPLEX\03EXPEDITED\04MINORSYNC\05MAJORSYNC\06RESYNC\07ACTIVITY\010NEGOTIATED\011CAPABILITY\012EXCEPTIONS\013TYPEDATA" ! 46: #define SMASK "\020\01NOEND" ! 47: #define TMASK "\020\01DATA\03SYNC\05ACTIVITY\07RELEASE" ! 48: #define YMASK "\020\01NOEXPLICIT" ! 49: ! 50: ! 51: ! 52: void spkt2text (lp, s, read) ! 53: register LLog *lp; ! 54: register struct ssapkt *s; ! 55: int read; ! 56: { ! 57: char *rw = read ? "<--- " : "---> "; ! 58: ! 59: LLOG (lp, LLOG_ALL, ! 60: ("dump of SPDU 0x%x, errno=0x%x mask=0x%x%s", ! 61: s, s -> s_errno, s -> s_mask, ! 62: s -> s_mask & SMASK_SPDU_EXPD ? " (expedited)" : "")); ! 63: (void) ll_printf (lp, "%s(\n", rw); ! 64: ! 65: (void) ll_printf (lp, "%sLI/ %d\n", rw, s -> s_li); ! 66: ! 67: switch (s -> s_code) { ! 68: case SPDU_CN: ! 69: case SPDU_AC: ! 70: SPDU_TYPE (s -> s_code == SPDU_CN ? "CONNECT" : "ACCEPT"); ! 71: if (s -> s_mask & SMASK_CN_REF) ! 72: type_ref (lp, rw, &s -> s_cn_reference); ! 73: if (s -> s_mask & SMASK_CN_OPT) ! 74: type_bits (lp, rw, "OPTIONS", s -> s_options, CR_OPT_MASK, ! 75: OMASK); ! 76: if (s -> s_mask & SMASK_CN_TSDU) ! 77: type_tsdu (lp, rw, s -> s_tsdu_init, s -> s_tsdu_resp); ! 78: if (s -> s_mask & SMASK_CN_VRSN) ! 79: type_vrsn (lp, rw, s -> s_cn_version); ! 80: if (s -> s_mask & SMASK_CN_ISN) ! 81: type_ssn (lp, rw, "ISN", s -> s_isn); ! 82: if (s -> s_mask & SMASK_CN_SET) ! 83: type_settings (lp, rw, s -> s_settings); ! 84: if (s -> s_code == SPDU_AC && (s -> s_mask & SMASK_AC_TOKEN)) ! 85: type_bits (lp, rw, "TOKENS", s -> s_ac_token, -1, TMASK); ! 86: if (s -> s_mask & SMASK_CN_REQ) ! 87: type_bits (lp, rw, "REQUIREMENTS", s -> s_cn_require, ! 88: -1, RMASK); ! 89: if (s -> s_mask & SMASK_CN_CALLING) ! 90: type_id (lp, "CALLING", rw, s -> s_calling, s -> s_callinglen); ! 91: if (s -> s_mask & SMASK_CN_CALLED) ! 92: type_id (lp, "CALLED", rw, s -> s_called, s -> s_calledlen); ! 93: break; ! 94: ! 95: case SPDU_RF: ! 96: SPDU_TYPE ("REFUSE"); ! 97: if (s -> s_mask & SMASK_RF_REF) ! 98: type_ref (lp, rw, &s -> s_rf_reference); ! 99: if (s -> s_mask & SMASK_RF_DISC) ! 100: type_bits (lp, rw, "DISCONNECT", s -> s_rf_disconnect, ! 101: RF_DISC_MASK, DMASK); ! 102: if (s -> s_mask & SMASK_RF_REQ) ! 103: type_bits (lp, rw, "REQUIREMENTS", s -> s_rf_require, ! 104: -1, RMASK); ! 105: if (s -> s_mask & SMASK_RF_VRSN) ! 106: type_vrsn (lp, rw, s -> s_rf_version); ! 107: if (s -> s_rlen > 0) { ! 108: type_reason (lp, rw, *s -> s_rdata & 0xff); ! 109: if (s -> s_rlen > 1) ! 110: type_data (lp, "REASON", rw, s -> s_rlen - 1, ! 111: s -> s_rdata + 1); ! 112: } ! 113: break; ! 114: ! 115: case SPDU_FN: ! 116: SPDU_TYPE ("FINISH"); ! 117: if (s -> s_mask & SMASK_FN_DISC) ! 118: type_bits (lp, rw, "DISCONNECT", s -> s_fn_disconnect, ! 119: FN_DISC_MASK, DMASK); ! 120: break; ! 121: ! 122: case SPDU_DN: ! 123: SPDU_TYPE ("DISCONNECT"); ! 124: break; ! 125: ! 126: case SPDU_NF: ! 127: SPDU_TYPE ("NOT FINISHED"); ! 128: break; ! 129: ! 130: case SPDU_AB: ! 131: #ifdef notdef ! 132: case SPDU_AI: /* aka SPDU_AB */ ! 133: #endif ! 134: if (s -> s_mask & SMASK_SPDU_AB) { ! 135: SPDU_TYPE ("ABORT"); ! 136: if (s -> s_mask & SMASK_AB_DISC) ! 137: type_bits (lp, rw, "DISCONNECT", s -> s_ab_disconnect, ! 138: AB_DISC_MASK, DMASK); ! 139: if (s -> s_mask & SMASK_AB_REFL) ! 140: type_data (lp, "REFLECT", rw, sizeof s -> s_reflect, ! 141: (char *) s -> s_reflect); ! 142: break; ! 143: } ! 144: SPDU_TYPE ("ACTIVITY INTERRUPT"); ! 145: if (s -> s_mask & SMASK_AI_REASON) ! 146: type_error (lp, rw, s -> s_ai_reason); ! 147: break; ! 148: ! 149: case SPDU_AA: ! 150: #ifdef notdef ! 151: case SPDU_AIA: /* aka SPDU_AA */ ! 152: #endif ! 153: if (s -> s_mask & SMASK_SPDU_AA) ! 154: SPDU_TYPE ("ABORT ACCEPT"); ! 155: else ! 156: SPDU_TYPE ("ACTIVITY INTERRUPT ACK"); ! 157: break; ! 158: ! 159: case SPDU_GT: ! 160: #ifdef notdef ! 161: case SPDU_DT: /* aka SPDU_GT */ ! 162: #endif ! 163: if (s -> s_mask & SMASK_SPDU_GT) { ! 164: SPDU_TYPE ("GIVE TOKENS"); ! 165: if (s -> s_mask & SMASK_GT_TOKEN) ! 166: type_bits (lp, rw, "TOKENS", s -> s_gt_token, -1, TMASK); ! 167: } ! 168: else ! 169: SPDU_TYPE ("DATA TRANSFER"); ! 170: break; ! 171: ! 172: case SPDU_EX: ! 173: SPDU_TYPE ("EXPEDITED"); ! 174: break; ! 175: ! 176: case SPDU_TD: ! 177: SPDU_TYPE ("TYPED DATA"); ! 178: break; ! 179: ! 180: case SPDU_CD: ! 181: SPDU_TYPE ("CAPABILITY DATA"); ! 182: break; ! 183: ! 184: case SPDU_CDA: ! 185: SPDU_TYPE ("CAPABILITY DATA ACK"); ! 186: break; ! 187: ! 188: case SPDU_PT: ! 189: SPDU_TYPE ("PLEASE TOKENS"); ! 190: if (s -> s_mask & SMASK_PT_TOKEN) ! 191: type_bits (lp, rw, "TOKENS", s -> s_pt_token, -1, TMASK); ! 192: break; ! 193: ! 194: case SPDU_GTC: ! 195: SPDU_TYPE ("GIVE TOKENS CONFIRM"); ! 196: break; ! 197: ! 198: case SPDU_GTA: ! 199: SPDU_TYPE ("GIVE TOKENS ACK"); ! 200: break; ! 201: ! 202: case SPDU_MIP: ! 203: SPDU_TYPE ("MINOR SYNCHRONIZATION POINT"); ! 204: if (s -> s_mask & SMASK_MIP_SYNC) ! 205: type_bits (lp, rw, "SYNC", s -> s_mip_sync, MIP_SYNC_MASK, ! 206: YMASK); ! 207: if (s -> s_mask & SMASK_MIP_SERIAL) ! 208: type_ssn (lp, rw, "SSN", s -> s_mip_serial); ! 209: break; ! 210: ! 211: case SPDU_MIA: ! 212: SPDU_TYPE ("MINOR SYNC ACK"); ! 213: if (s -> s_mask & SMASK_MIA_SERIAL) ! 214: type_ssn (lp, rw, "SSN", s -> s_mia_serial); ! 215: break; ! 216: ! 217: case SPDU_MAP: ! 218: #ifdef notdef ! 219: case SPDU_AE: /* aka SPDU_MAP */ ! 220: #endif ! 221: if ((s -> s_mask & SMASK_MAP_SYNC) ! 222: && (s -> s_map_sync & MAP_SYNC_NOEND)) { ! 223: SPDU_TYPE ("MAJOR SYNCHRONIZATION POINT"); ! 224: type_bits (lp, rw, "SYNC", s -> s_map_sync, MAP_SYNC_MASK, ! 225: SMASK); ! 226: } ! 227: else ! 228: SPDU_TYPE ("ACTIVITY END"); ! 229: if (s -> s_mask & SMASK_MAP_SERIAL) ! 230: type_ssn (lp, rw, "SSN", s -> s_map_serial); ! 231: break; ! 232: ! 233: case SPDU_MAA: ! 234: #ifdef notdef ! 235: case SPDU_AEA: /* aka SPDU_MAA */ ! 236: #endif ! 237: SPDU_TYPE ("MAJOR SYNC/ACTIVITY END ACK"); ! 238: if (s -> s_mask & SMASK_MAA_SERIAL) ! 239: type_ssn (lp, rw, "SSN", s -> s_maa_serial); ! 240: break; ! 241: ! 242: case SPDU_RS: ! 243: SPDU_TYPE ("RESYNCHRONIZE"); ! 244: if (s -> s_mask & SMASK_RS_SET) ! 245: type_settings (lp, rw, s -> s_rs_settings); ! 246: if (s -> s_mask & SMASK_RS_TYPE) ! 247: type_resync (lp, rw, s -> s_rs_type); ! 248: if (s -> s_mask & SMASK_RS_SSN) ! 249: type_ssn (lp, rw, "RSN", s -> s_rs_serial); ! 250: break; ! 251: ! 252: case SPDU_RA: ! 253: SPDU_TYPE ("RESYNCHRONIZE ACK"); ! 254: if (s -> s_mask & SMASK_RA_SET) ! 255: type_settings (lp, rw, s -> s_ra_settings); ! 256: if (s -> s_mask & SMASK_RA_SSN) ! 257: type_ssn (lp, rw, "RSN", s -> s_ra_serial); ! 258: break; ! 259: ! 260: case SPDU_PR: ! 261: SPDU_TYPE ("PREPARE"); ! 262: type_prepare (lp, rw, s -> s_pr_type); ! 263: break; ! 264: ! 265: case SPDU_ER: ! 266: SPDU_TYPE ("EXCEPTION REPORT"); ! 267: break; ! 268: ! 269: case SPDU_ED: ! 270: SPDU_TYPE ("EXCEPTION DATA"); ! 271: if (s -> s_mask & SMASK_ED_REASON) ! 272: type_error (lp, rw, s -> s_ed_reason); ! 273: break; ! 274: ! 275: case SPDU_AS: ! 276: SPDU_TYPE ("ACTIVITY START"); ! 277: if (s -> s_mask & SMASK_AS_ID) { ! 278: (void) ll_printf (lp, "%s", rw); ! 279: type_info (lp, "ID/ %d", (int) s -> s_as_id.sd_len, ! 280: s -> s_as_id.sd_data); ! 281: (void) ll_printf (lp, "\n"); ! 282: } ! 283: break; ! 284: ! 285: case SPDU_AR: ! 286: SPDU_TYPE ("ACTIVITY RESUME"); ! 287: if (s -> s_mask & SMASK_AR_REF) ! 288: type_ref (lp, rw, &s -> s_ar_reference); ! 289: if (s -> s_mask & SMASK_AR_OID) { ! 290: (void) ll_printf (lp, "%s", rw); ! 291: type_info (lp, "OLD ID/ %d", (int) s -> s_ar_oid.sd_len, ! 292: s -> s_ar_oid.sd_data); ! 293: (void) ll_printf (lp, "\n"); ! 294: } ! 295: if (s -> s_mask & SMASK_AR_SSN) ! 296: type_ssn (lp, rw, "SSN", s -> s_ar_serial); ! 297: if (s -> s_mask & SMASK_AR_ID) { ! 298: (void) ll_printf (lp, "%s", rw); ! 299: type_info (lp, "ID/ %d", (int) s -> s_ar_id.sd_len, ! 300: s -> s_ar_id.sd_data); ! 301: (void) ll_printf (lp, "\n"); ! 302: } ! 303: break; ! 304: ! 305: case SPDU_AD: ! 306: SPDU_TYPE ("ACTIVITY DISCARD"); ! 307: if (s -> s_mask & SMASK_AD_REASON) ! 308: type_error (lp, rw, s -> s_ad_reason); ! 309: break; ! 310: ! 311: case SPDU_ADA: ! 312: SPDU_TYPE ("ACTIVITY DISCARD ACK"); ! 313: break; ! 314: ! 315: default: ! 316: (void) ll_printf (lp, "%sCODE/ 0x%x\n", rw, s -> s_code); ! 317: break; ! 318: } ! 319: ! 320: if (s -> s_mask & SMASK_ENCLOSE) ! 321: type_bits (lp, rw, "ENCLOSURE", s -> s_enclose, ENCL_MASK, EMASK); ! 322: ! 323: if (s -> s_udata) ! 324: if (s -> s_code == SPDU_ER) ! 325: type_data (lp, "REFLECT", rw, s -> s_ulen, s -> s_udata); ! 326: else ! 327: if (s -> s_mask & SMASK_UDATA_PGI) ! 328: type_data (lp, "USER", rw, s -> s_ulen, s -> s_udata); ! 329: else { ! 330: (void) ll_printf (lp, "%sUSER INFO/ ", rw); ! 331: type_info (lp, "%d", s -> s_ulen, s -> s_udata); ! 332: (void) ll_printf (lp, "\n"); ! 333: } ! 334: (void) ll_printf (lp, "%s)\n", rw); ! 335: ! 336: (void) ll_sync (lp); ! 337: } ! 338: ! 339: /* */ ! 340: ! 341: static type_id (lp, type, rw, selector, len) ! 342: LLog *lp; ! 343: char *type, ! 344: *rw; ! 345: char *selector; ! 346: int len; ! 347: { ! 348: char buffer[BUFSIZ]; ! 349: ! 350: buffer[explode (buffer, (u_char *) selector, len)] = NULL; ! 351: ! 352: (void) ll_printf (lp, "%s%s/ %d/\"%s\"\n", rw, type, len, buffer); ! 353: } ! 354: ! 355: ! 356: static type_ssn (lp, rw, what, ssn) ! 357: LLog *lp; ! 358: char *rw, ! 359: *what; ! 360: u_long ssn; ! 361: { ! 362: (void) ll_printf (lp, "%s%s/ %d\n", rw, what, ssn); ! 363: } ! 364: ! 365: ! 366: static type_bits (lp, rw, s, bits, mask, t) ! 367: LLog *lp; ! 368: char *rw, ! 369: *s, ! 370: *t; ! 371: u_char bits, ! 372: mask; ! 373: { ! 374: (void) ll_printf (lp, "%s%s/ %s", rw, s, sprintc (bits & mask, t)); ! 375: if (bits & ~mask) ! 376: (void) ll_printf (lp, ": illegal use of %s", sprintc (bits & ~mask, t)); ! 377: (void) ll_printf (lp, "\n"); ! 378: } ! 379: ! 380: ! 381: #define dotoken(requires,shift,bit,type) \ ! 382: { \ ! 383: token = (settings >> shift) & ST_MASK; \ ! 384: (void) ll_printf (lp, " %s:%s", type, token == ST_INIT_VALUE ? "initiator" \ ! 385: : token == ST_RESP_VALUE ? "responder" \ ! 386: : token == ST_CALL_VALUE ? "choice" \ ! 387: : "reserved"); \ ! 388: } ! 389: ! 390: static type_settings (lp, rw, settings) ! 391: LLog *lp; ! 392: char *rw; ! 393: u_char settings; ! 394: { ! 395: int token; ! 396: ! 397: (void) ll_printf (lp, "%sSETTINGS/", rw); ! 398: dotokens (); ! 399: (void) ll_printf (lp, "\n"); ! 400: } ! 401: ! 402: #undef dotoken ! 403: ! 404: ! 405: static type_tsdu (lp, rw, init, resp) ! 406: LLog *lp; ! 407: char *rw; ! 408: u_short init, ! 409: resp; ! 410: { ! 411: (void) ll_printf (lp, "%sTSDU/ INITIATOR: %d, RESPONDER: %d\n", ! 412: rw, init, resp); ! 413: } ! 414: ! 415: ! 416: static type_ref (lp, rw, ref) ! 417: LLog *lp; ! 418: char *rw; ! 419: struct SSAPref *ref; ! 420: { ! 421: (void) ll_printf (lp, "%sREFERENCE/", rw); ! 422: if (ref -> sr_vlen) ! 423: type_info (lp, "<CALLING %d", (int) ref -> sr_calling_len, ! 424: ref -> sr_calling); ! 425: else ! 426: type_info (lp, " <USER %d", (int) ref -> sr_ulen, ref -> sr_udata); ! 427: type_info (lp, ", COMMON %d", (int) ref -> sr_clen, ref -> sr_cdata); ! 428: type_info (lp, ", ADDITIONAL %d", (int) ref -> sr_alen, ref -> sr_adata); ! 429: if (ref -> sr_vlen) ! 430: type_info (lp, ", CALLED %d", (int) ref -> sr_called_len, ! 431: ref -> sr_called); ! 432: (void) ll_printf (lp, ">\n"); ! 433: } ! 434: ! 435: ! 436: static type_vrsn (lp, rw, version) ! 437: LLog *lp; ! 438: char *rw; ! 439: u_char version; ! 440: { ! 441: (void) ll_printf (lp, "%sVERSION/ 0x%x\n", rw, version); ! 442: } ! 443: ! 444: ! 445: static type_reason (lp, rw, reason) ! 446: LLog *lp; ! 447: char *rw; ! 448: int reason; ! 449: { ! 450: (void) ll_printf (lp, "%sREASON/ 0x%x: %s\n", rw, reason, ! 451: SErrString ((int) reason)); ! 452: } ! 453: ! 454: ! 455: static type_prepare (lp, rw, type) ! 456: LLog *lp; ! 457: char *rw; ! 458: u_char type; ! 459: { ! 460: (void) ll_printf (lp, "%sTYPE/ ", rw); ! 461: switch (type) { ! 462: case PR_MAA: ! 463: (void) ll_printf (lp, "MAA"); ! 464: break; ! 465: case PR_RS: ! 466: (void) ll_printf (lp, "RS"); ! 467: break; ! 468: case PR_RA: ! 469: (void) ll_printf (lp, "RA"); ! 470: break; ! 471: case PR_AB: ! 472: (void) ll_printf (lp, "AB"); ! 473: break; ! 474: default: ! 475: (void) ll_printf (lp, "%d: illegal value", type); ! 476: break; ! 477: } ! 478: (void) ll_printf (lp, "\n"); ! 479: } ! 480: ! 481: ! 482: static type_error (lp, rw, reason) ! 483: LLog *lp; ! 484: char *rw; ! 485: u_char reason; ! 486: { ! 487: (void) ll_printf (lp, "%sREASON/ ", rw); ! 488: switch (reason) { ! 489: case SP_NOREASON: ! 490: (void) ll_printf (lp, "No specific reason stated"); ! 491: break; ! 492: case SP_JEOPARDY: ! 493: (void) ll_printf (lp, "User receiving ability jeopardized"); ! 494: break; ! 495: case SP_SEQUENCE: ! 496: (void) ll_printf (lp, "User sequence error"); ! 497: break; ! 498: case SP_LOCAL: ! 499: (void) ll_printf (lp, "Local SS-user error"); ! 500: break; ! 501: case SP_PROCEDURAL: ! 502: (void) ll_printf (lp, "Unrecoverable procedural error"); ! 503: break; ! 504: case SP_DEMAND: ! 505: (void) ll_printf (lp, "Demand data token"); ! 506: break; ! 507: default: ! 508: (void) ll_printf (lp, "%d: illegal value", reason); ! 509: break; ! 510: } ! 511: (void) ll_printf (lp, "\n"); ! 512: } ! 513: ! 514: ! 515: static type_resync (lp, rw, type) ! 516: LLog *lp; ! 517: char *rw; ! 518: u_char type; ! 519: { ! 520: (void) ll_printf (lp, "%sTYPE/ ", rw); ! 521: switch (type) { ! 522: case SYNC_RESTART: ! 523: (void) ll_printf (lp, "restart"); ! 524: break; ! 525: case SYNC_ABANDON: ! 526: (void) ll_printf (lp, "abandon"); ! 527: break; ! 528: case SYNC_SET: ! 529: (void) ll_printf (lp, "set"); ! 530: break; ! 531: default: ! 532: (void) ll_printf (lp, "%d: illegal value", type); ! 533: break; ! 534: } ! 535: (void) ll_printf (lp, "\n"); ! 536: } ! 537: ! 538: ! 539: static type_data (lp, type, rw, len, data) ! 540: LLog *lp; ! 541: char *type, ! 542: *rw, ! 543: *data; ! 544: int len; ! 545: { ! 546: (void) ll_printf (lp, "%s%s DATA/ ", rw, type); ! 547: type_info (lp, "%d", len, data); ! 548: (void) ll_printf (lp, "\n"); ! 549: } ! 550: ! 551: ! 552: static type_info (lp, fmt, len, data) ! 553: LLog *lp; ! 554: char *fmt, ! 555: *data; ! 556: int len; ! 557: { ! 558: char buffer[BUFSIZ]; ! 559: ! 560: (void) ll_printf (lp, fmt, len); ! 561: if (0 < len && len < sizeof buffer / 2) { ! 562: buffer[explode (buffer, (u_char *) data, len)] = NULL; ! 563: (void) ll_printf (lp, " %s", buffer); ! 564: } ! 565: } ! 566: ! 567: /* */ ! 568: ! 569: /* ARGSUSED */ ! 570: ! 571: void text2spkt (s) ! 572: struct ssapkt *s; ! 573: { ! 574: /* NOT YET IMPLEMENTED */ ! 575: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.