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