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