1 /* $NetBSD: dlcommon.c,v 1.1.1.1 2012/03/23 21:20:06 christos Exp $ */ 2 3 /* 4 * Common (shared) DLPI test routines. 5 * Mostly pretty boring boilerplate sorta stuff. 6 * These can be split into individual library routines later 7 * but it's just convenient to keep them in a single file 8 * while they're being developed. 9 * 10 * Not supported: 11 * Connection Oriented stuff 12 * QOS stuff 13 */ 14 15 /* 16 typedef unsigned long ulong; 17 */ 18 19 20 #include <sys/types.h> 21 #include <sys/stream.h> 22 #include <sys/stropts.h> 23 #ifdef __osf__ 24 # include <sys/dlpihdr.h> 25 #else 26 # include <sys/dlpi.h> 27 #endif 28 #include <sys/signal.h> 29 #include <stdio.h> 30 #include <string.h> 31 #include "dltest.h" 32 33 #define CASERET(s) case s: return ("s") 34 35 char *dlprim(); 36 char *dlstate(); 37 char *dlerrno(); 38 char *dlpromisclevel(); 39 char *dlservicemode(); 40 char *dlstyle(); 41 char *dlmactype(); 42 43 44 void 45 dlinforeq(fd) 46 int fd; 47 { 48 dl_info_req_t info_req; 49 struct strbuf ctl; 50 int flags; 51 52 info_req.dl_primitive = DL_INFO_REQ; 53 54 ctl.maxlen = 0; 55 ctl.len = sizeof (info_req); 56 ctl.buf = (char *) &info_req; 57 58 flags = RS_HIPRI; 59 60 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) 61 syserr("dlinforeq: putmsg"); 62 } 63 64 void 65 dlinfoack(fd, bufp) 66 int fd; 67 char *bufp; 68 { 69 union DL_primitives *dlp; 70 struct strbuf ctl; 71 int flags; 72 73 ctl.maxlen = MAXDLBUF; 74 ctl.len = 0; 75 ctl.buf = bufp; 76 77 strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlinfoack"); 78 79 dlp = (union DL_primitives *) ctl.buf; 80 81 expecting(DL_INFO_ACK, dlp); 82 83 if (ctl.len < sizeof (dl_info_ack_t)) 84 err("dlinfoack: response ctl.len too short: %d", ctl.len); 85 86 if (flags != RS_HIPRI) 87 err("dlinfoack: DL_INFO_ACK was not M_PCPROTO"); 88 89 if (ctl.len < sizeof (dl_info_ack_t)) 90 err("dlinfoack: short response ctl.len: %d", ctl.len); 91 } 92 93 void 94 dlattachreq(fd, ppa) 95 int fd; 96 u_long ppa; 97 { 98 dl_attach_req_t attach_req; 99 struct strbuf ctl; 100 int flags; 101 102 attach_req.dl_primitive = DL_ATTACH_REQ; 103 attach_req.dl_ppa = ppa; 104 105 ctl.maxlen = 0; 106 ctl.len = sizeof (attach_req); 107 ctl.buf = (char *) &attach_req; 108 109 flags = 0; 110 111 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) 112 syserr("dlattachreq: putmsg"); 113 } 114 115 void 116 dlenabmultireq(fd, addr, length) 117 int fd; 118 char *addr; 119 int length; 120 { 121 long buf[MAXDLBUF]; 122 union DL_primitives *dlp; 123 struct strbuf ctl; 124 int flags; 125 126 dlp = (union DL_primitives*) buf; 127 128 dlp->enabmulti_req.dl_primitive = DL_ENABMULTI_REQ; 129 dlp->enabmulti_req.dl_addr_length = length; 130 dlp->enabmulti_req.dl_addr_offset = sizeof (dl_enabmulti_req_t); 131 132 (void) memcpy((char*)OFFADDR(buf, sizeof (dl_enabmulti_req_t)), addr, length); 133 134 ctl.maxlen = 0; 135 ctl.len = sizeof (dl_enabmulti_req_t) + length; 136 ctl.buf = (char*) buf; 137 138 flags = 0; 139 140 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) 141 syserr("dlenabmultireq: putmsg"); 142 } 143 144 void 145 dldisabmultireq(fd, addr, length) 146 int fd; 147 char *addr; 148 int length; 149 { 150 long buf[MAXDLBUF]; 151 union DL_primitives *dlp; 152 struct strbuf ctl; 153 int flags; 154 155 dlp = (union DL_primitives*) buf; 156 157 dlp->disabmulti_req.dl_primitive = DL_ENABMULTI_REQ; 158 dlp->disabmulti_req.dl_addr_length = length; 159 dlp->disabmulti_req.dl_addr_offset = sizeof (dl_disabmulti_req_t); 160 161 (void) memcpy((char*)OFFADDR(buf, sizeof (dl_disabmulti_req_t)), addr, length); 162 163 ctl.maxlen = 0; 164 ctl.len = sizeof (dl_disabmulti_req_t) + length; 165 ctl.buf = (char*) buf; 166 167 flags = 0; 168 169 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) 170 syserr("dldisabmultireq: putmsg"); 171 } 172 173 void 174 dlpromisconreq(fd, level) 175 int fd; 176 u_long level; 177 { 178 dl_promiscon_req_t promiscon_req; 179 struct strbuf ctl; 180 int flags; 181 182 promiscon_req.dl_primitive = DL_PROMISCON_REQ; 183 promiscon_req.dl_level = level; 184 185 ctl.maxlen = 0; 186 ctl.len = sizeof (promiscon_req); 187 ctl.buf = (char *) &promiscon_req; 188 189 flags = 0; 190 191 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) 192 syserr("dlpromiscon: putmsg"); 193 194 } 195 196 void 197 dlpromiscoff(fd, level) 198 int fd; 199 u_long level; 200 { 201 dl_promiscoff_req_t promiscoff_req; 202 struct strbuf ctl; 203 int flags; 204 205 promiscoff_req.dl_primitive = DL_PROMISCOFF_REQ; 206 promiscoff_req.dl_level = level; 207 208 ctl.maxlen = 0; 209 ctl.len = sizeof (promiscoff_req); 210 ctl.buf = (char *) &promiscoff_req; 211 212 flags = 0; 213 214 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) 215 syserr("dlpromiscoff: putmsg"); 216 } 217 218 void 219 dlphysaddrreq(fd, addrtype) 220 int fd; 221 u_long addrtype; 222 { 223 dl_phys_addr_req_t phys_addr_req; 224 struct strbuf ctl; 225 int flags; 226 227 phys_addr_req.dl_primitive = DL_PHYS_ADDR_REQ; 228 phys_addr_req.dl_addr_type = addrtype; 229 230 ctl.maxlen = 0; 231 ctl.len = sizeof (phys_addr_req); 232 ctl.buf = (char *) &phys_addr_req; 233 234 flags = 0; 235 236 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) 237 syserr("dlphysaddrreq: putmsg"); 238 } 239 240 void 241 dlsetphysaddrreq(fd, addr, length) 242 int fd; 243 char *addr; 244 int length; 245 { 246 long buf[MAXDLBUF]; 247 union DL_primitives *dlp; 248 struct strbuf ctl; 249 int flags; 250 251 dlp = (union DL_primitives*) buf; 252 253 dlp->set_physaddr_req.dl_primitive = DL_ENABMULTI_REQ; 254 dlp->set_physaddr_req.dl_addr_length = length; 255 dlp->set_physaddr_req.dl_addr_offset = sizeof (dl_set_phys_addr_req_t); 256 257 (void) memcpy((char*)OFFADDR(buf, sizeof (dl_set_phys_addr_req_t)), addr, length); 258 259 ctl.maxlen = 0; 260 ctl.len = sizeof (dl_set_phys_addr_req_t) + length; 261 ctl.buf = (char*) buf; 262 263 flags = 0; 264 265 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) 266 syserr("dlsetphysaddrreq: putmsg"); 267 } 268 269 void 270 dldetachreq(fd) 271 int fd; 272 { 273 dl_detach_req_t detach_req; 274 struct strbuf ctl; 275 int flags; 276 277 detach_req.dl_primitive = DL_DETACH_REQ; 278 279 ctl.maxlen = 0; 280 ctl.len = sizeof (detach_req); 281 ctl.buf = (char *) &detach_req; 282 283 flags = 0; 284 285 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) 286 syserr("dldetachreq: putmsg"); 287 } 288 289 void 290 dlbindreq(fd, sap, max_conind, service_mode, conn_mgmt, xidtest) 291 int fd; 292 u_long sap; 293 u_long max_conind; 294 u_long service_mode; 295 u_long conn_mgmt; 296 u_long xidtest; 297 { 298 dl_bind_req_t bind_req; 299 struct strbuf ctl; 300 int flags; 301 302 bind_req.dl_primitive = DL_BIND_REQ; 303 bind_req.dl_sap = sap; 304 bind_req.dl_max_conind = max_conind; 305 bind_req.dl_service_mode = service_mode; 306 bind_req.dl_conn_mgmt = conn_mgmt; 307 bind_req.dl_xidtest_flg = xidtest; 308 309 ctl.maxlen = 0; 310 ctl.len = sizeof (bind_req); 311 ctl.buf = (char *) &bind_req; 312 313 flags = 0; 314 315 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) 316 syserr("dlbindreq: putmsg"); 317 } 318 319 void 320 dlunitdatareq(fd, addrp, addrlen, minpri, maxpri, datap, datalen) 321 int fd; 322 u_char *addrp; 323 int addrlen; 324 u_long minpri, maxpri; 325 u_char *datap; 326 int datalen; 327 { 328 long buf[MAXDLBUF]; 329 union DL_primitives *dlp; 330 struct strbuf data, ctl; 331 332 dlp = (union DL_primitives*) buf; 333 334 dlp->unitdata_req.dl_primitive = DL_UNITDATA_REQ; 335 dlp->unitdata_req.dl_dest_addr_length = addrlen; 336 dlp->unitdata_req.dl_dest_addr_offset = sizeof (dl_unitdata_req_t); 337 dlp->unitdata_req.dl_priority.dl_min = minpri; 338 dlp->unitdata_req.dl_priority.dl_max = maxpri; 339 340 (void) memcpy(OFFADDR(dlp, sizeof (dl_unitdata_req_t)), addrp, addrlen); 341 342 ctl.maxlen = 0; 343 ctl.len = sizeof (dl_unitdata_req_t) + addrlen; 344 ctl.buf = (char *) buf; 345 346 data.maxlen = 0; 347 data.len = datalen; 348 data.buf = (char *) datap; 349 350 if (putmsg(fd, &ctl, &data, 0) < 0) 351 syserr("dlunitdatareq: putmsg"); 352 } 353 354 void 355 dlunbindreq(fd) 356 int fd; 357 { 358 dl_unbind_req_t unbind_req; 359 struct strbuf ctl; 360 int flags; 361 362 unbind_req.dl_primitive = DL_UNBIND_REQ; 363 364 ctl.maxlen = 0; 365 ctl.len = sizeof (unbind_req); 366 ctl.buf = (char *) &unbind_req; 367 368 flags = 0; 369 370 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0) 371 syserr("dlunbindreq: putmsg"); 372 } 373 374 void 375 dlokack(fd, bufp) 376 int fd; 377 char *bufp; 378 { 379 union DL_primitives *dlp; 380 struct strbuf ctl; 381 int flags; 382 383 ctl.maxlen = MAXDLBUF; 384 ctl.len = 0; 385 ctl.buf = bufp; 386 387 strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlokack"); 388 389 dlp = (union DL_primitives *) ctl.buf; 390 391 expecting(DL_OK_ACK, dlp); 392 393 if (ctl.len < sizeof (dl_ok_ack_t)) 394 err("dlokack: response ctl.len too short: %d", ctl.len); 395 396 if (flags != RS_HIPRI) 397 err("dlokack: DL_OK_ACK was not M_PCPROTO"); 398 399 if (ctl.len < sizeof (dl_ok_ack_t)) 400 err("dlokack: short response ctl.len: %d", ctl.len); 401 } 402 403 void 404 dlerrorack(fd, bufp) 405 int fd; 406 char *bufp; 407 { 408 union DL_primitives *dlp; 409 struct strbuf ctl; 410 int flags; 411 412 ctl.maxlen = MAXDLBUF; 413 ctl.len = 0; 414 ctl.buf = bufp; 415 416 strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlerrorack"); 417 418 dlp = (union DL_primitives *) ctl.buf; 419 420 expecting(DL_ERROR_ACK, dlp); 421 422 if (ctl.len < sizeof (dl_error_ack_t)) 423 err("dlerrorack: response ctl.len too short: %d", ctl.len); 424 425 if (flags != RS_HIPRI) 426 err("dlerrorack: DL_OK_ACK was not M_PCPROTO"); 427 428 if (ctl.len < sizeof (dl_error_ack_t)) 429 err("dlerrorack: short response ctl.len: %d", ctl.len); 430 } 431 432 void 433 dlbindack(fd, bufp) 434 int fd; 435 char *bufp; 436 { 437 union DL_primitives *dlp; 438 struct strbuf ctl; 439 int flags; 440 441 ctl.maxlen = MAXDLBUF; 442 ctl.len = 0; 443 ctl.buf = bufp; 444 445 strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlbindack"); 446 447 dlp = (union DL_primitives *) ctl.buf; 448 449 expecting(DL_BIND_ACK, dlp); 450 451 if (flags != RS_HIPRI) 452 err("dlbindack: DL_OK_ACK was not M_PCPROTO"); 453 454 if (ctl.len < sizeof (dl_bind_ack_t)) 455 err("dlbindack: short response ctl.len: %d", ctl.len); 456 } 457 458 void 459 dlphysaddrack(fd, bufp) 460 int fd; 461 char *bufp; 462 { 463 union DL_primitives *dlp; 464 struct strbuf ctl; 465 int flags; 466 467 ctl.maxlen = MAXDLBUF; 468 ctl.len = 0; 469 ctl.buf = bufp; 470 471 strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlphysaddrack"); 472 473 dlp = (union DL_primitives *) ctl.buf; 474 475 expecting(DL_PHYS_ADDR_ACK, dlp); 476 477 if (flags != RS_HIPRI) 478 err("dlbindack: DL_OK_ACK was not M_PCPROTO"); 479 480 if (ctl.len < sizeof (dl_phys_addr_ack_t)) 481 err("dlphysaddrack: short response ctl.len: %d", ctl.len); 482 } 483 484 void 485 sigalrm() 486 { 487 (void) err("sigalrm: TIMEOUT"); 488 } 489 490 strgetmsg(fd, ctlp, datap, flagsp, caller) 491 int fd; 492 struct strbuf *ctlp, *datap; 493 int *flagsp; 494 char *caller; 495 { 496 int rc; 497 static char errmsg[80]; 498 499 /* 500 * Start timer. 501 */ 502 (void) signal(SIGALRM, sigalrm); 503 if (alarm(MAXWAIT) < 0) { 504 (void) sprintf(errmsg, "%s: alarm", caller); 505 syserr(errmsg); 506 } 507 508 /* 509 * Set flags argument and issue getmsg(). 510 */ 511 *flagsp = 0; 512 if ((rc = getmsg(fd, ctlp, datap, flagsp)) < 0) { 513 (void) sprintf(errmsg, "%s: getmsg", caller); 514 syserr(errmsg); 515 } 516 517 /* 518 * Stop timer. 519 */ 520 if (alarm(0) < 0) { 521 (void) sprintf(errmsg, "%s: alarm", caller); 522 syserr(errmsg); 523 } 524 525 /* 526 * Check for MOREDATA and/or MORECTL. 527 */ 528 if ((rc & (MORECTL | MOREDATA)) == (MORECTL | MOREDATA)) 529 err("%s: MORECTL|MOREDATA", caller); 530 if (rc & MORECTL) 531 err("%s: MORECTL", caller); 532 if (rc & MOREDATA) 533 err("%s: MOREDATA", caller); 534 535 /* 536 * Check for at least sizeof (long) control data portion. 537 */ 538 if (ctlp->len < sizeof (long)) 539 err("getmsg: control portion length < sizeof (long): %d", ctlp->len); 540 } 541 542 expecting(prim, dlp) 543 int prim; 544 union DL_primitives *dlp; 545 { 546 if (dlp->dl_primitive != (u_long)prim) { 547 printdlprim(dlp); 548 err("expected %s got %s", dlprim(prim), 549 dlprim(dlp->dl_primitive)); 550 exit(1); 551 } 552 } 553 554 /* 555 * Print any DLPI msg in human readable format. 556 */ 557 printdlprim(dlp) 558 union DL_primitives *dlp; 559 { 560 switch (dlp->dl_primitive) { 561 case DL_INFO_REQ: 562 printdlinforeq(dlp); 563 break; 564 565 case DL_INFO_ACK: 566 printdlinfoack(dlp); 567 break; 568 569 case DL_ATTACH_REQ: 570 printdlattachreq(dlp); 571 break; 572 573 case DL_OK_ACK: 574 printdlokack(dlp); 575 break; 576 577 case DL_ERROR_ACK: 578 printdlerrorack(dlp); 579 break; 580 581 case DL_DETACH_REQ: 582 printdldetachreq(dlp); 583 break; 584 585 case DL_BIND_REQ: 586 printdlbindreq(dlp); 587 break; 588 589 case DL_BIND_ACK: 590 printdlbindack(dlp); 591 break; 592 593 case DL_UNBIND_REQ: 594 printdlunbindreq(dlp); 595 break; 596 597 case DL_SUBS_BIND_REQ: 598 printdlsubsbindreq(dlp); 599 break; 600 601 case DL_SUBS_BIND_ACK: 602 printdlsubsbindack(dlp); 603 break; 604 605 case DL_SUBS_UNBIND_REQ: 606 printdlsubsunbindreq(dlp); 607 break; 608 609 case DL_ENABMULTI_REQ: 610 printdlenabmultireq(dlp); 611 break; 612 613 case DL_DISABMULTI_REQ: 614 printdldisabmultireq(dlp); 615 break; 616 617 case DL_PROMISCON_REQ: 618 printdlpromisconreq(dlp); 619 break; 620 621 case DL_PROMISCOFF_REQ: 622 printdlpromiscoffreq(dlp); 623 break; 624 625 case DL_UNITDATA_REQ: 626 printdlunitdatareq(dlp); 627 break; 628 629 case DL_UNITDATA_IND: 630 printdlunitdataind(dlp); 631 break; 632 633 case DL_UDERROR_IND: 634 printdluderrorind(dlp); 635 break; 636 637 case DL_UDQOS_REQ: 638 printdludqosreq(dlp); 639 break; 640 641 case DL_PHYS_ADDR_REQ: 642 printdlphysaddrreq(dlp); 643 break; 644 645 case DL_PHYS_ADDR_ACK: 646 printdlphysaddrack(dlp); 647 break; 648 649 case DL_SET_PHYS_ADDR_REQ: 650 printdlsetphysaddrreq(dlp); 651 break; 652 653 default: 654 err("printdlprim: unknown primitive type 0x%x", 655 dlp->dl_primitive); 656 break; 657 } 658 } 659 660 /* ARGSUSED */ 661 printdlinforeq(dlp) 662 union DL_primitives *dlp; 663 { 664 (void) printf("DL_INFO_REQ\n"); 665 } 666 667 printdlinfoack(dlp) 668 union DL_primitives *dlp; 669 { 670 u_char addr[MAXDLADDR]; 671 u_char brdcst[MAXDLADDR]; 672 673 addrtostring(OFFADDR(dlp, dlp->info_ack.dl_addr_offset), 674 dlp->info_ack.dl_addr_length, addr); 675 addrtostring(OFFADDR(dlp, dlp->info_ack.dl_brdcst_addr_offset), 676 dlp->info_ack.dl_brdcst_addr_length, brdcst); 677 678 (void) printf("DL_INFO_ACK: max_sdu %d min_sdu %d\n", 679 dlp->info_ack.dl_max_sdu, 680 dlp->info_ack.dl_min_sdu); 681 (void) printf("addr_length %d mac_type %s current_state %s\n", 682 dlp->info_ack.dl_addr_length, 683 dlmactype(dlp->info_ack.dl_mac_type), 684 dlstate(dlp->info_ack.dl_current_state)); 685 (void) printf("sap_length %d service_mode %s qos_length %d\n", 686 dlp->info_ack.dl_sap_length, 687 dlservicemode(dlp->info_ack.dl_service_mode), 688 dlp->info_ack.dl_qos_length); 689 (void) printf("qos_offset %d qos_range_length %d qos_range_offset %d\n", 690 dlp->info_ack.dl_qos_offset, 691 dlp->info_ack.dl_qos_range_length, 692 dlp->info_ack.dl_qos_range_offset); 693 (void) printf("provider_style %s addr_offset %d version %d\n", 694 dlstyle(dlp->info_ack.dl_provider_style), 695 dlp->info_ack.dl_addr_offset, 696 dlp->info_ack.dl_version); 697 (void) printf("brdcst_addr_length %d brdcst_addr_offset %d\n", 698 dlp->info_ack.dl_brdcst_addr_length, 699 dlp->info_ack.dl_brdcst_addr_offset); 700 (void) printf("addr %s\n", addr); 701 (void) printf("brdcst_addr %s\n", brdcst); 702 } 703 704 printdlattachreq(dlp) 705 union DL_primitives *dlp; 706 { 707 (void) printf("DL_ATTACH_REQ: ppa %d\n", 708 dlp->attach_req.dl_ppa); 709 } 710 711 printdlokack(dlp) 712 union DL_primitives *dlp; 713 { 714 (void) printf("DL_OK_ACK: correct_primitive %s\n", 715 dlprim(dlp->ok_ack.dl_correct_primitive)); 716 } 717 718 printdlerrorack(dlp) 719 union DL_primitives *dlp; 720 { 721 (void) printf("DL_ERROR_ACK: error_primitive %s errno %s unix_errno %d: %s\n", 722 dlprim(dlp->error_ack.dl_error_primitive), 723 dlerrno(dlp->error_ack.dl_errno), 724 dlp->error_ack.dl_unix_errno, 725 strerror(dlp->error_ack.dl_unix_errno)); 726 } 727 728 printdlenabmultireq(dlp) 729 union DL_primitives *dlp; 730 { 731 u_char addr[MAXDLADDR]; 732 733 addrtostring(OFFADDR(dlp, dlp->enabmulti_req.dl_addr_offset), 734 dlp->enabmulti_req.dl_addr_length, addr); 735 736 (void) printf("DL_ENABMULTI_REQ: addr_length %d addr_offset %d\n", 737 dlp->enabmulti_req.dl_addr_length, 738 dlp->enabmulti_req.dl_addr_offset); 739 (void) printf("addr %s\n", addr); 740 } 741 742 printdldisabmultireq(dlp) 743 union DL_primitives *dlp; 744 { 745 u_char addr[MAXDLADDR]; 746 747 addrtostring(OFFADDR(dlp, dlp->disabmulti_req.dl_addr_offset), 748 dlp->disabmulti_req.dl_addr_length, addr); 749 750 (void) printf("DL_DISABMULTI_REQ: addr_length %d addr_offset %d\n", 751 dlp->disabmulti_req.dl_addr_length, 752 dlp->disabmulti_req.dl_addr_offset); 753 (void) printf("addr %s\n", addr); 754 } 755 756 printdlpromisconreq(dlp) 757 union DL_primitives *dlp; 758 { 759 (void) printf("DL_PROMISCON_REQ: level %s\n", 760 dlpromisclevel(dlp->promiscon_req.dl_level)); 761 } 762 763 printdlpromiscoffreq(dlp) 764 union DL_primitives *dlp; 765 { 766 (void) printf("DL_PROMISCOFF_REQ: level %s\n", 767 dlpromisclevel(dlp->promiscoff_req.dl_level)); 768 } 769 770 printdlphysaddrreq(dlp) 771 union DL_primitives *dlp; 772 { 773 (void) printf("DL_PHYS_ADDR_REQ: addr_type 0x%x\n", 774 dlp->physaddr_req.dl_addr_type); 775 } 776 777 printdlphysaddrack(dlp) 778 union DL_primitives *dlp; 779 { 780 u_char addr[MAXDLADDR]; 781 782 addrtostring(OFFADDR(dlp, dlp->physaddr_ack.dl_addr_offset), 783 dlp->physaddr_ack.dl_addr_length, addr); 784 785 (void) printf("DL_PHYS_ADDR_ACK: addr_length %d addr_offset %d\n", 786 dlp->physaddr_ack.dl_addr_length, 787 dlp->physaddr_ack.dl_addr_offset); 788 (void) printf("addr %s\n", addr); 789 } 790 791 printdlsetphysaddrreq(dlp) 792 union DL_primitives *dlp; 793 { 794 u_char addr[MAXDLADDR]; 795 796 addrtostring(OFFADDR(dlp, dlp->set_physaddr_req.dl_addr_offset), 797 dlp->set_physaddr_req.dl_addr_length, addr); 798 799 (void) printf("DL_SET_PHYS_ADDR_REQ: addr_length %d addr_offset %d\n", 800 dlp->set_physaddr_req.dl_addr_length, 801 dlp->set_physaddr_req.dl_addr_offset); 802 (void) printf("addr %s\n", addr); 803 } 804 805 /* ARGSUSED */ 806 printdldetachreq(dlp) 807 union DL_primitives *dlp; 808 { 809 (void) printf("DL_DETACH_REQ\n"); 810 } 811 812 printdlbindreq(dlp) 813 union DL_primitives *dlp; 814 { 815 (void) printf("DL_BIND_REQ: sap %d max_conind %d\n", 816 dlp->bind_req.dl_sap, 817 dlp->bind_req.dl_max_conind); 818 (void) printf("service_mode %s conn_mgmt %d xidtest_flg 0x%x\n", 819 dlservicemode(dlp->bind_req.dl_service_mode), 820 dlp->bind_req.dl_conn_mgmt, 821 dlp->bind_req.dl_xidtest_flg); 822 } 823 824 printdlbindack(dlp) 825 union DL_primitives *dlp; 826 { 827 u_char addr[MAXDLADDR]; 828 829 addrtostring(OFFADDR(dlp, dlp->bind_ack.dl_addr_offset), 830 dlp->bind_ack.dl_addr_length, addr); 831 832 (void) printf("DL_BIND_ACK: sap %d addr_length %d addr_offset %d\n", 833 dlp->bind_ack.dl_sap, 834 dlp->bind_ack.dl_addr_length, 835 dlp->bind_ack.dl_addr_offset); 836 (void) printf("max_conind %d xidtest_flg 0x%x\n", 837 dlp->bind_ack.dl_max_conind, 838 dlp->bind_ack.dl_xidtest_flg); 839 (void) printf("addr %s\n", addr); 840 } 841 842 /* ARGSUSED */ 843 printdlunbindreq(dlp) 844 union DL_primitives *dlp; 845 { 846 (void) printf("DL_UNBIND_REQ\n"); 847 } 848 849 printdlsubsbindreq(dlp) 850 union DL_primitives *dlp; 851 { 852 u_char sap[MAXDLADDR]; 853 854 addrtostring(OFFADDR(dlp, dlp->subs_bind_req.dl_subs_sap_offset), 855 dlp->subs_bind_req.dl_subs_sap_length, sap); 856 857 (void) printf("DL_SUBS_BIND_REQ: subs_sap_offset %d sub_sap_len %d\n", 858 dlp->subs_bind_req.dl_subs_sap_offset, 859 dlp->subs_bind_req.dl_subs_sap_length); 860 (void) printf("sap %s\n", sap); 861 } 862 863 printdlsubsbindack(dlp) 864 union DL_primitives *dlp; 865 { 866 u_char sap[MAXDLADDR]; 867 868 addrtostring(OFFADDR(dlp, dlp->subs_bind_ack.dl_subs_sap_offset), 869 dlp->subs_bind_ack.dl_subs_sap_length, sap); 870 871 (void) printf("DL_SUBS_BIND_ACK: subs_sap_offset %d sub_sap_length %d\n", 872 dlp->subs_bind_ack.dl_subs_sap_offset, 873 dlp->subs_bind_ack.dl_subs_sap_length); 874 (void) printf("sap %s\n", sap); 875 } 876 877 printdlsubsunbindreq(dlp) 878 union DL_primitives *dlp; 879 { 880 u_char sap[MAXDLADDR]; 881 882 addrtostring(OFFADDR(dlp, dlp->subs_unbind_req.dl_subs_sap_offset), 883 dlp->subs_unbind_req.dl_subs_sap_length, sap); 884 885 (void) printf("DL_SUBS_UNBIND_REQ: subs_sap_offset %d sub_sap_length %d\n", 886 dlp->subs_unbind_req.dl_subs_sap_offset, 887 dlp->subs_unbind_req.dl_subs_sap_length); 888 (void) printf("sap %s\n", sap); 889 } 890 891 printdlunitdatareq(dlp) 892 union DL_primitives *dlp; 893 { 894 u_char addr[MAXDLADDR]; 895 896 addrtostring(OFFADDR(dlp, dlp->unitdata_req.dl_dest_addr_offset), 897 dlp->unitdata_req.dl_dest_addr_length, addr); 898 899 (void) printf("DL_UNITDATA_REQ: dest_addr_length %d dest_addr_offset %d\n", 900 dlp->unitdata_req.dl_dest_addr_length, 901 dlp->unitdata_req.dl_dest_addr_offset); 902 (void) printf("dl_priority.min %d dl_priority.max %d\n", 903 dlp->unitdata_req.dl_priority.dl_min, 904 dlp->unitdata_req.dl_priority.dl_max); 905 (void) printf("addr %s\n", addr); 906 } 907 908 printdlunitdataind(dlp) 909 union DL_primitives *dlp; 910 { 911 u_char dest[MAXDLADDR]; 912 u_char src[MAXDLADDR]; 913 914 addrtostring(OFFADDR(dlp, dlp->unitdata_ind.dl_dest_addr_offset), 915 dlp->unitdata_ind.dl_dest_addr_length, dest); 916 addrtostring(OFFADDR(dlp, dlp->unitdata_ind.dl_src_addr_offset), 917 dlp->unitdata_ind.dl_src_addr_length, src); 918 919 (void) printf("DL_UNITDATA_IND: dest_addr_length %d dest_addr_offset %d\n", 920 dlp->unitdata_ind.dl_dest_addr_length, 921 dlp->unitdata_ind.dl_dest_addr_offset); 922 (void) printf("src_addr_length %d src_addr_offset %d\n", 923 dlp->unitdata_ind.dl_src_addr_length, 924 dlp->unitdata_ind.dl_src_addr_offset); 925 (void) printf("group_address 0x%x\n", 926 dlp->unitdata_ind.dl_group_address); 927 (void) printf("dest %s\n", dest); 928 (void) printf("src %s\n", src); 929 } 930 931 printdluderrorind(dlp) 932 union DL_primitives *dlp; 933 { 934 u_char addr[MAXDLADDR]; 935 936 addrtostring(OFFADDR(dlp, dlp->uderror_ind.dl_dest_addr_offset), 937 dlp->uderror_ind.dl_dest_addr_length, addr); 938 939 (void) printf("DL_UDERROR_IND: dest_addr_length %d dest_addr_offset %d\n", 940 dlp->uderror_ind.dl_dest_addr_length, 941 dlp->uderror_ind.dl_dest_addr_offset); 942 (void) printf("unix_errno %d errno %s\n", 943 dlp->uderror_ind.dl_unix_errno, 944 dlerrno(dlp->uderror_ind.dl_errno)); 945 (void) printf("addr %s\n", addr); 946 } 947 948 printdltestreq(dlp) 949 union DL_primitives *dlp; 950 { 951 u_char addr[MAXDLADDR]; 952 953 addrtostring(OFFADDR(dlp, dlp->test_req.dl_dest_addr_offset), 954 dlp->test_req.dl_dest_addr_length, addr); 955 956 (void) printf("DL_TEST_REQ: flag 0x%x dest_addr_length %d dest_addr_offset %d\n", 957 dlp->test_req.dl_flag, 958 dlp->test_req.dl_dest_addr_length, 959 dlp->test_req.dl_dest_addr_offset); 960 (void) printf("dest_addr %s\n", addr); 961 } 962 963 printdltestind(dlp) 964 union DL_primitives *dlp; 965 { 966 u_char dest[MAXDLADDR]; 967 u_char src[MAXDLADDR]; 968 969 addrtostring(OFFADDR(dlp, dlp->test_ind.dl_dest_addr_offset), 970 dlp->test_ind.dl_dest_addr_length, dest); 971 addrtostring(OFFADDR(dlp, dlp->test_ind.dl_src_addr_offset), 972 dlp->test_ind.dl_src_addr_length, src); 973 974 (void) printf("DL_TEST_IND: flag 0x%x dest_addr_length %d dest_addr_offset %d\n", 975 dlp->test_ind.dl_flag, 976 dlp->test_ind.dl_dest_addr_length, 977 dlp->test_ind.dl_dest_addr_offset); 978 (void) printf("src_addr_length %d src_addr_offset %d\n", 979 dlp->test_ind.dl_src_addr_length, 980 dlp->test_ind.dl_src_addr_offset); 981 (void) printf("dest_addr %s\n", dest); 982 (void) printf("src_addr %s\n", src); 983 } 984 985 printdltestres(dlp) 986 union DL_primitives *dlp; 987 { 988 u_char dest[MAXDLADDR]; 989 990 addrtostring(OFFADDR(dlp, dlp->test_res.dl_dest_addr_offset), 991 dlp->test_res.dl_dest_addr_length, dest); 992 993 (void) printf("DL_TEST_RES: flag 0x%x dest_addr_length %d dest_addr_offset %d\n", 994 dlp->test_res.dl_flag, 995 dlp->test_res.dl_dest_addr_length, 996 dlp->test_res.dl_dest_addr_offset); 997 (void) printf("dest_addr %s\n", dest); 998 } 999 1000 printdltestcon(dlp) 1001 union DL_primitives *dlp; 1002 { 1003 u_char dest[MAXDLADDR]; 1004 u_char src[MAXDLADDR]; 1005 1006 addrtostring(OFFADDR(dlp, dlp->test_con.dl_dest_addr_offset), 1007 dlp->test_con.dl_dest_addr_length, dest); 1008 addrtostring(OFFADDR(dlp, dlp->test_con.dl_src_addr_offset), 1009 dlp->test_con.dl_src_addr_length, src); 1010 1011 (void) printf("DL_TEST_CON: flag 0x%x dest_addr_length %d dest_addr_offset %d\n", 1012 dlp->test_con.dl_flag, 1013 dlp->test_con.dl_dest_addr_length, 1014 dlp->test_con.dl_dest_addr_offset); 1015 (void) printf("src_addr_length %d src_addr_offset %d\n", 1016 dlp->test_con.dl_src_addr_length, 1017 dlp->test_con.dl_src_addr_offset); 1018 (void) printf("dest_addr %s\n", dest); 1019 (void) printf("src_addr %s\n", src); 1020 } 1021 1022 printdlxidreq(dlp) 1023 union DL_primitives *dlp; 1024 { 1025 u_char dest[MAXDLADDR]; 1026 1027 addrtostring(OFFADDR(dlp, dlp->xid_req.dl_dest_addr_offset), 1028 dlp->xid_req.dl_dest_addr_length, dest); 1029 1030 (void) printf("DL_XID_REQ: flag 0x%x dest_addr_length %d dest_addr_offset %d\n", 1031 dlp->xid_req.dl_flag, 1032 dlp->xid_req.dl_dest_addr_length, 1033 dlp->xid_req.dl_dest_addr_offset); 1034 (void) printf("dest_addr %s\n", dest); 1035 } 1036 1037 printdlxidind(dlp) 1038 union DL_primitives *dlp; 1039 { 1040 u_char dest[MAXDLADDR]; 1041 u_char src[MAXDLADDR]; 1042 1043 addrtostring(OFFADDR(dlp, dlp->xid_ind.dl_dest_addr_offset), 1044 dlp->xid_ind.dl_dest_addr_length, dest); 1045 addrtostring(OFFADDR(dlp, dlp->xid_ind.dl_src_addr_offset), 1046 dlp->xid_ind.dl_src_addr_length, src); 1047 1048 (void) printf("DL_XID_IND: flag 0x%x dest_addr_length %d dest_addr_offset %d\n", 1049 dlp->xid_ind.dl_flag, 1050 dlp->xid_ind.dl_dest_addr_length, 1051 dlp->xid_ind.dl_dest_addr_offset); 1052 (void) printf("src_addr_length %d src_addr_offset %d\n", 1053 dlp->xid_ind.dl_src_addr_length, 1054 dlp->xid_ind.dl_src_addr_offset); 1055 (void) printf("dest_addr %s\n", dest); 1056 (void) printf("src_addr %s\n", src); 1057 } 1058 1059 printdlxidres(dlp) 1060 union DL_primitives *dlp; 1061 { 1062 u_char dest[MAXDLADDR]; 1063 1064 addrtostring(OFFADDR(dlp, dlp->xid_res.dl_dest_addr_offset), 1065 dlp->xid_res.dl_dest_addr_length, dest); 1066 1067 (void) printf("DL_XID_RES: flag 0x%x dest_addr_length %d dest_addr_offset %d\n", 1068 dlp->xid_res.dl_flag, 1069 dlp->xid_res.dl_dest_addr_length, 1070 dlp->xid_res.dl_dest_addr_offset); 1071 (void) printf("dest_addr %s\n", dest); 1072 } 1073 1074 printdlxidcon(dlp) 1075 union DL_primitives *dlp; 1076 { 1077 u_char dest[MAXDLADDR]; 1078 u_char src[MAXDLADDR]; 1079 1080 addrtostring(OFFADDR(dlp, dlp->xid_con.dl_dest_addr_offset), 1081 dlp->xid_con.dl_dest_addr_length, dest); 1082 addrtostring(OFFADDR(dlp, dlp->xid_con.dl_src_addr_offset), 1083 dlp->xid_con.dl_src_addr_length, src); 1084 1085 (void) printf("DL_XID_CON: flag 0x%x dest_addr_length %d dest_addr_offset %d\n", 1086 dlp->xid_con.dl_flag, 1087 dlp->xid_con.dl_dest_addr_length, 1088 dlp->xid_con.dl_dest_addr_offset); 1089 (void) printf("src_addr_length %d src_addr_offset %d\n", 1090 dlp->xid_con.dl_src_addr_length, 1091 dlp->xid_con.dl_src_addr_offset); 1092 (void) printf("dest_addr %s\n", dest); 1093 (void) printf("src_addr %s\n", src); 1094 } 1095 1096 printdludqosreq(dlp) 1097 union DL_primitives *dlp; 1098 { 1099 (void) printf("DL_UDQOS_REQ: qos_length %d qos_offset %d\n", 1100 dlp->udqos_req.dl_qos_length, 1101 dlp->udqos_req.dl_qos_offset); 1102 } 1103 1104 /* 1105 * Return string. 1106 */ 1107 addrtostring(addr, length, s) 1108 u_char *addr; 1109 u_long length; 1110 u_char *s; 1111 { 1112 int i; 1113 1114 for (i = 0; i < length; i++) { 1115 (void) sprintf((char*) s, "%x:", addr[i] & 0xff); 1116 s = s + strlen((char*)s); 1117 } 1118 if (length) 1119 *(--s) = '\0'; 1120 } 1121 1122 /* 1123 * Return length 1124 */ 1125 stringtoaddr(sp, addr) 1126 char *sp; 1127 char *addr; 1128 { 1129 int n = 0; 1130 char *p; 1131 int val; 1132 1133 p = sp; 1134 while (p = strtok(p, ":")) { 1135 if (sscanf(p, "%x", &val) != 1) 1136 err("stringtoaddr: invalid input string: %s", sp); 1137 if (val > 0xff) 1138 err("stringtoaddr: invalid input string: %s", sp); 1139 *addr++ = val; 1140 n++; 1141 p = NULL; 1142 } 1143 1144 return (n); 1145 } 1146 1147 1148 static char 1149 hexnibble(c) 1150 char c; 1151 { 1152 static char hextab[] = { 1153 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 1154 'a', 'b', 'c', 'd', 'e', 'f' 1155 }; 1156 1157 return (hextab[c & 0x0f]); 1158 } 1159 1160 char* 1161 dlprim(prim) 1162 u_long prim; 1163 { 1164 static char primbuf[80]; 1165 1166 switch ((int)prim) { 1167 CASERET(DL_INFO_REQ); 1168 CASERET(DL_INFO_ACK); 1169 CASERET(DL_ATTACH_REQ); 1170 CASERET(DL_DETACH_REQ); 1171 CASERET(DL_BIND_REQ); 1172 CASERET(DL_BIND_ACK); 1173 CASERET(DL_UNBIND_REQ); 1174 CASERET(DL_OK_ACK); 1175 CASERET(DL_ERROR_ACK); 1176 CASERET(DL_SUBS_BIND_REQ); 1177 CASERET(DL_SUBS_BIND_ACK); 1178 CASERET(DL_UNITDATA_REQ); 1179 CASERET(DL_UNITDATA_IND); 1180 CASERET(DL_UDERROR_IND); 1181 CASERET(DL_UDQOS_REQ); 1182 CASERET(DL_CONNECT_REQ); 1183 CASERET(DL_CONNECT_IND); 1184 CASERET(DL_CONNECT_RES); 1185 CASERET(DL_CONNECT_CON); 1186 CASERET(DL_TOKEN_REQ); 1187 CASERET(DL_TOKEN_ACK); 1188 CASERET(DL_DISCONNECT_REQ); 1189 CASERET(DL_DISCONNECT_IND); 1190 CASERET(DL_RESET_REQ); 1191 CASERET(DL_RESET_IND); 1192 CASERET(DL_RESET_RES); 1193 CASERET(DL_RESET_CON); 1194 default: 1195 (void) sprintf(primbuf, "unknown primitive 0x%x", prim); 1196 return (primbuf); 1197 } 1198 } 1199 1200 1201 char* 1202 dlstate(state) 1203 u_long state; 1204 { 1205 static char statebuf[80]; 1206 1207 switch (state) { 1208 CASERET(DL_UNATTACHED); 1209 CASERET(DL_ATTACH_PENDING); 1210 CASERET(DL_DETACH_PENDING); 1211 CASERET(DL_UNBOUND); 1212 CASERET(DL_BIND_PENDING); 1213 CASERET(DL_UNBIND_PENDING); 1214 CASERET(DL_IDLE); 1215 CASERET(DL_UDQOS_PENDING); 1216 CASERET(DL_OUTCON_PENDING); 1217 CASERET(DL_INCON_PENDING); 1218 CASERET(DL_CONN_RES_PENDING); 1219 CASERET(DL_DATAXFER); 1220 CASERET(DL_USER_RESET_PENDING); 1221 CASERET(DL_PROV_RESET_PENDING); 1222 CASERET(DL_RESET_RES_PENDING); 1223 CASERET(DL_DISCON8_PENDING); 1224 CASERET(DL_DISCON9_PENDING); 1225 CASERET(DL_DISCON11_PENDING); 1226 CASERET(DL_DISCON12_PENDING); 1227 CASERET(DL_DISCON13_PENDING); 1228 CASERET(DL_SUBS_BIND_PND); 1229 default: 1230 (void) sprintf(statebuf, "unknown state 0x%x", state); 1231 return (statebuf); 1232 } 1233 } 1234 1235 char* 1236 dlerrno(errno) 1237 u_long errno; 1238 { 1239 static char errnobuf[80]; 1240 1241 switch (errno) { 1242 CASERET(DL_ACCESS); 1243 CASERET(DL_BADADDR); 1244 CASERET(DL_BADCORR); 1245 CASERET(DL_BADDATA); 1246 CASERET(DL_BADPPA); 1247 CASERET(DL_BADPRIM); 1248 CASERET(DL_BADQOSPARAM); 1249 CASERET(DL_BADQOSTYPE); 1250 CASERET(DL_BADSAP); 1251 CASERET(DL_BADTOKEN); 1252 CASERET(DL_BOUND); 1253 CASERET(DL_INITFAILED); 1254 CASERET(DL_NOADDR); 1255 CASERET(DL_NOTINIT); 1256 CASERET(DL_OUTSTATE); 1257 CASERET(DL_SYSERR); 1258 CASERET(DL_UNSUPPORTED); 1259 CASERET(DL_UNDELIVERABLE); 1260 CASERET(DL_NOTSUPPORTED); 1261 CASERET(DL_TOOMANY); 1262 CASERET(DL_NOTENAB); 1263 CASERET(DL_BUSY); 1264 CASERET(DL_NOAUTO); 1265 CASERET(DL_NOXIDAUTO); 1266 CASERET(DL_NOTESTAUTO); 1267 CASERET(DL_XIDAUTO); 1268 CASERET(DL_TESTAUTO); 1269 CASERET(DL_PENDING); 1270 1271 default: 1272 (void) sprintf(errnobuf, "unknown dlpi errno 0x%x", errno); 1273 return (errnobuf); 1274 } 1275 } 1276 1277 char* 1278 dlpromisclevel(level) 1279 u_long level; 1280 { 1281 static char levelbuf[80]; 1282 1283 switch (level) { 1284 CASERET(DL_PROMISC_PHYS); 1285 CASERET(DL_PROMISC_SAP); 1286 CASERET(DL_PROMISC_MULTI); 1287 default: 1288 (void) sprintf(levelbuf, "unknown promisc level 0x%x", level); 1289 return (levelbuf); 1290 } 1291 } 1292 1293 char* 1294 dlservicemode(servicemode) 1295 u_long servicemode; 1296 { 1297 static char servicemodebuf[80]; 1298 1299 switch (servicemode) { 1300 CASERET(DL_CODLS); 1301 CASERET(DL_CLDLS); 1302 CASERET(DL_CODLS|DL_CLDLS); 1303 default: 1304 (void) sprintf(servicemodebuf, 1305 "unknown provider service mode 0x%x", servicemode); 1306 return (servicemodebuf); 1307 } 1308 } 1309 1310 char* 1311 dlstyle(style) 1312 long style; 1313 { 1314 static char stylebuf[80]; 1315 1316 switch (style) { 1317 CASERET(DL_STYLE1); 1318 CASERET(DL_STYLE2); 1319 default: 1320 (void) sprintf(stylebuf, "unknown provider style 0x%x", style); 1321 return (stylebuf); 1322 } 1323 } 1324 1325 char* 1326 dlmactype(media) 1327 u_long media; 1328 { 1329 static char mediabuf[80]; 1330 1331 switch (media) { 1332 CASERET(DL_CSMACD); 1333 CASERET(DL_TPB); 1334 CASERET(DL_TPR); 1335 CASERET(DL_METRO); 1336 CASERET(DL_ETHER); 1337 CASERET(DL_HDLC); 1338 CASERET(DL_CHAR); 1339 CASERET(DL_CTCA); 1340 default: 1341 (void) sprintf(mediabuf, "unknown media type 0x%x", media); 1342 return (mediabuf); 1343 } 1344 } 1345 1346 /*VARARGS1*/ 1347 err(fmt, a1, a2, a3, a4) 1348 char *fmt; 1349 char *a1, *a2, *a3, *a4; 1350 { 1351 (void) fprintf(stderr, fmt, a1, a2, a3, a4); 1352 (void) fprintf(stderr, "\n"); 1353 (void) exit(1); 1354 } 1355 1356 syserr(s) 1357 char *s; 1358 { 1359 (void) perror(s); 1360 exit(1); 1361 } 1362 1363 strioctl(fd, cmd, timout, len, dp) 1364 int fd; 1365 int cmd; 1366 int timout; 1367 int len; 1368 char *dp; 1369 { 1370 struct strioctl sioc; 1371 int rc; 1372 1373 sioc.ic_cmd = cmd; 1374 sioc.ic_timout = timout; 1375 sioc.ic_len = len; 1376 sioc.ic_dp = dp; 1377 rc = ioctl(fd, I_STR, &sioc); 1378 1379 if (rc < 0) 1380 return (rc); 1381 else 1382 return (sioc.ic_len); 1383 } 1384