kernel - TMPFS - Stabilization pass, fix accounting for rmdir
[dragonfly.git] / contrib / ipfilter / ipsend / dlcommon.c
blob59b283d2b82fbe286dd3284c7952145ddde4b1f4
1 /*
2 * Common (shared) DLPI test routines.
3 * Mostly pretty boring boilerplate sorta stuff.
4 * These can be split into individual library routines later
5 * but it's just convenient to keep them in a single file
6 * while they're being developed.
8 * Not supported:
9 * Connection Oriented stuff
10 * QOS stuff
14 typedef unsigned long ulong;
18 #include <sys/types.h>
19 #include <sys/stream.h>
20 #include <sys/stropts.h>
21 #include <sys/dlpi.h>
22 #include <sys/signal.h>
23 #include <stdio.h>
24 #include <string.h>
25 #include "dltest.h"
27 #define CASERET(s) case s: return ("s")
29 char *dlprim();
30 char *dlstate();
31 char *dlerrno();
32 char *dlpromisclevel();
33 char *dlservicemode();
34 char *dlstyle();
35 char *dlmactype();
38 dlinforeq(fd)
39 int fd;
41 dl_info_req_t info_req;
42 struct strbuf ctl;
43 int flags;
45 info_req.dl_primitive = DL_INFO_REQ;
47 ctl.maxlen = 0;
48 ctl.len = sizeof (info_req);
49 ctl.buf = (char *) &info_req;
51 flags = RS_HIPRI;
53 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
54 syserr("dlinforeq: putmsg");
57 dlinfoack(fd, bufp)
58 int fd;
59 char *bufp;
61 union DL_primitives *dlp;
62 struct strbuf ctl;
63 int flags;
65 ctl.maxlen = MAXDLBUF;
66 ctl.len = 0;
67 ctl.buf = bufp;
69 strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlinfoack");
71 dlp = (union DL_primitives *) ctl.buf;
73 expecting(DL_INFO_ACK, dlp);
75 if (ctl.len < sizeof (dl_info_ack_t))
76 err("dlinfoack: response ctl.len too short: %d", ctl.len);
78 if (flags != RS_HIPRI)
79 err("dlinfoack: DL_INFO_ACK was not M_PCPROTO");
81 if (ctl.len < sizeof (dl_info_ack_t))
82 err("dlinfoack: short response ctl.len: %d", ctl.len);
85 dlattachreq(fd, ppa)
86 int fd;
87 u_long ppa;
89 dl_attach_req_t attach_req;
90 struct strbuf ctl;
91 int flags;
93 attach_req.dl_primitive = DL_ATTACH_REQ;
94 attach_req.dl_ppa = ppa;
96 ctl.maxlen = 0;
97 ctl.len = sizeof (attach_req);
98 ctl.buf = (char *) &attach_req;
100 flags = 0;
102 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
103 syserr("dlattachreq: putmsg");
106 dlenabmultireq(fd, addr, length)
107 int fd;
108 char *addr;
109 int length;
111 long buf[MAXDLBUF];
112 union DL_primitives *dlp;
113 struct strbuf ctl;
114 int flags;
116 dlp = (union DL_primitives*) buf;
118 dlp->enabmulti_req.dl_primitive = DL_ENABMULTI_REQ;
119 dlp->enabmulti_req.dl_addr_length = length;
120 dlp->enabmulti_req.dl_addr_offset = sizeof (dl_enabmulti_req_t);
122 (void) memcpy((char*)OFFADDR(buf, sizeof (dl_enabmulti_req_t)), addr, length);
124 ctl.maxlen = 0;
125 ctl.len = sizeof (dl_enabmulti_req_t) + length;
126 ctl.buf = (char*) buf;
128 flags = 0;
130 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
131 syserr("dlenabmultireq: putmsg");
134 dldisabmultireq(fd, addr, length)
135 int fd;
136 char *addr;
137 int length;
139 long buf[MAXDLBUF];
140 union DL_primitives *dlp;
141 struct strbuf ctl;
142 int flags;
144 dlp = (union DL_primitives*) buf;
146 dlp->disabmulti_req.dl_primitive = DL_ENABMULTI_REQ;
147 dlp->disabmulti_req.dl_addr_length = length;
148 dlp->disabmulti_req.dl_addr_offset = sizeof (dl_disabmulti_req_t);
150 (void) memcpy((char*)OFFADDR(buf, sizeof (dl_disabmulti_req_t)), addr, length);
152 ctl.maxlen = 0;
153 ctl.len = sizeof (dl_disabmulti_req_t) + length;
154 ctl.buf = (char*) buf;
156 flags = 0;
158 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
159 syserr("dldisabmultireq: putmsg");
162 dlpromisconreq(fd, level)
163 int fd;
164 u_long level;
166 dl_promiscon_req_t promiscon_req;
167 struct strbuf ctl;
168 int flags;
170 promiscon_req.dl_primitive = DL_PROMISCON_REQ;
171 promiscon_req.dl_level = level;
173 ctl.maxlen = 0;
174 ctl.len = sizeof (promiscon_req);
175 ctl.buf = (char *) &promiscon_req;
177 flags = 0;
179 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
180 syserr("dlpromiscon: putmsg");
184 dlpromiscoff(fd, level)
185 int fd;
186 u_long level;
188 dl_promiscoff_req_t promiscoff_req;
189 struct strbuf ctl;
190 int flags;
192 promiscoff_req.dl_primitive = DL_PROMISCOFF_REQ;
193 promiscoff_req.dl_level = level;
195 ctl.maxlen = 0;
196 ctl.len = sizeof (promiscoff_req);
197 ctl.buf = (char *) &promiscoff_req;
199 flags = 0;
201 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
202 syserr("dlpromiscoff: putmsg");
205 dlphysaddrreq(fd, addrtype)
206 int fd;
207 u_long addrtype;
209 dl_phys_addr_req_t phys_addr_req;
210 struct strbuf ctl;
211 int flags;
213 phys_addr_req.dl_primitive = DL_PHYS_ADDR_REQ;
214 phys_addr_req.dl_addr_type = addrtype;
216 ctl.maxlen = 0;
217 ctl.len = sizeof (phys_addr_req);
218 ctl.buf = (char *) &phys_addr_req;
220 flags = 0;
222 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
223 syserr("dlphysaddrreq: putmsg");
226 dlsetphysaddrreq(fd, addr, length)
227 int fd;
228 char *addr;
229 int length;
231 long buf[MAXDLBUF];
232 union DL_primitives *dlp;
233 struct strbuf ctl;
234 int flags;
236 dlp = (union DL_primitives*) buf;
238 dlp->set_physaddr_req.dl_primitive = DL_ENABMULTI_REQ;
239 dlp->set_physaddr_req.dl_addr_length = length;
240 dlp->set_physaddr_req.dl_addr_offset = sizeof (dl_set_phys_addr_req_t);
242 (void) memcpy((char*)OFFADDR(buf, sizeof (dl_set_phys_addr_req_t)), addr, length);
244 ctl.maxlen = 0;
245 ctl.len = sizeof (dl_set_phys_addr_req_t) + length;
246 ctl.buf = (char*) buf;
248 flags = 0;
250 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
251 syserr("dlsetphysaddrreq: putmsg");
254 dldetachreq(fd)
255 int fd;
257 dl_detach_req_t detach_req;
258 struct strbuf ctl;
259 int flags;
261 detach_req.dl_primitive = DL_DETACH_REQ;
263 ctl.maxlen = 0;
264 ctl.len = sizeof (detach_req);
265 ctl.buf = (char *) &detach_req;
267 flags = 0;
269 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
270 syserr("dldetachreq: putmsg");
273 dlbindreq(fd, sap, max_conind, service_mode, conn_mgmt, xidtest)
274 int fd;
275 u_long sap;
276 u_long max_conind;
277 u_long service_mode;
278 u_long conn_mgmt;
279 u_long xidtest;
281 dl_bind_req_t bind_req;
282 struct strbuf ctl;
283 int flags;
285 bind_req.dl_primitive = DL_BIND_REQ;
286 bind_req.dl_sap = sap;
287 bind_req.dl_max_conind = max_conind;
288 bind_req.dl_service_mode = service_mode;
289 bind_req.dl_conn_mgmt = conn_mgmt;
290 bind_req.dl_xidtest_flg = xidtest;
292 ctl.maxlen = 0;
293 ctl.len = sizeof (bind_req);
294 ctl.buf = (char *) &bind_req;
296 flags = 0;
298 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
299 syserr("dlbindreq: putmsg");
302 dlunitdatareq(fd, addrp, addrlen, minpri, maxpri, datap, datalen)
303 int fd;
304 u_char *addrp;
305 int addrlen;
306 u_long minpri, maxpri;
307 u_char *datap;
308 int datalen;
310 long buf[MAXDLBUF];
311 union DL_primitives *dlp;
312 struct strbuf data, ctl;
314 dlp = (union DL_primitives*) buf;
316 dlp->unitdata_req.dl_primitive = DL_UNITDATA_REQ;
317 dlp->unitdata_req.dl_dest_addr_length = addrlen;
318 dlp->unitdata_req.dl_dest_addr_offset = sizeof (dl_unitdata_req_t);
319 dlp->unitdata_req.dl_priority.dl_min = minpri;
320 dlp->unitdata_req.dl_priority.dl_max = maxpri;
322 (void) memcpy(OFFADDR(dlp, sizeof (dl_unitdata_req_t)), addrp, addrlen);
324 ctl.maxlen = 0;
325 ctl.len = sizeof (dl_unitdata_req_t) + addrlen;
326 ctl.buf = (char *) buf;
328 data.maxlen = 0;
329 data.len = datalen;
330 data.buf = (char *) datap;
332 if (putmsg(fd, &ctl, &data, 0) < 0)
333 syserr("dlunitdatareq: putmsg");
336 dlunbindreq(fd)
337 int fd;
339 dl_unbind_req_t unbind_req;
340 struct strbuf ctl;
341 int flags;
343 unbind_req.dl_primitive = DL_UNBIND_REQ;
345 ctl.maxlen = 0;
346 ctl.len = sizeof (unbind_req);
347 ctl.buf = (char *) &unbind_req;
349 flags = 0;
351 if (putmsg(fd, &ctl, (struct strbuf*) NULL, flags) < 0)
352 syserr("dlunbindreq: putmsg");
355 dlokack(fd, bufp)
356 int fd;
357 char *bufp;
359 union DL_primitives *dlp;
360 struct strbuf ctl;
361 int flags;
363 ctl.maxlen = MAXDLBUF;
364 ctl.len = 0;
365 ctl.buf = bufp;
367 strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlokack");
369 dlp = (union DL_primitives *) ctl.buf;
371 expecting(DL_OK_ACK, dlp);
373 if (ctl.len < sizeof (dl_ok_ack_t))
374 err("dlokack: response ctl.len too short: %d", ctl.len);
376 if (flags != RS_HIPRI)
377 err("dlokack: DL_OK_ACK was not M_PCPROTO");
379 if (ctl.len < sizeof (dl_ok_ack_t))
380 err("dlokack: short response ctl.len: %d", ctl.len);
383 dlerrorack(fd, bufp)
384 int fd;
385 char *bufp;
387 union DL_primitives *dlp;
388 struct strbuf ctl;
389 int flags;
391 ctl.maxlen = MAXDLBUF;
392 ctl.len = 0;
393 ctl.buf = bufp;
395 strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlerrorack");
397 dlp = (union DL_primitives *) ctl.buf;
399 expecting(DL_ERROR_ACK, dlp);
401 if (ctl.len < sizeof (dl_error_ack_t))
402 err("dlerrorack: response ctl.len too short: %d", ctl.len);
404 if (flags != RS_HIPRI)
405 err("dlerrorack: DL_OK_ACK was not M_PCPROTO");
407 if (ctl.len < sizeof (dl_error_ack_t))
408 err("dlerrorack: short response ctl.len: %d", ctl.len);
411 dlbindack(fd, bufp)
412 int fd;
413 char *bufp;
415 union DL_primitives *dlp;
416 struct strbuf ctl;
417 int flags;
419 ctl.maxlen = MAXDLBUF;
420 ctl.len = 0;
421 ctl.buf = bufp;
423 strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlbindack");
425 dlp = (union DL_primitives *) ctl.buf;
427 expecting(DL_BIND_ACK, dlp);
429 if (flags != RS_HIPRI)
430 err("dlbindack: DL_OK_ACK was not M_PCPROTO");
432 if (ctl.len < sizeof (dl_bind_ack_t))
433 err("dlbindack: short response ctl.len: %d", ctl.len);
436 dlphysaddrack(fd, bufp)
437 int fd;
438 char *bufp;
440 union DL_primitives *dlp;
441 struct strbuf ctl;
442 int flags;
444 ctl.maxlen = MAXDLBUF;
445 ctl.len = 0;
446 ctl.buf = bufp;
448 strgetmsg(fd, &ctl, (struct strbuf*)NULL, &flags, "dlphysaddrack");
450 dlp = (union DL_primitives *) ctl.buf;
452 expecting(DL_PHYS_ADDR_ACK, dlp);
454 if (flags != RS_HIPRI)
455 err("dlbindack: DL_OK_ACK was not M_PCPROTO");
457 if (ctl.len < sizeof (dl_phys_addr_ack_t))
458 err("dlphysaddrack: short response ctl.len: %d", ctl.len);
461 void
462 sigalrm()
464 (void) err("sigalrm: TIMEOUT");
467 strgetmsg(fd, ctlp, datap, flagsp, caller)
468 int fd;
469 struct strbuf *ctlp, *datap;
470 int *flagsp;
471 char *caller;
473 int rc;
474 static char errmsg[80];
477 * Start timer.
479 (void) signal(SIGALRM, sigalrm);
480 if (alarm(MAXWAIT) < 0) {
481 (void) sprintf(errmsg, "%s: alarm", caller);
482 syserr(errmsg);
486 * Set flags argument and issue getmsg().
488 *flagsp = 0;
489 if ((rc = getmsg(fd, ctlp, datap, flagsp)) < 0) {
490 (void) sprintf(errmsg, "%s: getmsg", caller);
491 syserr(errmsg);
495 * Stop timer.
497 if (alarm(0) < 0) {
498 (void) sprintf(errmsg, "%s: alarm", caller);
499 syserr(errmsg);
503 * Check for MOREDATA and/or MORECTL.
505 if ((rc & (MORECTL | MOREDATA)) == (MORECTL | MOREDATA))
506 err("%s: MORECTL|MOREDATA", caller);
507 if (rc & MORECTL)
508 err("%s: MORECTL", caller);
509 if (rc & MOREDATA)
510 err("%s: MOREDATA", caller);
513 * Check for at least sizeof (long) control data portion.
515 if (ctlp->len < sizeof (long))
516 err("getmsg: control portion length < sizeof (long): %d", ctlp->len);
519 expecting(prim, dlp)
520 int prim;
521 union DL_primitives *dlp;
523 if (dlp->dl_primitive != (u_long)prim) {
524 printdlprim(dlp);
525 err("expected %s got %s", dlprim(prim),
526 dlprim(dlp->dl_primitive));
527 exit(1);
532 * Print any DLPI msg in human readable format.
534 printdlprim(dlp)
535 union DL_primitives *dlp;
537 switch (dlp->dl_primitive) {
538 case DL_INFO_REQ:
539 printdlinforeq(dlp);
540 break;
542 case DL_INFO_ACK:
543 printdlinfoack(dlp);
544 break;
546 case DL_ATTACH_REQ:
547 printdlattachreq(dlp);
548 break;
550 case DL_OK_ACK:
551 printdlokack(dlp);
552 break;
554 case DL_ERROR_ACK:
555 printdlerrorack(dlp);
556 break;
558 case DL_DETACH_REQ:
559 printdldetachreq(dlp);
560 break;
562 case DL_BIND_REQ:
563 printdlbindreq(dlp);
564 break;
566 case DL_BIND_ACK:
567 printdlbindack(dlp);
568 break;
570 case DL_UNBIND_REQ:
571 printdlunbindreq(dlp);
572 break;
574 case DL_SUBS_BIND_REQ:
575 printdlsubsbindreq(dlp);
576 break;
578 case DL_SUBS_BIND_ACK:
579 printdlsubsbindack(dlp);
580 break;
582 case DL_SUBS_UNBIND_REQ:
583 printdlsubsunbindreq(dlp);
584 break;
586 case DL_ENABMULTI_REQ:
587 printdlenabmultireq(dlp);
588 break;
590 case DL_DISABMULTI_REQ:
591 printdldisabmultireq(dlp);
592 break;
594 case DL_PROMISCON_REQ:
595 printdlpromisconreq(dlp);
596 break;
598 case DL_PROMISCOFF_REQ:
599 printdlpromiscoffreq(dlp);
600 break;
602 case DL_UNITDATA_REQ:
603 printdlunitdatareq(dlp);
604 break;
606 case DL_UNITDATA_IND:
607 printdlunitdataind(dlp);
608 break;
610 case DL_UDERROR_IND:
611 printdluderrorind(dlp);
612 break;
614 case DL_UDQOS_REQ:
615 printdludqosreq(dlp);
616 break;
618 case DL_PHYS_ADDR_REQ:
619 printdlphysaddrreq(dlp);
620 break;
622 case DL_PHYS_ADDR_ACK:
623 printdlphysaddrack(dlp);
624 break;
626 case DL_SET_PHYS_ADDR_REQ:
627 printdlsetphysaddrreq(dlp);
628 break;
630 default:
631 err("printdlprim: unknown primitive type 0x%x",
632 dlp->dl_primitive);
633 break;
637 /* ARGSUSED */
638 printdlinforeq(dlp)
639 union DL_primitives *dlp;
641 (void) printf("DL_INFO_REQ\n");
644 printdlinfoack(dlp)
645 union DL_primitives *dlp;
647 u_char addr[MAXDLADDR];
648 u_char brdcst[MAXDLADDR];
650 addrtostring(OFFADDR(dlp, dlp->info_ack.dl_addr_offset),
651 dlp->info_ack.dl_addr_length, addr);
652 addrtostring(OFFADDR(dlp, dlp->info_ack.dl_brdcst_addr_offset),
653 dlp->info_ack.dl_brdcst_addr_length, brdcst);
655 (void) printf("DL_INFO_ACK: max_sdu %d min_sdu %d\n",
656 dlp->info_ack.dl_max_sdu,
657 dlp->info_ack.dl_min_sdu);
658 (void) printf("addr_length %d mac_type %s current_state %s\n",
659 dlp->info_ack.dl_addr_length,
660 dlmactype(dlp->info_ack.dl_mac_type),
661 dlstate(dlp->info_ack.dl_current_state));
662 (void) printf("sap_length %d service_mode %s qos_length %d\n",
663 dlp->info_ack.dl_sap_length,
664 dlservicemode(dlp->info_ack.dl_service_mode),
665 dlp->info_ack.dl_qos_length);
666 (void) printf("qos_offset %d qos_range_length %d qos_range_offset %d\n",
667 dlp->info_ack.dl_qos_offset,
668 dlp->info_ack.dl_qos_range_length,
669 dlp->info_ack.dl_qos_range_offset);
670 (void) printf("provider_style %s addr_offset %d version %d\n",
671 dlstyle(dlp->info_ack.dl_provider_style),
672 dlp->info_ack.dl_addr_offset,
673 dlp->info_ack.dl_version);
674 (void) printf("brdcst_addr_length %d brdcst_addr_offset %d\n",
675 dlp->info_ack.dl_brdcst_addr_length,
676 dlp->info_ack.dl_brdcst_addr_offset);
677 (void) printf("addr %s\n", addr);
678 (void) printf("brdcst_addr %s\n", brdcst);
681 printdlattachreq(dlp)
682 union DL_primitives *dlp;
684 (void) printf("DL_ATTACH_REQ: ppa %d\n",
685 dlp->attach_req.dl_ppa);
688 printdlokack(dlp)
689 union DL_primitives *dlp;
691 (void) printf("DL_OK_ACK: correct_primitive %s\n",
692 dlprim(dlp->ok_ack.dl_correct_primitive));
695 printdlerrorack(dlp)
696 union DL_primitives *dlp;
698 (void) printf("DL_ERROR_ACK: error_primitive %s errno %s unix_errno %d\n",
699 dlprim(dlp->error_ack.dl_error_primitive),
700 dlerrno(dlp->error_ack.dl_errno),
701 dlp->error_ack.dl_unix_errno);
704 printdlenabmultireq(dlp)
705 union DL_primitives *dlp;
707 u_char addr[MAXDLADDR];
709 addrtostring(OFFADDR(dlp, dlp->enabmulti_req.dl_addr_offset),
710 dlp->enabmulti_req.dl_addr_length, addr);
712 (void) printf("DL_ENABMULTI_REQ: addr_length %d addr_offset %d\n",
713 dlp->enabmulti_req.dl_addr_length,
714 dlp->enabmulti_req.dl_addr_offset);
715 (void) printf("addr %s\n", addr);
718 printdldisabmultireq(dlp)
719 union DL_primitives *dlp;
721 u_char addr[MAXDLADDR];
723 addrtostring(OFFADDR(dlp, dlp->disabmulti_req.dl_addr_offset),
724 dlp->disabmulti_req.dl_addr_length, addr);
726 (void) printf("DL_DISABMULTI_REQ: addr_length %d addr_offset %d\n",
727 dlp->disabmulti_req.dl_addr_length,
728 dlp->disabmulti_req.dl_addr_offset);
729 (void) printf("addr %s\n", addr);
732 printdlpromisconreq(dlp)
733 union DL_primitives *dlp;
735 (void) printf("DL_PROMISCON_REQ: level %s\n",
736 dlpromisclevel(dlp->promiscon_req.dl_level));
739 printdlpromiscoffreq(dlp)
740 union DL_primitives *dlp;
742 (void) printf("DL_PROMISCOFF_REQ: level %s\n",
743 dlpromisclevel(dlp->promiscoff_req.dl_level));
746 printdlphysaddrreq(dlp)
747 union DL_primitives *dlp;
749 (void) printf("DL_PHYS_ADDR_REQ: addr_type 0x%x\n",
750 dlp->physaddr_req.dl_addr_type);
753 printdlphysaddrack(dlp)
754 union DL_primitives *dlp;
756 u_char addr[MAXDLADDR];
758 addrtostring(OFFADDR(dlp, dlp->physaddr_ack.dl_addr_offset),
759 dlp->physaddr_ack.dl_addr_length, addr);
761 (void) printf("DL_PHYS_ADDR_ACK: addr_length %d addr_offset %d\n",
762 dlp->physaddr_ack.dl_addr_length,
763 dlp->physaddr_ack.dl_addr_offset);
764 (void) printf("addr %s\n", addr);
767 printdlsetphysaddrreq(dlp)
768 union DL_primitives *dlp;
770 u_char addr[MAXDLADDR];
772 addrtostring(OFFADDR(dlp, dlp->set_physaddr_req.dl_addr_offset),
773 dlp->set_physaddr_req.dl_addr_length, addr);
775 (void) printf("DL_SET_PHYS_ADDR_REQ: addr_length %d addr_offset %d\n",
776 dlp->set_physaddr_req.dl_addr_length,
777 dlp->set_physaddr_req.dl_addr_offset);
778 (void) printf("addr %s\n", addr);
781 /* ARGSUSED */
782 printdldetachreq(dlp)
783 union DL_primitives *dlp;
785 (void) printf("DL_DETACH_REQ\n");
788 printdlbindreq(dlp)
789 union DL_primitives *dlp;
791 (void) printf("DL_BIND_REQ: sap %d max_conind %d\n",
792 dlp->bind_req.dl_sap,
793 dlp->bind_req.dl_max_conind);
794 (void) printf("service_mode %s conn_mgmt %d xidtest_flg 0x%x\n",
795 dlservicemode(dlp->bind_req.dl_service_mode),
796 dlp->bind_req.dl_conn_mgmt,
797 dlp->bind_req.dl_xidtest_flg);
800 printdlbindack(dlp)
801 union DL_primitives *dlp;
803 u_char addr[MAXDLADDR];
805 addrtostring(OFFADDR(dlp, dlp->bind_ack.dl_addr_offset),
806 dlp->bind_ack.dl_addr_length, addr);
808 (void) printf("DL_BIND_ACK: sap %d addr_length %d addr_offset %d\n",
809 dlp->bind_ack.dl_sap,
810 dlp->bind_ack.dl_addr_length,
811 dlp->bind_ack.dl_addr_offset);
812 (void) printf("max_conind %d xidtest_flg 0x%x\n",
813 dlp->bind_ack.dl_max_conind,
814 dlp->bind_ack.dl_xidtest_flg);
815 (void) printf("addr %s\n", addr);
818 /* ARGSUSED */
819 printdlunbindreq(dlp)
820 union DL_primitives *dlp;
822 (void) printf("DL_UNBIND_REQ\n");
825 printdlsubsbindreq(dlp)
826 union DL_primitives *dlp;
828 u_char sap[MAXDLADDR];
830 addrtostring(OFFADDR(dlp, dlp->subs_bind_req.dl_subs_sap_offset),
831 dlp->subs_bind_req.dl_subs_sap_length, sap);
833 (void) printf("DL_SUBS_BIND_REQ: subs_sap_offset %d sub_sap_len %d\n",
834 dlp->subs_bind_req.dl_subs_sap_offset,
835 dlp->subs_bind_req.dl_subs_sap_length);
836 (void) printf("sap %s\n", sap);
839 printdlsubsbindack(dlp)
840 union DL_primitives *dlp;
842 u_char sap[MAXDLADDR];
844 addrtostring(OFFADDR(dlp, dlp->subs_bind_ack.dl_subs_sap_offset),
845 dlp->subs_bind_ack.dl_subs_sap_length, sap);
847 (void) printf("DL_SUBS_BIND_ACK: subs_sap_offset %d sub_sap_length %d\n",
848 dlp->subs_bind_ack.dl_subs_sap_offset,
849 dlp->subs_bind_ack.dl_subs_sap_length);
850 (void) printf("sap %s\n", sap);
853 printdlsubsunbindreq(dlp)
854 union DL_primitives *dlp;
856 u_char sap[MAXDLADDR];
858 addrtostring(OFFADDR(dlp, dlp->subs_unbind_req.dl_subs_sap_offset),
859 dlp->subs_unbind_req.dl_subs_sap_length, sap);
861 (void) printf("DL_SUBS_UNBIND_REQ: subs_sap_offset %d sub_sap_length %d\n",
862 dlp->subs_unbind_req.dl_subs_sap_offset,
863 dlp->subs_unbind_req.dl_subs_sap_length);
864 (void) printf("sap %s\n", sap);
867 printdlunitdatareq(dlp)
868 union DL_primitives *dlp;
870 u_char addr[MAXDLADDR];
872 addrtostring(OFFADDR(dlp, dlp->unitdata_req.dl_dest_addr_offset),
873 dlp->unitdata_req.dl_dest_addr_length, addr);
875 (void) printf("DL_UNITDATA_REQ: dest_addr_length %d dest_addr_offset %d\n",
876 dlp->unitdata_req.dl_dest_addr_length,
877 dlp->unitdata_req.dl_dest_addr_offset);
878 (void) printf("dl_priority.min %d dl_priority.max %d\n",
879 dlp->unitdata_req.dl_priority.dl_min,
880 dlp->unitdata_req.dl_priority.dl_max);
881 (void) printf("addr %s\n", addr);
884 printdlunitdataind(dlp)
885 union DL_primitives *dlp;
887 u_char dest[MAXDLADDR];
888 u_char src[MAXDLADDR];
890 addrtostring(OFFADDR(dlp, dlp->unitdata_ind.dl_dest_addr_offset),
891 dlp->unitdata_ind.dl_dest_addr_length, dest);
892 addrtostring(OFFADDR(dlp, dlp->unitdata_ind.dl_src_addr_offset),
893 dlp->unitdata_ind.dl_src_addr_length, src);
895 (void) printf("DL_UNITDATA_IND: dest_addr_length %d dest_addr_offset %d\n",
896 dlp->unitdata_ind.dl_dest_addr_length,
897 dlp->unitdata_ind.dl_dest_addr_offset);
898 (void) printf("src_addr_length %d src_addr_offset %d\n",
899 dlp->unitdata_ind.dl_src_addr_length,
900 dlp->unitdata_ind.dl_src_addr_offset);
901 (void) printf("group_address 0x%x\n",
902 dlp->unitdata_ind.dl_group_address);
903 (void) printf("dest %s\n", dest);
904 (void) printf("src %s\n", src);
907 printdluderrorind(dlp)
908 union DL_primitives *dlp;
910 u_char addr[MAXDLADDR];
912 addrtostring(OFFADDR(dlp, dlp->uderror_ind.dl_dest_addr_offset),
913 dlp->uderror_ind.dl_dest_addr_length, addr);
915 (void) printf("DL_UDERROR_IND: dest_addr_length %d dest_addr_offset %d\n",
916 dlp->uderror_ind.dl_dest_addr_length,
917 dlp->uderror_ind.dl_dest_addr_offset);
918 (void) printf("unix_errno %d errno %s\n",
919 dlp->uderror_ind.dl_unix_errno,
920 dlerrno(dlp->uderror_ind.dl_errno));
921 (void) printf("addr %s\n", addr);
924 printdltestreq(dlp)
925 union DL_primitives *dlp;
927 u_char addr[MAXDLADDR];
929 addrtostring(OFFADDR(dlp, dlp->test_req.dl_dest_addr_offset),
930 dlp->test_req.dl_dest_addr_length, addr);
932 (void) printf("DL_TEST_REQ: flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
933 dlp->test_req.dl_flag,
934 dlp->test_req.dl_dest_addr_length,
935 dlp->test_req.dl_dest_addr_offset);
936 (void) printf("dest_addr %s\n", addr);
939 printdltestind(dlp)
940 union DL_primitives *dlp;
942 u_char dest[MAXDLADDR];
943 u_char src[MAXDLADDR];
945 addrtostring(OFFADDR(dlp, dlp->test_ind.dl_dest_addr_offset),
946 dlp->test_ind.dl_dest_addr_length, dest);
947 addrtostring(OFFADDR(dlp, dlp->test_ind.dl_src_addr_offset),
948 dlp->test_ind.dl_src_addr_length, src);
950 (void) printf("DL_TEST_IND: flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
951 dlp->test_ind.dl_flag,
952 dlp->test_ind.dl_dest_addr_length,
953 dlp->test_ind.dl_dest_addr_offset);
954 (void) printf("src_addr_length %d src_addr_offset %d\n",
955 dlp->test_ind.dl_src_addr_length,
956 dlp->test_ind.dl_src_addr_offset);
957 (void) printf("dest_addr %s\n", dest);
958 (void) printf("src_addr %s\n", src);
961 printdltestres(dlp)
962 union DL_primitives *dlp;
964 u_char dest[MAXDLADDR];
966 addrtostring(OFFADDR(dlp, dlp->test_res.dl_dest_addr_offset),
967 dlp->test_res.dl_dest_addr_length, dest);
969 (void) printf("DL_TEST_RES: flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
970 dlp->test_res.dl_flag,
971 dlp->test_res.dl_dest_addr_length,
972 dlp->test_res.dl_dest_addr_offset);
973 (void) printf("dest_addr %s\n", dest);
976 printdltestcon(dlp)
977 union DL_primitives *dlp;
979 u_char dest[MAXDLADDR];
980 u_char src[MAXDLADDR];
982 addrtostring(OFFADDR(dlp, dlp->test_con.dl_dest_addr_offset),
983 dlp->test_con.dl_dest_addr_length, dest);
984 addrtostring(OFFADDR(dlp, dlp->test_con.dl_src_addr_offset),
985 dlp->test_con.dl_src_addr_length, src);
987 (void) printf("DL_TEST_CON: flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
988 dlp->test_con.dl_flag,
989 dlp->test_con.dl_dest_addr_length,
990 dlp->test_con.dl_dest_addr_offset);
991 (void) printf("src_addr_length %d src_addr_offset %d\n",
992 dlp->test_con.dl_src_addr_length,
993 dlp->test_con.dl_src_addr_offset);
994 (void) printf("dest_addr %s\n", dest);
995 (void) printf("src_addr %s\n", src);
998 printdlxidreq(dlp)
999 union DL_primitives *dlp;
1001 u_char dest[MAXDLADDR];
1003 addrtostring(OFFADDR(dlp, dlp->xid_req.dl_dest_addr_offset),
1004 dlp->xid_req.dl_dest_addr_length, dest);
1006 (void) printf("DL_XID_REQ: flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
1007 dlp->xid_req.dl_flag,
1008 dlp->xid_req.dl_dest_addr_length,
1009 dlp->xid_req.dl_dest_addr_offset);
1010 (void) printf("dest_addr %s\n", dest);
1013 printdlxidind(dlp)
1014 union DL_primitives *dlp;
1016 u_char dest[MAXDLADDR];
1017 u_char src[MAXDLADDR];
1019 addrtostring(OFFADDR(dlp, dlp->xid_ind.dl_dest_addr_offset),
1020 dlp->xid_ind.dl_dest_addr_length, dest);
1021 addrtostring(OFFADDR(dlp, dlp->xid_ind.dl_src_addr_offset),
1022 dlp->xid_ind.dl_src_addr_length, src);
1024 (void) printf("DL_XID_IND: flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
1025 dlp->xid_ind.dl_flag,
1026 dlp->xid_ind.dl_dest_addr_length,
1027 dlp->xid_ind.dl_dest_addr_offset);
1028 (void) printf("src_addr_length %d src_addr_offset %d\n",
1029 dlp->xid_ind.dl_src_addr_length,
1030 dlp->xid_ind.dl_src_addr_offset);
1031 (void) printf("dest_addr %s\n", dest);
1032 (void) printf("src_addr %s\n", src);
1035 printdlxidres(dlp)
1036 union DL_primitives *dlp;
1038 u_char dest[MAXDLADDR];
1040 addrtostring(OFFADDR(dlp, dlp->xid_res.dl_dest_addr_offset),
1041 dlp->xid_res.dl_dest_addr_length, dest);
1043 (void) printf("DL_XID_RES: flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
1044 dlp->xid_res.dl_flag,
1045 dlp->xid_res.dl_dest_addr_length,
1046 dlp->xid_res.dl_dest_addr_offset);
1047 (void) printf("dest_addr %s\n", dest);
1050 printdlxidcon(dlp)
1051 union DL_primitives *dlp;
1053 u_char dest[MAXDLADDR];
1054 u_char src[MAXDLADDR];
1056 addrtostring(OFFADDR(dlp, dlp->xid_con.dl_dest_addr_offset),
1057 dlp->xid_con.dl_dest_addr_length, dest);
1058 addrtostring(OFFADDR(dlp, dlp->xid_con.dl_src_addr_offset),
1059 dlp->xid_con.dl_src_addr_length, src);
1061 (void) printf("DL_XID_CON: flag 0x%x dest_addr_length %d dest_addr_offset %d\n",
1062 dlp->xid_con.dl_flag,
1063 dlp->xid_con.dl_dest_addr_length,
1064 dlp->xid_con.dl_dest_addr_offset);
1065 (void) printf("src_addr_length %d src_addr_offset %d\n",
1066 dlp->xid_con.dl_src_addr_length,
1067 dlp->xid_con.dl_src_addr_offset);
1068 (void) printf("dest_addr %s\n", dest);
1069 (void) printf("src_addr %s\n", src);
1072 printdludqosreq(dlp)
1073 union DL_primitives *dlp;
1075 (void) printf("DL_UDQOS_REQ: qos_length %d qos_offset %d\n",
1076 dlp->udqos_req.dl_qos_length,
1077 dlp->udqos_req.dl_qos_offset);
1081 * Return string.
1083 addrtostring(addr, length, s)
1084 u_char *addr;
1085 u_long length;
1086 u_char *s;
1088 int i;
1090 for (i = 0; i < length; i++) {
1091 (void) sprintf((char*) s, "%x:", addr[i] & 0xff);
1092 s = s + strlen((char*)s);
1094 if (length)
1095 *(--s) = '\0';
1099 * Return length
1101 stringtoaddr(sp, addr)
1102 char *sp;
1103 char *addr;
1105 int n = 0;
1106 char *p;
1107 int val;
1109 p = sp;
1110 while (p = strtok(p, ":")) {
1111 if (sscanf(p, "%x", &val) != 1)
1112 err("stringtoaddr: invalid input string: %s", sp);
1113 if (val > 0xff)
1114 err("stringtoaddr: invalid input string: %s", sp);
1115 *addr++ = val;
1116 n++;
1117 p = NULL;
1120 return (n);
1124 static char
1125 hexnibble(c)
1126 char c;
1128 static char hextab[] = {
1129 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
1130 'a', 'b', 'c', 'd', 'e', 'f'
1133 return (hextab[c & 0x0f]);
1136 char*
1137 dlprim(prim)
1138 u_long prim;
1140 static char primbuf[80];
1142 switch ((int)prim) {
1143 CASERET(DL_INFO_REQ);
1144 CASERET(DL_INFO_ACK);
1145 CASERET(DL_ATTACH_REQ);
1146 CASERET(DL_DETACH_REQ);
1147 CASERET(DL_BIND_REQ);
1148 CASERET(DL_BIND_ACK);
1149 CASERET(DL_UNBIND_REQ);
1150 CASERET(DL_OK_ACK);
1151 CASERET(DL_ERROR_ACK);
1152 CASERET(DL_SUBS_BIND_REQ);
1153 CASERET(DL_SUBS_BIND_ACK);
1154 CASERET(DL_UNITDATA_REQ);
1155 CASERET(DL_UNITDATA_IND);
1156 CASERET(DL_UDERROR_IND);
1157 CASERET(DL_UDQOS_REQ);
1158 CASERET(DL_CONNECT_REQ);
1159 CASERET(DL_CONNECT_IND);
1160 CASERET(DL_CONNECT_RES);
1161 CASERET(DL_CONNECT_CON);
1162 CASERET(DL_TOKEN_REQ);
1163 CASERET(DL_TOKEN_ACK);
1164 CASERET(DL_DISCONNECT_REQ);
1165 CASERET(DL_DISCONNECT_IND);
1166 CASERET(DL_RESET_REQ);
1167 CASERET(DL_RESET_IND);
1168 CASERET(DL_RESET_RES);
1169 CASERET(DL_RESET_CON);
1170 default:
1171 (void) sprintf(primbuf, "unknown primitive 0x%x", prim);
1172 return (primbuf);
1177 char*
1178 dlstate(state)
1179 u_long state;
1181 static char statebuf[80];
1183 switch (state) {
1184 CASERET(DL_UNATTACHED);
1185 CASERET(DL_ATTACH_PENDING);
1186 CASERET(DL_DETACH_PENDING);
1187 CASERET(DL_UNBOUND);
1188 CASERET(DL_BIND_PENDING);
1189 CASERET(DL_UNBIND_PENDING);
1190 CASERET(DL_IDLE);
1191 CASERET(DL_UDQOS_PENDING);
1192 CASERET(DL_OUTCON_PENDING);
1193 CASERET(DL_INCON_PENDING);
1194 CASERET(DL_CONN_RES_PENDING);
1195 CASERET(DL_DATAXFER);
1196 CASERET(DL_USER_RESET_PENDING);
1197 CASERET(DL_PROV_RESET_PENDING);
1198 CASERET(DL_RESET_RES_PENDING);
1199 CASERET(DL_DISCON8_PENDING);
1200 CASERET(DL_DISCON9_PENDING);
1201 CASERET(DL_DISCON11_PENDING);
1202 CASERET(DL_DISCON12_PENDING);
1203 CASERET(DL_DISCON13_PENDING);
1204 CASERET(DL_SUBS_BIND_PND);
1205 default:
1206 (void) sprintf(statebuf, "unknown state 0x%x", state);
1207 return (statebuf);
1211 char*
1212 dlerrno(errno)
1213 u_long errno;
1215 static char errnobuf[80];
1217 switch (errno) {
1218 CASERET(DL_ACCESS);
1219 CASERET(DL_BADADDR);
1220 CASERET(DL_BADCORR);
1221 CASERET(DL_BADDATA);
1222 CASERET(DL_BADPPA);
1223 CASERET(DL_BADPRIM);
1224 CASERET(DL_BADQOSPARAM);
1225 CASERET(DL_BADQOSTYPE);
1226 CASERET(DL_BADSAP);
1227 CASERET(DL_BADTOKEN);
1228 CASERET(DL_BOUND);
1229 CASERET(DL_INITFAILED);
1230 CASERET(DL_NOADDR);
1231 CASERET(DL_NOTINIT);
1232 CASERET(DL_OUTSTATE);
1233 CASERET(DL_SYSERR);
1234 CASERET(DL_UNSUPPORTED);
1235 CASERET(DL_UNDELIVERABLE);
1236 CASERET(DL_NOTSUPPORTED);
1237 CASERET(DL_TOOMANY);
1238 CASERET(DL_NOTENAB);
1239 CASERET(DL_BUSY);
1240 CASERET(DL_NOAUTO);
1241 CASERET(DL_NOXIDAUTO);
1242 CASERET(DL_NOTESTAUTO);
1243 CASERET(DL_XIDAUTO);
1244 CASERET(DL_TESTAUTO);
1245 CASERET(DL_PENDING);
1247 default:
1248 (void) sprintf(errnobuf, "unknown dlpi errno 0x%x", errno);
1249 return (errnobuf);
1253 char*
1254 dlpromisclevel(level)
1255 u_long level;
1257 static char levelbuf[80];
1259 switch (level) {
1260 CASERET(DL_PROMISC_PHYS);
1261 CASERET(DL_PROMISC_SAP);
1262 CASERET(DL_PROMISC_MULTI);
1263 default:
1264 (void) sprintf(levelbuf, "unknown promisc level 0x%x", level);
1265 return (levelbuf);
1269 char*
1270 dlservicemode(servicemode)
1271 u_long servicemode;
1273 static char servicemodebuf[80];
1275 switch (servicemode) {
1276 CASERET(DL_CODLS);
1277 CASERET(DL_CLDLS);
1278 CASERET(DL_CODLS|DL_CLDLS);
1279 default:
1280 (void) sprintf(servicemodebuf,
1281 "unknown provider service mode 0x%x", servicemode);
1282 return (servicemodebuf);
1286 char*
1287 dlstyle(style)
1288 long style;
1290 static char stylebuf[80];
1292 switch (style) {
1293 CASERET(DL_STYLE1);
1294 CASERET(DL_STYLE2);
1295 default:
1296 (void) sprintf(stylebuf, "unknown provider style 0x%x", style);
1297 return (stylebuf);
1301 char*
1302 dlmactype(media)
1303 u_long media;
1305 static char mediabuf[80];
1307 switch (media) {
1308 CASERET(DL_CSMACD);
1309 CASERET(DL_TPB);
1310 CASERET(DL_TPR);
1311 CASERET(DL_METRO);
1312 CASERET(DL_ETHER);
1313 CASERET(DL_HDLC);
1314 CASERET(DL_CHAR);
1315 CASERET(DL_CTCA);
1316 default:
1317 (void) sprintf(mediabuf, "unknown media type 0x%x", media);
1318 return (mediabuf);
1322 /*VARARGS1*/
1323 err(fmt, a1, a2, a3, a4)
1324 char *fmt;
1325 char *a1, *a2, *a3, *a4;
1327 (void) fprintf(stderr, fmt, a1, a2, a3, a4);
1328 (void) fprintf(stderr, "\n");
1329 (void) exit(1);
1332 syserr(s)
1333 char *s;
1335 (void) perror(s);
1336 exit(1);
1339 strioctl(fd, cmd, timout, len, dp)
1340 int fd;
1341 int cmd;
1342 int timout;
1343 int len;
1344 char *dp;
1346 struct strioctl sioc;
1347 int rc;
1349 sioc.ic_cmd = cmd;
1350 sioc.ic_timout = timout;
1351 sioc.ic_len = len;
1352 sioc.ic_dp = dp;
1353 rc = ioctl(fd, I_STR, &sioc);
1355 if (rc < 0)
1356 return (rc);
1357 else
1358 return (sioc.ic_len);