9f88d3e08b181d300eda8b238564545c1c7694d1
[dragonfly.git] / sbin / atm / atm / atm_fore200.c
1 /*
2  *
3  * ===================================
4  * HARP  |  Host ATM Research Platform
5  * ===================================
6  *
7  *
8  * This Host ATM Research Platform ("HARP") file (the "Software") is
9  * made available by Network Computing Services, Inc. ("NetworkCS")
10  * "AS IS".  NetworkCS does not provide maintenance, improvements or
11  * support of any kind.
12  *
13  * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
14  * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
15  * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
16  * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
17  * In no event shall NetworkCS be responsible for any damages, including
18  * but not limited to consequential damages, arising from or relating to
19  * any use of the Software or related support.
20  *
21  * Copyright 1994-1998 Network Computing Services, Inc.
22  *
23  * Copies of this Software may be made, however, the above copyright
24  * notice must be reproduced on all copies.
25  *
26  *      @(#) $FreeBSD: src/sbin/atm/atm/atm_fore200.c,v 1.3.2.1 2000/07/01 06:02:14 ps Exp $
27  *      @(#) $DragonFly: src/sbin/atm/atm/atm_fore200.c,v 1.2 2003/06/17 04:27:32 dillon Exp $
28  */
29
30 /*
31  * User configuration and display program
32  * --------------------------------------
33  *
34  * Routines for Fore SBA-200-specific subcommands
35  *
36  */
37
38 #include <sys/param.h>  
39 #include <sys/socket.h> 
40 #include <net/if.h>
41 #include <netinet/in.h>
42 #include <netatm/port.h>
43 #include <netatm/atm.h>
44 #include <netatm/atm_if.h> 
45 #include <netatm/atm_sap.h>
46 #include <netatm/atm_sys.h>
47 #include <netatm/atm_ioctl.h>
48 #include <dev/hfa/fore_aali.h>
49 #include <dev/hfa/fore_slave.h>
50 #include <dev/hfa/fore_stats.h>
51
52 #include <errno.h>
53 #include <libatm.h>
54 #include <stdio.h>
55 #include <stdlib.h>
56 #include <string.h>
57
58 #include "atm.h"
59
60 /*
61  * Local constants
62  */
63 #define SHOW_PHY        1
64 #define SHOW_DEV        2
65 #define SHOW_ATM        4
66 #define SHOW_AAL0       8
67 #define SHOW_AAL4       16
68 #define SHOW_AAL5       32
69 #define SHOW_DRIVER     64
70
71
72 /*
73  * Headers for statistics
74  */
75 #define TAXI_STATS_HDR \
76 "%s TAXI Statistics\n\
77   CRC Errs  Framing Errs\n"
78
79 #define DEV_STATS_HDR \
80 "%s Device Statistics\n\
81 Type 1      Type 1      Type 2      Type 2\n\
82 Small Buff  Large Buff  Small Buff  Large Buff  Receive     Receive\n\
83 Alloc Fail  Alloc Fail  Alloc Fail  Alloc Fail  Queue Full  Carrier\n"
84
85 #define ATM_STATS_HDR \
86 "%s ATM Layer Statistics\n\
87   Cells In   Cells Out   VPI Range  VPI NoConn   VCI Range  VCI NoConn\n"
88
89 #define AAL0_STATS_HDR \
90 "%s AAL 0 Statistics\n\
91   Cells In   Cells Out  Cell Drops\n"
92
93 #define AAL4_STATS_HDR \
94 "%s AAL 4 Statistics\n\
95                          CRC   Proto  Cell                          PDU   PDU\n\
96   Cells In   Cells Out   Errs  Errs   Drops    PDUs In   PDUs Out   Errs  Drops\n"
97
98 #define AAL5_STATS_HDR \
99 "%s AAL 5 Statistics\n\
100                         CRC/Len                              CRC   Proto  PDU\n\
101   Cells In   Cells Out  Errs   Drops    PDUs In   PDUs Out   Errs  Errs   Drops\n"
102
103 #define DRIVER_STATS_HDR \
104 "%s Device Driver Statistics\n\
105   No  Xmit   Max   Seg          No    No          No    IQ    No   Cmd    No\n\
106  VCC Queue   Seg   Not   Seg   DMA   VCC    No  Mbuf  Full   DMA Queue   DMA\n\
107  Out  Full  Size Align   Pad   Out    In  Buff    In    In   Sup  Full   Cmd\n"
108
109 #define OC3_STATS_HDR \
110 "%s OC-3c Statistics\n\
111 Section     Path    Line      Line     Path     Corr   Uncorr\n\
112 BIP8        BIP8    BIP24     FEBE     FEBE     HCS    HCS\n\
113 Errs        Errs    Errs      Errs     Errs     Errs   Errs\n"
114
115
116 /*
117  * Process show Fore SBA-200 statistics command
118  *
119  * The statistics printed are vendor-specific, depending on the brand of
120  * the interface card.
121  * 
122  * Command format: 
123  *      atm show stats interface [<interface-name> [phy | dev | atm |
124  *              aal0 | aal4 | aal5 | driver]]
125  *
126  * Arguments:
127  *      intf    interface statistics are for
128  *      argc    number of remaining arguments to command
129  *      argv    pointer to remaining argument strings
130  *
131  * Returns:
132  *      none
133  *
134  */
135 void
136 show_fore200_stats(intf, argc, argv)
137         char            *intf;
138         int             argc;
139         char            **argv;
140 {
141         int                     buf_len, stats_type;
142         struct air_cfg_rsp      *cfg;
143         struct air_vinfo_rsp    *stats;
144         struct atminfreq        air;
145
146         /*
147          * Get statistics type qualifier
148          */
149         if (!strcasecmp("phy", argv[0])) {
150                 stats_type = SHOW_PHY;
151         } else if (!strcasecmp("dev", argv[0])) {
152                 stats_type = SHOW_DEV;
153         } else if (!strcasecmp("atm", argv[0])) {
154                 stats_type = SHOW_ATM;
155         } else if (!strcasecmp("aal0", argv[0])) {
156                 stats_type = SHOW_AAL0;
157         } else if (!strcasecmp("aal4", argv[0])) {
158                 stats_type = SHOW_AAL4;
159         } else if (!strcasecmp("aal5", argv[0])) {
160                 stats_type = SHOW_AAL5;
161         } else if (!strcasecmp("driver", argv[0])) {
162                 stats_type = SHOW_DRIVER;
163         } else {
164                 fprintf(stderr, "%s: Illegal statistics type\n", prog);
165                 exit(1);
166         }
167         argc--; argv++;
168
169         /*
170          * Get adapter configuration from the kernel
171          */
172         UM_ZERO(&air, sizeof(air));
173         air.air_opcode = AIOCS_INF_CFG;
174         strcpy(air.air_cfg_intf, intf);
175         buf_len = do_info_ioctl(&air, sizeof(struct air_cfg_rsp));
176         if (buf_len < 0) {
177                 fprintf(stderr, "%s: ", prog);
178                 switch (errno) {
179                 case ENOPROTOOPT:
180                 case EOPNOTSUPP:
181                         perror("Internal error");
182                         break;
183                 case ENXIO:
184                         fprintf(stderr, "%s is not an ATM device\n",
185                                         intf);
186                         break;
187                 default:
188                         perror("ioctl (AIOCINFO)");
189                         break;
190                 }
191                 exit(1);
192         }
193         cfg = (struct air_cfg_rsp *) air.air_buf_addr;
194
195         /*
196          * Get vendor-specific statistics from the kernel
197          */
198         UM_ZERO(&air, sizeof(air));
199         air.air_opcode = AIOCS_INF_VST;
200         strcpy(air.air_vinfo_intf, intf);
201         buf_len = do_info_ioctl(&air, sizeof(struct air_vinfo_rsp) + 1024);
202         if (buf_len < 0) {
203                 fprintf(stderr, "%s: ", prog);
204                 switch (errno) {
205                 case ENOPROTOOPT:
206                 case EOPNOTSUPP:
207                         perror("Internal error");
208                         break;
209                 case ENXIO:
210                         fprintf(stderr, "%s is not an ATM device\n",
211                                         intf);
212                         break;
213                 default:
214                         perror("ioctl (AIOCINFO)");
215                         break;
216                 }
217                 exit(1);
218         }
219         stats = (struct air_vinfo_rsp *) air.air_buf_addr;
220
221         /*
222          * Print the statistics
223          */
224         if (buf_len < sizeof(struct air_vinfo_rsp) +
225                         sizeof(Fore_stats)) {
226                 UM_FREE(stats);
227                 UM_FREE(cfg);
228                 return;
229         }
230
231         switch (stats_type) {
232         case SHOW_PHY:
233                 switch (cfg->acp_media) {
234                 case MEDIA_TAXI_100:
235                 case MEDIA_TAXI_140:
236                         print_fore200_taxi(stats);
237                         break;
238                 case MEDIA_OC3C:
239                         print_fore200_oc3(stats);
240                         break;
241                 case MEDIA_OC12C:
242                         break;
243                 default:
244                         break;
245                 }
246                 break;
247         case SHOW_DEV:
248                 print_fore200_dev(stats);
249                 break;
250         case SHOW_ATM:
251                 print_fore200_atm(stats);
252                 break;
253         case SHOW_AAL0:
254                 print_fore200_aal0(stats);
255                 break;
256         case SHOW_AAL4:
257                 print_fore200_aal4(stats);
258                 break;
259         case SHOW_AAL5:
260                 print_fore200_aal5(stats);
261                 break;
262         case SHOW_DRIVER:
263                 print_fore200_driver(stats);
264                 break;
265         }
266
267         UM_FREE(stats);
268         UM_FREE(cfg);
269 }
270
271
272 /*
273  * Print Fore ASX-200 TAXI statistics
274  * 
275  * Arguments:
276  *      vi      pointer to vendor-specific statistics to print
277  *
278  * Returns:
279  *      none
280  *
281  */
282 void
283 print_fore200_taxi(vi)
284         struct air_vinfo_rsp    *vi;
285 {
286         Fore_stats      *stats;
287
288         /*
289          * Bump stats pointer past header info
290          */
291         stats = (Fore_stats *) 
292                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
293
294         /*
295          * Print a header
296          */
297         printf(TAXI_STATS_HDR, get_adapter_name(vi->avsp_intf));
298         
299         /*
300          * Print the physical layer info
301          */
302         printf("%10ld  %12ld\n",
303                         stats->st_taxi.taxi_bad_crc,
304                         stats->st_taxi.taxi_framing);
305 }
306
307
308 /*
309  * Print Fore ASX-200 OC-3c statistics
310  * 
311  * Arguments:
312  *      vi      pointer to vendor-specific statistics to print
313  *
314  * Returns:
315  *      none
316  *
317  */
318 void
319 print_fore200_oc3(vi)
320         struct air_vinfo_rsp    *vi;
321 {
322         Fore_stats      *stats;
323
324         /*
325          * Bump stats pointer past header info
326          */
327         stats = (Fore_stats *)
328                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
329
330         /*
331          * Print a header
332          */
333         printf(OC3_STATS_HDR, get_adapter_name(vi->avsp_intf));
334         
335         /*
336          * Print the OC-3c info
337          */
338         printf("%7ld  %7ld  %7ld  %7ld  %7ld  %7ld  %7ld\n",
339                         stats->st_oc3.oc3_sect_bip8,
340                         stats->st_oc3.oc3_path_bip8,
341                         stats->st_oc3.oc3_line_bip24,
342                         stats->st_oc3.oc3_line_febe,
343                         stats->st_oc3.oc3_path_febe,
344                         stats->st_oc3.oc3_hec_corr,
345                         stats->st_oc3.oc3_hec_uncorr);
346 }
347
348
349 /*
350  * Print Fore ASX-200 device statistics
351  * 
352  * Arguments:
353  *      vi      pointer to vendor-specific statistics to print
354  *
355  * Returns:
356  *      none
357  *
358  */
359 void
360 print_fore200_dev(vi)
361         struct air_vinfo_rsp    *vi;
362 {
363         Fore_stats      *stats;
364
365         /*
366          * Bump stats pointer past header info
367          */
368         stats = (Fore_stats *)
369                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
370
371         /*
372          * Print a header
373          */
374         printf(DEV_STATS_HDR, get_adapter_name(vi->avsp_intf));
375         
376         /*
377          * Print the device info
378          */
379         printf("%10ld  %10ld  %10ld  %10ld  %10ld  %s\n",
380                         stats->st_misc.buf1_sm_fail,
381                         stats->st_misc.buf1_lg_fail,
382                         stats->st_misc.buf2_sm_fail,
383                         stats->st_misc.buf2_lg_fail,
384                         stats->st_misc.rcvd_pdu_fail,
385                         (stats->st_misc.carrier_status ? "On" : "Off"));
386 }
387
388
389 /*
390  * Print Fore ASX-200 ATM statistics
391  * 
392  * Arguments:
393  *      vi      pointer to vendor-specific statistics to print
394  *
395  * Returns:
396  *      none
397  *
398  */
399 void
400 print_fore200_atm(vi)
401         struct air_vinfo_rsp    *vi;
402 {
403         Fore_stats      *stats;
404
405         /*
406          * Bump stats pointer past header info
407          */
408         stats = (Fore_stats *)
409                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
410
411         /*
412          * Print a header
413          */
414         printf(ATM_STATS_HDR, get_adapter_name(vi->avsp_intf));
415         
416         /*
417          * Print the ATM layer info
418          */
419         printf("%10ld  %10ld  %10ld  %10ld  %10ld  %10ld\n",
420                         stats->st_atm.atm_rcvd,
421                         stats->st_atm.atm_xmit,
422                         stats->st_atm.atm_vpi_range,
423                         stats->st_atm.atm_vpi_noconn,
424                         stats->st_atm.atm_vci_range,
425                         stats->st_atm.atm_vci_noconn);
426 }
427
428
429 /*
430  * Print Fore ASX-200 AAL 0 statistics
431  * 
432  * Arguments:
433  *      vi      pointer to vendor-specific statistics to print
434  *
435  * Returns:
436  *      none
437  *
438  */
439 void
440 print_fore200_aal0(vi)
441         struct air_vinfo_rsp    *vi;
442 {
443         Fore_stats      *stats;
444
445         /*
446          * Bump stats pointer past header info
447          */
448         stats = (Fore_stats *)
449                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
450
451         /*
452          * Print a header
453          */
454         printf(AAL0_STATS_HDR, get_adapter_name(vi->avsp_intf));
455         
456         /*
457          * Print the AAL 0 info
458          */
459         printf("%10ld  %10ld  %10ld\n",
460                         stats->st_aal0.aal0_rcvd,
461                         stats->st_aal0.aal0_xmit,
462                         stats->st_aal0.aal0_drops);
463 }
464
465
466 /*
467  * Print Fore ASX-200 AAL 4 statistics
468  * 
469  * Arguments:
470  *      vi      pointer to vendor-specific statistics to print
471  *
472  * Returns:
473  *      none
474  *
475  */
476 void
477 print_fore200_aal4(vi)
478         struct air_vinfo_rsp    *vi;
479 {
480         Fore_stats      *stats;
481
482         /*
483          * Bump stats pointer past header info
484          */
485         stats = (Fore_stats *)
486                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
487
488         /*
489          * Print a header
490          */
491         printf(AAL4_STATS_HDR, get_adapter_name(vi->avsp_intf));
492         
493         /*
494          * Print the AAL 4 info
495          */
496         printf("%10ld  %10ld  %5ld  %5ld  %5ld  %9ld  %9ld  %5ld  %5ld\n",
497                         stats->st_aal4.aal4_rcvd,
498                         stats->st_aal4.aal4_xmit,
499                         stats->st_aal4.aal4_crc,
500                         stats->st_aal4.aal4_sar_cs,
501                         stats->st_aal4.aal4_drops,
502                         stats->st_aal4.aal4_pdu_rcvd,
503                         stats->st_aal4.aal4_pdu_xmit,
504                         stats->st_aal4.aal4_pdu_errs,
505                         stats->st_aal4.aal4_pdu_drops);
506 }
507
508
509 /*
510  * Print Fore ASX-200 AAL 5 statistics
511  * 
512  * Arguments:
513  *      vi      pointer to vendor-specific statistics to print
514  *
515  * Returns:
516  *      none
517  *
518  */
519 void
520 print_fore200_aal5(vi)
521         struct air_vinfo_rsp    *vi;
522 {
523         Fore_stats      *stats;
524
525         /*
526          * Bump stats pointer past header info
527          */
528         stats = (Fore_stats *)
529                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
530
531         /*
532          * Print a header
533          */
534         printf(AAL5_STATS_HDR, get_adapter_name(vi->avsp_intf));
535         
536         /*
537          * Print the AAL 5 info
538          */
539         printf("%10ld  %10ld  %5ld  %5ld  %9ld  %9ld  %5ld  %5ld  %5ld\n",
540                         stats->st_aal5.aal5_rcvd,
541                         stats->st_aal5.aal5_xmit,
542                         stats->st_aal5.aal5_crc_len,
543                         stats->st_aal5.aal5_drops,
544                         stats->st_aal5.aal5_pdu_rcvd,
545                         stats->st_aal5.aal5_pdu_xmit,
546                         stats->st_aal5.aal5_pdu_crc,
547                         stats->st_aal5.aal5_pdu_errs,
548                         stats->st_aal5.aal5_pdu_drops);
549 }
550
551
552 /*
553  * Print Fore ASX-200 device driver statistics
554  * 
555  * Arguments:
556  *      vi      pointer to vendor-specific statistics to print
557  *
558  * Returns:
559  *      none
560  *
561  */
562 void
563 print_fore200_driver(vi)
564         struct air_vinfo_rsp    *vi;
565 {
566         Fore_stats      *stats;
567
568         /*
569          * Bump stats pointer past header info
570          */
571         stats = (Fore_stats *)
572                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
573
574         /*
575          * Print a header
576          */
577         printf(DRIVER_STATS_HDR, get_adapter_name(vi->avsp_intf));
578         
579         /*
580          * Print the driver info
581          */
582         printf("%4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld\n",
583                         stats->st_drv.drv_xm_notact,
584                         stats->st_drv.drv_xm_full,
585                         stats->st_drv.drv_xm_maxpdu,
586                         stats->st_drv.drv_xm_segnoal,
587                         stats->st_drv.drv_xm_seglen,
588                         stats->st_drv.drv_xm_segdma,
589                         stats->st_drv.drv_rv_novcc,
590                         stats->st_drv.drv_rv_nosbf,
591                         stats->st_drv.drv_rv_nomb,
592                         stats->st_drv.drv_rv_ifull,
593                         stats->st_drv.drv_bf_segdma,
594                         stats->st_drv.drv_cm_full,
595                         stats->st_drv.drv_cm_nodma);
596
597 }