Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[dragonfly.git] / usr.sbin / i4b / isdndebug / main.c
1 /*
2  * Copyright (c) 1997, 2001 Hellmuth Michaelis. All rights reserved.
3  *
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.
12  *
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.
24  *
25  *---------------------------------------------------------------------------
26  *
27  *      main.c - i4b set debug options
28  *      ------------------------------
29  *
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.2 2003/06/17 04:29:54 dillon Exp $
32  *
33  *      last edit-date: [Mon May 21 10:09:23 2001]
34  *
35  *---------------------------------------------------------------------------*/
36
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>
50
51 #include <machine/i4b_debug.h>
52 #include <machine/i4b_ioctl.h>
53
54 char *bin_str(unsigned long val, int length);
55
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);
61
62 static int isdnfd;
63
64 #define I4BCTLDEVICE    "/dev/i4bctl"
65
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;
78
79 /*---------------------------------------------------------------------------*
80  *      usage display and exit
81  *---------------------------------------------------------------------------*/
82 static void
83 usage(void)
84 {
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);
102 }
103
104 /*---------------------------------------------------------------------------*
105  *      program entry
106  *---------------------------------------------------------------------------*/
107 int
108 main(int argc, char **argv)
109 {
110         int c;
111         ctl_debug_t cdbg;
112         int ret;
113         
114         while ((c = getopt(argc, argv, "ceghl:mqrs:u:zCHQ")) != -1)
115         {
116                 switch(c)
117                 {
118                         case 'c':
119                                 opt_chipstat = 1;
120                                 break;
121
122                         case 'e':
123                                 opt_err = 1;
124                                 break;
125
126                         case 'g':
127                                 opt_get = 1;
128                                 break;
129
130                         case 'q':
131                                 opt_lapd = 1;
132                                 break;
133
134                         case 'r':
135                                 opt_reset = 1;
136                                 break;
137
138                         case 'm':
139                                 opt_max = 1;
140                                 break;
141
142                         case 'l':
143                                 opt_layer = atoi(optarg);
144                                 if(opt_layer < 1 || opt_layer > 4)
145                                         usage();
146                                 break;
147
148                         case 's':
149                                 if((sscanf(optarg, "%i", &opt_setval)) != 1)
150                                         usage();
151                                 opt_set = 1;
152                                 break;
153
154                         case 'u':
155                                 opt_unit = atoi(optarg);
156                                 if(opt_unit < 0 || opt_unit > 9)
157                                         usage();
158                                 break;
159
160                         case 'z':
161                                 opt_zero = 1;
162                                 break;
163
164                         case 'Q':
165                                 opt_rlapd = 1;
166                                 break;
167
168                         case '?':
169                         default:
170                                 usage();
171                                 break;
172                 }
173         }
174
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)
178         {
179                 usage();
180         }
181
182         if((opt_get + opt_set + opt_reset + opt_max + opt_err + opt_zero +
183             opt_lapd + opt_rlapd + opt_chipstat) > 1)
184         {
185                 usage();
186         }
187
188         if((isdnfd = open(I4BCTLDEVICE, O_RDWR)) < 0)
189         {
190                 fprintf(stderr, "i4bctl: cannot open %s: %s\n", I4BCTLDEVICE, strerror(errno));
191                 exit(1);
192         }
193
194         if(opt_chipstat)
195         {
196                 struct chipstat cst;
197                 u_char *name;
198                 
199                 cst.driver_unit = opt_unit;
200                 cst.driver_bchannel = 0; 
201                 
202                 if((ret = ioctl(isdnfd, I4B_CTL_GET_CHIPSTAT, &cst)) < 0)
203                 {
204                         fprintf(stderr, "ioctl I4B_CTL_GET_CHIPSTAT failed: %s", strerror(errno));
205                         exit(1);
206                 }
207
208                 switch(cst.driver_type)
209                 {
210                         case L1DRVR_ISIC:
211                                 name = "isic";
212                                 printf("\nisic-driver\nHSCX events:      VFR    RDO    CRC    RAB    XDU    RFO\n");
213
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);
223
224                                 cst.driver_unit = opt_unit;
225                                 cst.driver_bchannel = 1; 
226                 
227                                 if((ret = ioctl(isdnfd, I4B_CTL_GET_CHIPSTAT, &cst)) < 0)
228                                 {
229                                         fprintf(stderr, "ioctl I4B_CTL_GET_CHIPSTAT failed: %s", strerror(errno));
230                                         exit(1);
231                                 }
232
233                                 printf("HSCX events:      VFR    RDO    CRC    RAB    XDU    RFO\n");
234
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);
244
245                                 break;
246         
247                         case L1DRVR_IWIC:
248                                 name = "iwic";
249                                 break;
250         
251                         case L1DRVR_IFPI:
252                                 name = "ifpi";
253                                 break;
254         
255                         case L1DRVR_IHFC:
256                                 name = "ihfc";
257                                 break;
258         
259                         case L1DRVR_IFPNP:
260                                 name = "ifpnp";
261                                 break;
262
263                         default:
264                                 fprintf(stderr, "ioctl I4B_CTL_GET_CHIPSTAT, unknown driver %d\n",cst.driver_type);
265                                 exit(1);
266                                 break;
267                 }
268                 exit(0);
269         }
270
271         if(opt_lapd)
272         {
273                 l2stat_t l2s;
274
275                 l2s.unit = opt_unit;
276                 
277                 if((ret = ioctl(isdnfd, I4B_CTL_GET_LAPDSTAT, &l2s)) < 0)
278                 {
279                         fprintf(stderr, "ioctl I4B_CTL_GET_LAPDSTAT failed: %s", strerror(errno));
280                         exit(1);
281                 }
282
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);
304
305                 exit(0);
306         }
307
308         if(opt_rlapd)
309         {
310                 int unit;
311
312                 unit = opt_unit;
313                 
314                 if((ret = ioctl(isdnfd, I4B_CTL_CLR_LAPDSTAT, &unit)) < 0)
315                 {
316                         fprintf(stderr, "ioctl I4B_CTL_CLR_LAPDSTAT failed: %s", strerror(errno));
317                         exit(1);
318                 }
319
320                 printf("Q.921 statistics counters unit %d reset to zero!\n", unit);
321                 exit(0);
322         }
323                 
324         if((ret = ioctl(isdnfd, I4B_CTL_GET_DEBUG, &cdbg)) < 0)
325         {
326                 fprintf(stderr, "ioctl I4B_CTL_GET_DEBUG failed: %s", strerror(errno));
327                 exit(1);
328         }
329
330         if(opt_get)
331         {
332                 switch(opt_layer)
333                 {
334                         case -1:
335                                 printl1(cdbg.l1);
336                                 printl2(cdbg.l2);
337                                 printl3(cdbg.l3);
338                                 printl4(cdbg.l4);
339                                 break;
340         
341                         case 1:
342                                 printl1(cdbg.l1);
343                                 break;
344         
345                         case 2:
346                                 printl2(cdbg.l2);
347                                 break;
348         
349                         case 3:
350                                 printl3(cdbg.l3);
351                                 break;
352         
353                         case 4:
354                                 printl4(cdbg.l4);
355                                 break;
356                 }
357                 printf("\n");
358                 return(0);
359         }
360         else if(opt_set)
361         {
362                 switch(opt_layer)
363                 {
364                         case -1:
365                                 usage();
366                                 break;
367         
368                         case 1:
369                                 cdbg.l1 = opt_setval;
370                                 break;
371         
372                         case 2:
373                                 cdbg.l2 = opt_setval;
374                                 break;
375         
376                         case 3:
377                                 cdbg.l3 = opt_setval;
378                                 break;
379         
380                         case 4:
381                                 cdbg.l4 = opt_setval;
382                                 break;
383                 }
384         }
385         else if(opt_reset)
386         {
387                 switch(opt_layer)
388                 {
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;
395         
396                         case 1:
397                                 cdbg.l1 = L1_DEBUG_DEFAULT;
398                                 break;
399         
400                         case 2:
401                                 cdbg.l2 = L2_DEBUG_DEFAULT;
402                                 break;
403         
404                         case 3:
405                                 cdbg.l3 = L3_DEBUG_DEFAULT;
406                                 break;
407         
408                         case 4:
409                                 cdbg.l4 = L4_DEBUG_DEFAULT;
410                                 break;
411                 }
412         }
413         else if(opt_max)
414         {
415                 switch(opt_layer)
416                 {
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;
423         
424                         case 1:
425                                 cdbg.l1 = L1_DEBUG_MAX;
426                                 break;
427         
428                         case 2:
429                                 cdbg.l2 = L2_DEBUG_MAX;
430                                 break;
431         
432                         case 3:
433                                 cdbg.l3 = L3_DEBUG_MAX;
434                                 break;
435         
436                         case 4:
437                                 cdbg.l4 = L4_DEBUG_MAX;
438                                 break;
439                 }
440         }
441         else if(opt_err)
442         {
443                 switch(opt_layer)
444                 {
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;
451         
452                         case 1:
453                                 cdbg.l1 = L1_DEBUG_ERR;
454                                 break;
455         
456                         case 2:
457                                 cdbg.l2 = L2_DEBUG_ERR;
458                                 break;
459         
460                         case 3:
461                                 cdbg.l3 = L3_DEBUG_ERR;
462                                 break;
463         
464                         case 4:
465                                 cdbg.l4 = L4_DEBUG_ERR;
466                                 break;
467                 }
468         }
469         else if(opt_zero)
470         {
471                 switch(opt_layer)
472                 {
473                         case -1:
474                                 cdbg.l1 = 0;
475                                 cdbg.l2 = 0;
476                                 cdbg.l3 = 0;
477                                 cdbg.l4 = 0;
478                                 break;
479         
480                         case 1:
481                                 cdbg.l1 = 0;
482                                 break;
483         
484                         case 2:
485                                 cdbg.l2 = 0;
486                                 break;
487         
488                         case 3:
489                                 cdbg.l3 = 0;
490                                 break;
491         
492                         case 4:
493                                 cdbg.l4 = 0;
494                                 break;
495                 }
496         }
497         else
498         {
499                 exit(1);
500         }       
501
502         if((ret = ioctl(isdnfd, I4B_CTL_SET_DEBUG, &cdbg)) < 0)
503         {
504                 fprintf(stderr, "ioctl I4B_CTL_SET_DEBUG failed: %s", strerror(errno));
505                 exit(1);
506         }
507         return(0);
508 }
509
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)
515 {
516         static char buffer[80];
517         int i = 0;
518
519         if (length > 32)
520                 length = 32;
521
522         val = val << (32 - length);
523
524         while (length--)
525         {
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;
533         }
534         return (buffer);
535 }
536
537 /*---------------------------------------------------------------------------*
538  *      print l1 info
539  *---------------------------------------------------------------------------*/
540 void
541 printl1(unsigned long val)
542 {
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");
563 }
564
565 /*---------------------------------------------------------------------------*
566  *      print l2 info
567  *---------------------------------------------------------------------------*/
568 void
569 printl2(unsigned long val)
570 {
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");
588 }
589
590 /*---------------------------------------------------------------------------*
591  *      print l3 info
592  *---------------------------------------------------------------------------*/
593 void
594 printl3(unsigned long val)
595 {
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");
610 }
611
612 /*---------------------------------------------------------------------------*
613  *      print l4 info
614  *---------------------------------------------------------------------------*/
615 void
616 printl4(unsigned long val)
617 {
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");
632 }
633
634 /* EOF */