Home | History | Annotate | Line # | Download | only in ipsend
      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