gcc41: update README.DELETED
[dragonfly.git] / usr.sbin / i4b / isdndebug / main.c
blob19a0c354a877e537fbbb6f0c13ae676606fad27c
1 /*
2 * Copyright (c) 1997, 2001 Hellmuth Michaelis. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
25 *---------------------------------------------------------------------------
27 * main.c - i4b set debug options
28 * ------------------------------
30 * $FreeBSD: src/usr.sbin/i4b/isdndebug/main.c,v 1.8.2.1 2001/08/01 17:45:04 obrien Exp $
31 * $DragonFly: src/usr.sbin/i4b/isdndebug/main.c,v 1.3 2003/08/08 04:18:45 dillon Exp $
33 * last edit-date: [Mon May 21 10:09:23 2001]
35 *---------------------------------------------------------------------------*/
37 #include <stdio.h>
38 #include <signal.h>
39 #include <errno.h>
40 #include <string.h>
41 #include <stdlib.h>
42 #include <unistd.h>
43 #include <fcntl.h>
44 #include <ctype.h>
45 #include <sys/stat.h>
46 #include <sys/wait.h>
47 #include <sys/ioctl.h>
48 #include <sys/types.h>
49 #include <sys/time.h>
51 #include <i4b_machine/i4b_debug.h>
52 #include <i4b_machine/i4b_ioctl.h>
54 char *bin_str(unsigned long val, int length);
56 static void usage ( void );
57 void printl1(unsigned long val);
58 void printl2(unsigned long val);
59 void printl3(unsigned long val);
60 void printl4(unsigned long val);
62 static int isdnfd;
64 #define I4BCTLDEVICE "/dev/i4bctl"
66 int opt_get = 0;
67 int opt_layer = -1;
68 int opt_set = 0;
69 int opt_setval;
70 int opt_reset = 0;
71 int opt_max = 0;
72 int opt_err = 0;
73 int opt_zero = 0;
74 int opt_unit = 0;
75 int opt_lapd = 0;
76 int opt_rlapd = 0;
77 int opt_chipstat = 0;
79 /*---------------------------------------------------------------------------*
80 * usage display and exit
81 *---------------------------------------------------------------------------*/
82 static void
83 usage(void)
85 fprintf(stderr, "\n");
86 fprintf(stderr, "isdndebug - i4b set debug level, version %d.%d.%d, compiled %s %s\n", VERSION, REL, STEP, __DATE__, __TIME__);
87 fprintf(stderr, "usage: isdndebug -c -e -g -l <layer> -m -q -r -s <value> -u <unit> -z -C -Q\n");
88 fprintf(stderr, " -c get chipset statistics\n");
89 fprintf(stderr, " -e set error only debugging output\n");
90 fprintf(stderr, " -g get current debugging values\n");
91 fprintf(stderr, " -l layer specify layer (1...4)\n");
92 fprintf(stderr, " -m set maximum debugging output\n");
93 fprintf(stderr, " -q get Q.921 statistics\n");
94 fprintf(stderr, " -r reset values(s) to compiled in default\n");
95 fprintf(stderr, " -s value set new debugging value for layer\n");
96 fprintf(stderr, " -u unit unit number for -c, -q, -C and -Q commands\n");
97 fprintf(stderr, " -z set zero (=no) debugging output\n");
98 fprintf(stderr, " -C reset chipset statistics\n");
99 fprintf(stderr, " -Q reset Q.921 statistics\n");
100 fprintf(stderr, "\n");
101 exit(1);
104 /*---------------------------------------------------------------------------*
105 * program entry
106 *---------------------------------------------------------------------------*/
108 main(int argc, char **argv)
110 int c;
111 ctl_debug_t cdbg;
112 int ret;
114 while ((c = getopt(argc, argv, "ceghl:mqrs:u:zCHQ")) != -1)
116 switch(c)
118 case 'c':
119 opt_chipstat = 1;
120 break;
122 case 'e':
123 opt_err = 1;
124 break;
126 case 'g':
127 opt_get = 1;
128 break;
130 case 'q':
131 opt_lapd = 1;
132 break;
134 case 'r':
135 opt_reset = 1;
136 break;
138 case 'm':
139 opt_max = 1;
140 break;
142 case 'l':
143 opt_layer = atoi(optarg);
144 if(opt_layer < 1 || opt_layer > 4)
145 usage();
146 break;
148 case 's':
149 if((sscanf(optarg, "%i", &opt_setval)) != 1)
150 usage();
151 opt_set = 1;
152 break;
154 case 'u':
155 opt_unit = atoi(optarg);
156 if(opt_unit < 0 || opt_unit > 9)
157 usage();
158 break;
160 case 'z':
161 opt_zero = 1;
162 break;
164 case 'Q':
165 opt_rlapd = 1;
166 break;
168 case '?':
169 default:
170 usage();
171 break;
175 if(opt_get == 0 && opt_set == 0 && opt_reset == 0 && opt_max == 0 &&
176 opt_err == 0 && opt_zero == 0 && opt_lapd == 0 && opt_rlapd == 0 &&
177 opt_chipstat == 0)
179 usage();
182 if((opt_get + opt_set + opt_reset + opt_max + opt_err + opt_zero +
183 opt_lapd + opt_rlapd + opt_chipstat) > 1)
185 usage();
188 if((isdnfd = open(I4BCTLDEVICE, O_RDWR)) < 0)
190 fprintf(stderr, "i4bctl: cannot open %s: %s\n", I4BCTLDEVICE, strerror(errno));
191 exit(1);
194 if(opt_chipstat)
196 struct chipstat cst;
197 u_char *name;
199 cst.driver_unit = opt_unit;
200 cst.driver_bchannel = 0;
202 if((ret = ioctl(isdnfd, I4B_CTL_GET_CHIPSTAT, &cst)) < 0)
204 fprintf(stderr, "ioctl I4B_CTL_GET_CHIPSTAT failed: %s", strerror(errno));
205 exit(1);
208 switch(cst.driver_type)
210 case L1DRVR_ISIC:
211 name = "isic";
212 printf("\nisic-driver\nHSCX events: VFR RDO CRC RAB XDU RFO\n");
214 printf("unit %d chan %d: %6d %6d %6d %6d %6d %6d\n",
215 cst.stats.hscxstat.unit,
216 cst.stats.hscxstat.chan,
217 cst.stats.hscxstat.vfr,
218 cst.stats.hscxstat.rdo,
219 cst.stats.hscxstat.crc,
220 cst.stats.hscxstat.rab,
221 cst.stats.hscxstat.xdu,
222 cst.stats.hscxstat.rfo);
224 cst.driver_unit = opt_unit;
225 cst.driver_bchannel = 1;
227 if((ret = ioctl(isdnfd, I4B_CTL_GET_CHIPSTAT, &cst)) < 0)
229 fprintf(stderr, "ioctl I4B_CTL_GET_CHIPSTAT failed: %s", strerror(errno));
230 exit(1);
233 printf("HSCX events: VFR RDO CRC RAB XDU RFO\n");
235 printf("unit %d chan %d: %6d %6d %6d %6d %6d %6d\n",
236 cst.stats.hscxstat.unit,
237 cst.stats.hscxstat.chan,
238 cst.stats.hscxstat.vfr,
239 cst.stats.hscxstat.rdo,
240 cst.stats.hscxstat.crc,
241 cst.stats.hscxstat.rab,
242 cst.stats.hscxstat.xdu,
243 cst.stats.hscxstat.rfo);
245 break;
247 case L1DRVR_IWIC:
248 name = "iwic";
249 break;
251 case L1DRVR_IFPI:
252 name = "ifpi";
253 break;
255 case L1DRVR_IHFC:
256 name = "ihfc";
257 break;
259 case L1DRVR_IFPNP:
260 name = "ifpnp";
261 break;
263 default:
264 fprintf(stderr, "ioctl I4B_CTL_GET_CHIPSTAT, unknown driver %d\n",cst.driver_type);
265 exit(1);
266 break;
268 exit(0);
271 if(opt_lapd)
273 l2stat_t l2s;
275 l2s.unit = opt_unit;
277 if((ret = ioctl(isdnfd, I4B_CTL_GET_LAPDSTAT, &l2s)) < 0)
279 fprintf(stderr, "ioctl I4B_CTL_GET_LAPDSTAT failed: %s", strerror(errno));
280 exit(1);
283 printf("unit %d Q.921 statistics: receive transmit\n", opt_unit);
284 printf("---------------------------------------------\n");
285 printf("# of I-frames %12lu %12lu\n", l2s.lapdstat.rx_i, l2s.lapdstat.tx_i);
286 printf("# of RR-frames %12lu %12lu\n", l2s.lapdstat.rx_rr, l2s.lapdstat.tx_rr);
287 printf("# of RNR-frames %12lu %12lu\n", l2s.lapdstat.rx_rnr, l2s.lapdstat.tx_rnr);
288 printf("# of REJ-frames %12lu %12lu\n", l2s.lapdstat.rx_rej, l2s.lapdstat.tx_rej);
289 printf("# of SABME-frames %12lu %12lu\n", l2s.lapdstat.rx_sabme, l2s.lapdstat.tx_sabme);
290 printf("# of DM-frames %12lu %12lu\n", l2s.lapdstat.rx_dm, l2s.lapdstat.tx_dm);
291 printf("# of DISC-frames %12lu %12lu\n", l2s.lapdstat.rx_disc, l2s.lapdstat.tx_disc);
292 printf("# of UA-frames %12lu %12lu\n", l2s.lapdstat.rx_ua, l2s.lapdstat.tx_ua);
293 printf("# of FRMR-frames %12lu %12lu\n", l2s.lapdstat.rx_frmr, l2s.lapdstat.tx_frmr);
294 printf("# of TEI-frames %12lu %12lu\n", l2s.lapdstat.rx_tei, l2s.lapdstat.tx_tei);
295 printf("# of UI-frames %12lu \n", l2s.lapdstat.rx_ui);
296 printf("# of XID-frames %12lu \n", l2s.lapdstat.rx_xid);
297 printf(" errors\n");
298 printf("---------------------------------------------\n");
299 printf("# of frames with incorrect length%12lu\n", l2s.lapdstat.err_rx_len);
300 printf("# of frames with bad frame type %12lu\n", l2s.lapdstat.err_rx_badf);
301 printf("# of bad S frames %12lu\n", l2s.lapdstat.err_rx_bads);
302 printf("# of bad U frames %12lu\n", l2s.lapdstat.err_rx_badu);
303 printf("# of bad UI frames %12lu\n", l2s.lapdstat.err_rx_badui);
305 exit(0);
308 if(opt_rlapd)
310 int unit;
312 unit = opt_unit;
314 if((ret = ioctl(isdnfd, I4B_CTL_CLR_LAPDSTAT, &unit)) < 0)
316 fprintf(stderr, "ioctl I4B_CTL_CLR_LAPDSTAT failed: %s", strerror(errno));
317 exit(1);
320 printf("Q.921 statistics counters unit %d reset to zero!\n", unit);
321 exit(0);
324 if((ret = ioctl(isdnfd, I4B_CTL_GET_DEBUG, &cdbg)) < 0)
326 fprintf(stderr, "ioctl I4B_CTL_GET_DEBUG failed: %s", strerror(errno));
327 exit(1);
330 if(opt_get)
332 switch(opt_layer)
334 case -1:
335 printl1(cdbg.l1);
336 printl2(cdbg.l2);
337 printl3(cdbg.l3);
338 printl4(cdbg.l4);
339 break;
341 case 1:
342 printl1(cdbg.l1);
343 break;
345 case 2:
346 printl2(cdbg.l2);
347 break;
349 case 3:
350 printl3(cdbg.l3);
351 break;
353 case 4:
354 printl4(cdbg.l4);
355 break;
357 printf("\n");
358 return(0);
360 else if(opt_set)
362 switch(opt_layer)
364 case -1:
365 usage();
366 break;
368 case 1:
369 cdbg.l1 = opt_setval;
370 break;
372 case 2:
373 cdbg.l2 = opt_setval;
374 break;
376 case 3:
377 cdbg.l3 = opt_setval;
378 break;
380 case 4:
381 cdbg.l4 = opt_setval;
382 break;
385 else if(opt_reset)
387 switch(opt_layer)
389 case -1:
390 cdbg.l1 = L1_DEBUG_DEFAULT;
391 cdbg.l2 = L2_DEBUG_DEFAULT;
392 cdbg.l3 = L3_DEBUG_DEFAULT;
393 cdbg.l4 = L4_DEBUG_DEFAULT;
394 break;
396 case 1:
397 cdbg.l1 = L1_DEBUG_DEFAULT;
398 break;
400 case 2:
401 cdbg.l2 = L2_DEBUG_DEFAULT;
402 break;
404 case 3:
405 cdbg.l3 = L3_DEBUG_DEFAULT;
406 break;
408 case 4:
409 cdbg.l4 = L4_DEBUG_DEFAULT;
410 break;
413 else if(opt_max)
415 switch(opt_layer)
417 case -1:
418 cdbg.l1 = L1_DEBUG_MAX;
419 cdbg.l2 = L2_DEBUG_MAX;
420 cdbg.l3 = L3_DEBUG_MAX;
421 cdbg.l4 = L4_DEBUG_MAX;
422 break;
424 case 1:
425 cdbg.l1 = L1_DEBUG_MAX;
426 break;
428 case 2:
429 cdbg.l2 = L2_DEBUG_MAX;
430 break;
432 case 3:
433 cdbg.l3 = L3_DEBUG_MAX;
434 break;
436 case 4:
437 cdbg.l4 = L4_DEBUG_MAX;
438 break;
441 else if(opt_err)
443 switch(opt_layer)
445 case -1:
446 cdbg.l1 = L1_DEBUG_ERR;
447 cdbg.l2 = L2_DEBUG_ERR;
448 cdbg.l3 = L3_DEBUG_ERR;
449 cdbg.l4 = L4_DEBUG_ERR;
450 break;
452 case 1:
453 cdbg.l1 = L1_DEBUG_ERR;
454 break;
456 case 2:
457 cdbg.l2 = L2_DEBUG_ERR;
458 break;
460 case 3:
461 cdbg.l3 = L3_DEBUG_ERR;
462 break;
464 case 4:
465 cdbg.l4 = L4_DEBUG_ERR;
466 break;
469 else if(opt_zero)
471 switch(opt_layer)
473 case -1:
474 cdbg.l1 = 0;
475 cdbg.l2 = 0;
476 cdbg.l3 = 0;
477 cdbg.l4 = 0;
478 break;
480 case 1:
481 cdbg.l1 = 0;
482 break;
484 case 2:
485 cdbg.l2 = 0;
486 break;
488 case 3:
489 cdbg.l3 = 0;
490 break;
492 case 4:
493 cdbg.l4 = 0;
494 break;
497 else
499 exit(1);
502 if((ret = ioctl(isdnfd, I4B_CTL_SET_DEBUG, &cdbg)) < 0)
504 fprintf(stderr, "ioctl I4B_CTL_SET_DEBUG failed: %s", strerror(errno));
505 exit(1);
507 return(0);
510 /*---------------------------------------------------------------------------*
511 * return ptr to string of 1's and 0's for value
512 *---------------------------------------------------------------------------*/
513 char *
514 bin_str(unsigned long val, int length)
516 static char buffer[80];
517 int i = 0;
519 if (length > 32)
520 length = 32;
522 val = val << (32 - length);
524 while (length--)
526 if (val & 0x80000000)
527 buffer[i++] = '1';
528 else
529 buffer[i++] = '0';
530 if ((length % 4) == 0 && length)
531 buffer[i++] = '.';
532 val = val << 1;
534 return (buffer);
537 /*---------------------------------------------------------------------------*
538 * print l1 info
539 *---------------------------------------------------------------------------*/
540 void
541 printl1(unsigned long val)
543 printf("\nLayer 1: %s = 0x%lX\n", bin_str(val, 32), val);
544 printf(" | |||| |||| |||| ||||\n"),
545 printf(" | |||| |||| |||| |||+- general error messages\n");
546 printf(" | |||| |||| |||| ||+-- PH primitives exchanged\n");
547 printf(" | |||| |||| |||| |+--- B channel actions\n");
548 printf(" | |||| |||| |||| +---- HSCX error messages\n");
549 printf(" | |||| |||| |||+------ HSCX IRQ messages\n");
550 printf(" | |||| |||| ||+------- ISAC error messages\n");
551 printf(" | |||| |||| |+-------- ISAC messages\n");
552 printf(" | |||| |||| +--------- ISAC setup messages\n");
553 printf(" | |||| |||+----------- FSM general messages\n");
554 printf(" | |||| ||+------------ FSM error messages\n");
555 printf(" | |||| |+------------- timer general messages\n");
556 printf(" | |||| +-------------- timer error messages\n");
557 printf(" | |||+---------------- HSCX data xfer errors msgs\n");
558 printf(" | ||+----------------- ISAC CICO messages\n");
559 printf(" | |+------------------ silent messages (soft-HDLC)\n");
560 printf(" | +------------------- error messages (soft-HDLC)\n");
561 printf(" +--------------------- HFC-S PCI debug messages\n");
562 printf(" ++++-++++-++++-+++---------------------- unassigned\n");
565 /*---------------------------------------------------------------------------*
566 * print l2 info
567 *---------------------------------------------------------------------------*/
568 void
569 printl2(unsigned long val)
571 printf("\nLayer 2: %s = 0x%lX\n", bin_str(val, 32), val);
572 printf(" || |||| |||| ||||\n"),
573 printf(" || |||| |||| |||+- general error messages\n");
574 printf(" || |||| |||| ||+-- DL primitives exchanged\n");
575 printf(" || |||| |||| |+--- U frame messages\n");
576 printf(" || |||| |||| +---- U frame error messages\n");
577 printf(" || |||| |||+------ S frame messages\n");
578 printf(" || |||| ||+------- S frame error messages\n");
579 printf(" || |||| |+-------- I frame messages\n");
580 printf(" || |||| +--------- I frame error messages\n");
581 printf(" || |||+----------- FSM general messages\n");
582 printf(" || ||+------------ FSM error messages\n");
583 printf(" || |+------------- timer general messages\n");
584 printf(" || +-------------- timer error messages\n");
585 printf(" |+---------------- TEI general messages\n");
586 printf(" +----------------- TEI error messages\n");
587 printf(" ++++-++++-++++-++++-++------------------ unassigned\n");
590 /*---------------------------------------------------------------------------*
591 * print l3 info
592 *---------------------------------------------------------------------------*/
593 void
594 printl3(unsigned long val)
596 printf("\nLayer 3: %s = 0x%lX\n", bin_str(val, 32), val);
597 printf(" ||| |||| ||||\n"),
598 printf(" ||| |||| |||+- general error messages\n");
599 printf(" ||| |||| ||+-- general messages\n");
600 printf(" ||| |||| |+--- FSM messages\n");
601 printf(" ||| |||| +---- FSM error messages\n");
602 printf(" ||| |||+------ timer messages\n");
603 printf(" ||| ||+------- timer error messages\n");
604 printf(" ||| |+-------- protocol messages\n");
605 printf(" ||| +--------- protocol error messages\n");
606 printf(" ||+----------- facility messages\n");
607 printf(" |+------------ facility error messages\n");
608 printf(" +------------- Q.931 messages exchanged\n");
609 printf(" ++++-++++-++++-++++-++++-+-------------- unassigned\n");
612 /*---------------------------------------------------------------------------*
613 * print l4 info
614 *---------------------------------------------------------------------------*/
615 void
616 printl4(unsigned long val)
618 printf("\nLayer 4: %s = 0x%lX\n", bin_str(val, 32), val);
619 printf(" ||| |||| ||||\n"),
620 printf(" ||| |||| |||+- general error messages\n");
621 printf(" ||| |||| ||+-- general messages\n");
622 printf(" ||| |||| |+--- B-ch timeout messages\n");
623 printf(" ||| |||| +---- network driver dial state\n");
624 printf(" ||| |||+------ ipr driver debug messages\n");
625 printf(" ||| ||+------- rbch driver debug messages\n");
626 printf(" ||| |+-------- isp driver debug messages\n");
627 printf(" ||| +--------- tel driver debug messages\n");
628 printf(" ||+----------- ing driver debug messages\n");
629 printf(" |+------------ iavc driver debug messages\n");
630 printf(" +------------- capi driver debug messages\n");
631 printf(" ++++-++++-++++-++++-++++---------------- unassigned\n");
634 /* EOF */