]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - usr.sbin/i4b/isdndebug/main.c
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.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$
31  *
32  *      last edit-date: [Mon May 21 10:09:23 2001]
33  *
34  *---------------------------------------------------------------------------*/
35
36 #include <stdio.h>
37 #include <signal.h>
38 #include <errno.h>
39 #include <string.h>
40 #include <stdlib.h>
41 #include <unistd.h>
42 #include <fcntl.h>
43 #include <ctype.h>
44 #include <sys/stat.h>
45 #include <sys/wait.h>
46 #include <sys/ioctl.h>
47 #include <sys/types.h>
48 #include <sys/time.h>
49
50 #include <i4b/i4b_debug.h>
51 #include <i4b/i4b_ioctl.h>
52
53 char *bin_str(unsigned long val, int length);
54
55 static void usage ( void );
56 void printl1(unsigned long val);
57 void printl2(unsigned long val);
58 void printl3(unsigned long val);
59 void printl4(unsigned long val);
60
61 static int isdnfd;
62
63 #define I4BCTLDEVICE    "/dev/i4bctl"
64
65 int opt_get = 0;
66 int opt_layer = -1;
67 int opt_set = 0;
68 int opt_setval;
69 int opt_reset = 0;
70 int opt_max = 0;
71 int opt_err = 0;
72 int opt_zero = 0;
73 int opt_unit = 0;
74 int opt_lapd = 0;
75 int opt_rlapd = 0;
76 int opt_chipstat = 0;
77
78 /*---------------------------------------------------------------------------*
79  *      usage display and exit
80  *---------------------------------------------------------------------------*/
81 static void
82 usage(void)
83 {
84         fprintf(stderr, "\n");
85         fprintf(stderr, "isdndebug - i4b set debug level, version %d.%d.%d\n", VERSION, REL, STEP);
86         fprintf(stderr, "usage: isdndebug -c -e -g -l <layer> -m -q -r -s <value> -u <unit> -z -C -Q\n");
87         fprintf(stderr, "       -c            get chipset statistics\n");
88         fprintf(stderr, "       -e            set error only debugging output\n");
89         fprintf(stderr, "       -g            get current debugging values\n");
90         fprintf(stderr, "       -l layer      specify layer (1...4)\n");
91         fprintf(stderr, "       -m            set maximum debugging output\n");
92         fprintf(stderr, "       -q            get Q.921 statistics\n");
93         fprintf(stderr, "       -r            reset values(s) to compiled in default\n");
94         fprintf(stderr, "       -s value      set new debugging value for layer\n");
95         fprintf(stderr, "       -u unit       unit number for -c, -q, -C and -Q commands\n");   
96         fprintf(stderr, "       -z            set zero (=no) debugging output\n");
97         fprintf(stderr, "       -C            reset chipset statistics\n");
98         fprintf(stderr, "       -Q            reset Q.921 statistics\n");
99         fprintf(stderr, "\n");
100         exit(1);
101 }
102
103 /*---------------------------------------------------------------------------*
104  *      program entry
105  *---------------------------------------------------------------------------*/
106 int
107 main(int argc, char **argv)
108 {
109         int c;
110         ctl_debug_t cdbg;
111         int ret;
112         
113         while ((c = getopt(argc, argv, "ceghl:mqrs:u:zCHQ")) != -1)
114         {
115                 switch(c)
116                 {
117                         case 'c':
118                                 opt_chipstat = 1;
119                                 break;
120
121                         case 'e':
122                                 opt_err = 1;
123                                 break;
124
125                         case 'g':
126                                 opt_get = 1;
127                                 break;
128
129                         case 'q':
130                                 opt_lapd = 1;
131                                 break;
132
133                         case 'r':
134                                 opt_reset = 1;
135                                 break;
136
137                         case 'm':
138                                 opt_max = 1;
139                                 break;
140
141                         case 'l':
142                                 opt_layer = atoi(optarg);
143                                 if(opt_layer < 1 || opt_layer > 4)
144                                         usage();
145                                 break;
146
147                         case 's':
148                                 if((sscanf(optarg, "%i", &opt_setval)) != 1)
149                                         usage();
150                                 opt_set = 1;
151                                 break;
152
153                         case 'u':
154                                 opt_unit = atoi(optarg);
155                                 if(opt_unit < 0 || opt_unit > 9)
156                                         usage();
157                                 break;
158
159                         case 'z':
160                                 opt_zero = 1;
161                                 break;
162
163                         case 'Q':
164                                 opt_rlapd = 1;
165                                 break;
166
167                         case '?':
168                         default:
169                                 usage();
170                                 break;
171                 }
172         }
173
174         if(opt_get == 0 && opt_set == 0 && opt_reset == 0 && opt_max == 0 &&
175            opt_err == 0 && opt_zero == 0 && opt_lapd == 0 && opt_rlapd == 0 &&
176            opt_chipstat == 0)
177         {
178                 usage();
179         }
180
181         if((opt_get + opt_set + opt_reset + opt_max + opt_err + opt_zero +
182             opt_lapd + opt_rlapd + opt_chipstat) > 1)
183         {
184                 usage();
185         }
186
187         if((isdnfd = open(I4BCTLDEVICE, O_RDWR)) < 0)
188         {
189                 fprintf(stderr, "i4bctl: cannot open %s: %s\n", I4BCTLDEVICE, strerror(errno));
190                 exit(1);
191         }
192
193         if(opt_chipstat)
194         {
195                 struct chipstat cst;
196                 u_char *name;
197                 
198                 cst.driver_unit = opt_unit;
199                 cst.driver_bchannel = 0; 
200                 
201                 if((ret = ioctl(isdnfd, I4B_CTL_GET_CHIPSTAT, &cst)) < 0)
202                 {
203                         fprintf(stderr, "ioctl I4B_CTL_GET_CHIPSTAT failed: %s", strerror(errno));
204                         exit(1);
205                 }
206
207                 switch(cst.driver_type)
208                 {
209                         case L1DRVR_ISIC:
210                                 name = "isic";
211                                 printf("\nisic-driver\nHSCX events:      VFR    RDO    CRC    RAB    XDU    RFO\n");
212
213                                 printf("unit %d chan %d: %6d %6d %6d %6d %6d %6d\n",
214                                         cst.stats.hscxstat.unit,
215                                         cst.stats.hscxstat.chan,
216                                         cst.stats.hscxstat.vfr,
217                                         cst.stats.hscxstat.rdo,
218                                         cst.stats.hscxstat.crc,
219                                         cst.stats.hscxstat.rab,
220                                         cst.stats.hscxstat.xdu,
221                                         cst.stats.hscxstat.rfo);
222
223                                 cst.driver_unit = opt_unit;
224                                 cst.driver_bchannel = 1; 
225                 
226                                 if((ret = ioctl(isdnfd, I4B_CTL_GET_CHIPSTAT, &cst)) < 0)
227                                 {
228                                         fprintf(stderr, "ioctl I4B_CTL_GET_CHIPSTAT failed: %s", strerror(errno));
229                                         exit(1);
230                                 }
231
232                                 printf("HSCX events:      VFR    RDO    CRC    RAB    XDU    RFO\n");
233
234                                 printf("unit %d chan %d: %6d %6d %6d %6d %6d %6d\n",
235                                         cst.stats.hscxstat.unit,
236                                         cst.stats.hscxstat.chan,
237                                         cst.stats.hscxstat.vfr,
238                                         cst.stats.hscxstat.rdo,
239                                         cst.stats.hscxstat.crc,
240                                         cst.stats.hscxstat.rab,
241                                         cst.stats.hscxstat.xdu,
242                                         cst.stats.hscxstat.rfo);
243
244                                 break;
245         
246                         case L1DRVR_IWIC:
247                                 name = "iwic";
248                                 break;
249         
250                         case L1DRVR_IFPI:
251                                 name = "ifpi";
252                                 break;
253         
254                         case L1DRVR_IHFC:
255                                 name = "ihfc";
256                                 break;
257         
258                         case L1DRVR_IFPNP:
259                                 name = "ifpnp";
260                                 break;
261
262                         default:
263                                 fprintf(stderr, "ioctl I4B_CTL_GET_CHIPSTAT, unknown driver %d\n",cst.driver_type);
264                                 exit(1);
265                                 break;
266                 }
267                 exit(0);
268         }
269
270         if(opt_lapd)
271         {
272                 l2stat_t l2s;
273
274                 l2s.unit = opt_unit;
275                 
276                 if((ret = ioctl(isdnfd, I4B_CTL_GET_LAPDSTAT, &l2s)) < 0)
277                 {
278                         fprintf(stderr, "ioctl I4B_CTL_GET_LAPDSTAT failed: %s", strerror(errno));
279                         exit(1);
280                 }
281
282                 printf("unit %d Q.921 statistics: receive     transmit\n", opt_unit);
283                 printf("---------------------------------------------\n");
284                 printf("# of I-frames       %12lu %12lu\n", l2s.lapdstat.rx_i, l2s.lapdstat.tx_i);
285                 printf("# of RR-frames      %12lu %12lu\n", l2s.lapdstat.rx_rr, l2s.lapdstat.tx_rr);
286                 printf("# of RNR-frames     %12lu %12lu\n", l2s.lapdstat.rx_rnr, l2s.lapdstat.tx_rnr);
287                 printf("# of REJ-frames     %12lu %12lu\n", l2s.lapdstat.rx_rej, l2s.lapdstat.tx_rej);
288                 printf("# of SABME-frames   %12lu %12lu\n", l2s.lapdstat.rx_sabme, l2s.lapdstat.tx_sabme);
289                 printf("# of DM-frames      %12lu %12lu\n", l2s.lapdstat.rx_dm, l2s.lapdstat.tx_dm);
290                 printf("# of DISC-frames    %12lu %12lu\n", l2s.lapdstat.rx_disc, l2s.lapdstat.tx_disc);
291                 printf("# of UA-frames      %12lu %12lu\n", l2s.lapdstat.rx_ua, l2s.lapdstat.tx_ua);
292                 printf("# of FRMR-frames    %12lu %12lu\n", l2s.lapdstat.rx_frmr, l2s.lapdstat.tx_frmr);
293                 printf("# of TEI-frames     %12lu %12lu\n", l2s.lapdstat.rx_tei, l2s.lapdstat.tx_tei);
294                 printf("# of UI-frames      %12lu      \n", l2s.lapdstat.rx_ui);
295                 printf("# of XID-frames     %12lu      \n", l2s.lapdstat.rx_xid);
296                 printf("                                       errors\n");
297                 printf("---------------------------------------------\n");
298                 printf("# of frames with incorrect length%12lu\n", l2s.lapdstat.err_rx_len);
299                 printf("# of frames with bad frame type  %12lu\n", l2s.lapdstat.err_rx_badf);
300                 printf("# of bad S frames                %12lu\n", l2s.lapdstat.err_rx_bads);
301                 printf("# of bad U frames                %12lu\n", l2s.lapdstat.err_rx_badu);
302                 printf("# of bad UI frames               %12lu\n", l2s.lapdstat.err_rx_badui);
303
304                 exit(0);
305         }
306
307         if(opt_rlapd)
308         {
309                 int unit;
310
311                 unit = opt_unit;
312                 
313                 if((ret = ioctl(isdnfd, I4B_CTL_CLR_LAPDSTAT, &unit)) < 0)
314                 {
315                         fprintf(stderr, "ioctl I4B_CTL_CLR_LAPDSTAT failed: %s", strerror(errno));
316                         exit(1);
317                 }
318
319                 printf("Q.921 statistics counters unit %d reset to zero!\n", unit);
320                 exit(0);
321         }
322                 
323         if((ret = ioctl(isdnfd, I4B_CTL_GET_DEBUG, &cdbg)) < 0)
324         {
325                 fprintf(stderr, "ioctl I4B_CTL_GET_DEBUG failed: %s", strerror(errno));
326                 exit(1);
327         }
328
329         if(opt_get)
330         {
331                 switch(opt_layer)
332                 {
333                         case -1:
334                                 printl1(cdbg.l1);
335                                 printl2(cdbg.l2);
336                                 printl3(cdbg.l3);
337                                 printl4(cdbg.l4);
338                                 break;
339         
340                         case 1:
341                                 printl1(cdbg.l1);
342                                 break;
343         
344                         case 2:
345                                 printl2(cdbg.l2);
346                                 break;
347         
348                         case 3:
349                                 printl3(cdbg.l3);
350                                 break;
351         
352                         case 4:
353                                 printl4(cdbg.l4);
354                                 break;
355                 }
356                 printf("\n");
357                 return(0);
358         }
359         else if(opt_set)
360         {
361                 switch(opt_layer)
362                 {
363                         case -1:
364                                 usage();
365                                 break;
366         
367                         case 1:
368                                 cdbg.l1 = opt_setval;
369                                 break;
370         
371                         case 2:
372                                 cdbg.l2 = opt_setval;
373                                 break;
374         
375                         case 3:
376                                 cdbg.l3 = opt_setval;
377                                 break;
378         
379                         case 4:
380                                 cdbg.l4 = opt_setval;
381                                 break;
382                 }
383         }
384         else if(opt_reset)
385         {
386                 switch(opt_layer)
387                 {
388                         case -1:
389                                 cdbg.l1 = L1_DEBUG_DEFAULT;
390                                 cdbg.l2 = L2_DEBUG_DEFAULT;
391                                 cdbg.l3 = L3_DEBUG_DEFAULT;
392                                 cdbg.l4 = L4_DEBUG_DEFAULT;
393                                 break;
394         
395                         case 1:
396                                 cdbg.l1 = L1_DEBUG_DEFAULT;
397                                 break;
398         
399                         case 2:
400                                 cdbg.l2 = L2_DEBUG_DEFAULT;
401                                 break;
402         
403                         case 3:
404                                 cdbg.l3 = L3_DEBUG_DEFAULT;
405                                 break;
406         
407                         case 4:
408                                 cdbg.l4 = L4_DEBUG_DEFAULT;
409                                 break;
410                 }
411         }
412         else if(opt_max)
413         {
414                 switch(opt_layer)
415                 {
416                         case -1:
417                                 cdbg.l1 = L1_DEBUG_MAX;
418                                 cdbg.l2 = L2_DEBUG_MAX;
419                                 cdbg.l3 = L3_DEBUG_MAX;
420                                 cdbg.l4 = L4_DEBUG_MAX;
421                                 break;
422         
423                         case 1:
424                                 cdbg.l1 = L1_DEBUG_MAX;
425                                 break;
426         
427                         case 2:
428                                 cdbg.l2 = L2_DEBUG_MAX;
429                                 break;
430         
431                         case 3:
432                                 cdbg.l3 = L3_DEBUG_MAX;
433                                 break;
434         
435                         case 4:
436                                 cdbg.l4 = L4_DEBUG_MAX;
437                                 break;
438                 }
439         }
440         else if(opt_err)
441         {
442                 switch(opt_layer)
443                 {
444                         case -1:
445                                 cdbg.l1 = L1_DEBUG_ERR;
446                                 cdbg.l2 = L2_DEBUG_ERR;
447                                 cdbg.l3 = L3_DEBUG_ERR;
448                                 cdbg.l4 = L4_DEBUG_ERR;
449                                 break;
450         
451                         case 1:
452                                 cdbg.l1 = L1_DEBUG_ERR;
453                                 break;
454         
455                         case 2:
456                                 cdbg.l2 = L2_DEBUG_ERR;
457                                 break;
458         
459                         case 3:
460                                 cdbg.l3 = L3_DEBUG_ERR;
461                                 break;
462         
463                         case 4:
464                                 cdbg.l4 = L4_DEBUG_ERR;
465                                 break;
466                 }
467         }
468         else if(opt_zero)
469         {
470                 switch(opt_layer)
471                 {
472                         case -1:
473                                 cdbg.l1 = 0;
474                                 cdbg.l2 = 0;
475                                 cdbg.l3 = 0;
476                                 cdbg.l4 = 0;
477                                 break;
478         
479                         case 1:
480                                 cdbg.l1 = 0;
481                                 break;
482         
483                         case 2:
484                                 cdbg.l2 = 0;
485                                 break;
486         
487                         case 3:
488                                 cdbg.l3 = 0;
489                                 break;
490         
491                         case 4:
492                                 cdbg.l4 = 0;
493                                 break;
494                 }
495         }
496         else
497         {
498                 exit(1);
499         }       
500
501         if((ret = ioctl(isdnfd, I4B_CTL_SET_DEBUG, &cdbg)) < 0)
502         {
503                 fprintf(stderr, "ioctl I4B_CTL_SET_DEBUG failed: %s", strerror(errno));
504                 exit(1);
505         }
506         return(0);
507 }
508
509 /*---------------------------------------------------------------------------*
510  *      return ptr to string of 1's and 0's for value
511  *---------------------------------------------------------------------------*/
512 char *
513 bin_str(unsigned long val, int length)
514 {
515         static char buffer[80];
516         int i = 0;
517
518         if (length > 32)
519                 length = 32;
520
521         val = val << (32 - length);
522
523         while (length--)
524         {
525                 if (val & 0x80000000)
526                         buffer[i++] = '1';
527                 else
528                         buffer[i++] = '0';
529                 if ((length % 4) == 0 && length)
530                         buffer[i++] = '.';
531                 val = val << 1;
532         }
533         return (buffer);
534 }
535
536 /*---------------------------------------------------------------------------*
537  *      print l1 info
538  *---------------------------------------------------------------------------*/
539 void
540 printl1(unsigned long val)
541 {
542         printf("\nLayer 1: %s  =  0x%lX\n", bin_str(val, 32), val);
543         printf("                           | |||| |||| |||| ||||\n"),
544         printf("                           | |||| |||| |||| |||+- general error messages\n");
545         printf("                           | |||| |||| |||| ||+-- PH primitives exchanged\n");
546         printf("                           | |||| |||| |||| |+--- B channel actions\n");
547         printf("                           | |||| |||| |||| +---- HSCX error messages\n");
548         printf("                           | |||| |||| |||+------ HSCX IRQ messages\n");
549         printf("                           | |||| |||| ||+------- ISAC error messages\n");
550         printf("                           | |||| |||| |+-------- ISAC messages\n");
551         printf("                           | |||| |||| +--------- ISAC setup messages\n");
552         printf("                           | |||| |||+----------- FSM general messages\n");
553         printf("                           | |||| ||+------------ FSM error messages\n");
554         printf("                           | |||| |+------------- timer general messages\n");
555         printf("                           | |||| +-------------- timer error messages\n");
556         printf("                           | |||+---------------- HSCX data xfer errors msgs\n");
557         printf("                           | ||+----------------- ISAC CICO messages\n");
558         printf("                           | |+------------------ silent messages (soft-HDLC)\n");
559         printf("                           | +------------------- error messages (soft-HDLC)\n");
560         printf("                           +--------------------- HFC-S PCI debug messages\n");
561         printf("         ++++-++++-++++-+++---------------------- unassigned\n");
562 }
563
564 /*---------------------------------------------------------------------------*
565  *      print l2 info
566  *---------------------------------------------------------------------------*/
567 void
568 printl2(unsigned long val)
569 {
570         printf("\nLayer 2: %s  =  0x%lX\n", bin_str(val, 32), val);
571         printf("                               || |||| |||| ||||\n"),
572         printf("                               || |||| |||| |||+- general error messages\n");
573         printf("                               || |||| |||| ||+-- DL primitives exchanged\n");
574         printf("                               || |||| |||| |+--- U frame messages\n");
575         printf("                               || |||| |||| +---- U frame error messages\n");
576         printf("                               || |||| |||+------ S frame messages\n");
577         printf("                               || |||| ||+------- S frame error messages\n");
578         printf("                               || |||| |+-------- I frame messages\n");
579         printf("                               || |||| +--------- I frame error messages\n");
580         printf("                               || |||+----------- FSM general messages\n");
581         printf("                               || ||+------------ FSM error messages\n");
582         printf("                               || |+------------- timer general messages\n");
583         printf("                               || +-------------- timer error messages\n");
584         printf("                               |+---------------- TEI general messages\n");
585         printf("                               +----------------- TEI error messages\n");
586         printf("         ++++-++++-++++-++++-++------------------ unassigned\n");
587 }
588
589 /*---------------------------------------------------------------------------*
590  *      print l3 info
591  *---------------------------------------------------------------------------*/
592 void
593 printl3(unsigned long val)
594 {
595         printf("\nLayer 3: %s  =  0x%lX\n", bin_str(val, 32), val);
596         printf("                                   ||| |||| ||||\n"),
597         printf("                                   ||| |||| |||+- general error messages\n");
598         printf("                                   ||| |||| ||+-- general messages\n");
599         printf("                                   ||| |||| |+--- FSM messages\n");
600         printf("                                   ||| |||| +---- FSM error messages\n");
601         printf("                                   ||| |||+------ timer messages\n");
602         printf("                                   ||| ||+------- timer error messages\n");
603         printf("                                   ||| |+-------- protocol messages\n");
604         printf("                                   ||| +--------- protocol error messages\n");
605         printf("                                   ||+----------- facility messages\n");
606         printf("                                   |+------------ facility error messages\n");
607         printf("                                   +------------- Q.931 messages exchanged\n"); 
608         printf("         ++++-++++-++++-++++-++++-+-------------- unassigned\n");
609 }
610
611 /*---------------------------------------------------------------------------*
612  *      print l4 info
613  *---------------------------------------------------------------------------*/
614 void
615 printl4(unsigned long val)
616 {
617         printf("\nLayer 4: %s  =  0x%lX\n", bin_str(val, 32), val);
618         printf("                                   ||| |||| ||||\n"),
619         printf("                                   ||| |||| |||+- general error messages\n");
620         printf("                                   ||| |||| ||+-- general messages\n");
621         printf("                                   ||| |||| |+--- B-ch timeout messages\n");
622         printf("                                   ||| |||| +---- network driver dial state\n");
623         printf("                                   ||| |||+------ ipr driver debug messages\n");
624         printf("                                   ||| ||+------- rbch driver debug messages\n");
625         printf("                                   ||| |+-------- isp driver debug messages\n");
626         printf("                                   ||| +--------- tel driver debug messages\n");
627         printf("                                   ||+----------- ing driver debug messages\n");
628         printf("                                   |+------------ iavc driver debug messages\n");
629         printf("                                   +------------- capi driver debug messages\n");
630         printf("         ++++-++++-++++-++++-++++---------------- unassigned\n");
631 }
632
633 /* EOF */