K&R style function removal. Update functions to ANSI style.
[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.4 2003/09/28 14:39:16 hmp 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/atm/hfa/fore_aali.h>
49 #include <dev/atm/hfa/fore_slave.h>
50 #include <dev/atm/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(char *intf, int argc, char **argv)
137 {
138         int                     buf_len, stats_type;
139         struct air_cfg_rsp      *cfg;
140         struct air_vinfo_rsp    *stats;
141         struct atminfreq        air;
142
143         /*
144          * Get statistics type qualifier
145          */
146         if (!strcasecmp("phy", argv[0])) {
147                 stats_type = SHOW_PHY;
148         } else if (!strcasecmp("dev", argv[0])) {
149                 stats_type = SHOW_DEV;
150         } else if (!strcasecmp("atm", argv[0])) {
151                 stats_type = SHOW_ATM;
152         } else if (!strcasecmp("aal0", argv[0])) {
153                 stats_type = SHOW_AAL0;
154         } else if (!strcasecmp("aal4", argv[0])) {
155                 stats_type = SHOW_AAL4;
156         } else if (!strcasecmp("aal5", argv[0])) {
157                 stats_type = SHOW_AAL5;
158         } else if (!strcasecmp("driver", argv[0])) {
159                 stats_type = SHOW_DRIVER;
160         } else {
161                 fprintf(stderr, "%s: Illegal statistics type\n", prog);
162                 exit(1);
163         }
164         argc--; argv++;
165
166         /*
167          * Get adapter configuration from the kernel
168          */
169         UM_ZERO(&air, sizeof(air));
170         air.air_opcode = AIOCS_INF_CFG;
171         strcpy(air.air_cfg_intf, intf);
172         buf_len = do_info_ioctl(&air, sizeof(struct air_cfg_rsp));
173         if (buf_len < 0) {
174                 fprintf(stderr, "%s: ", prog);
175                 switch (errno) {
176                 case ENOPROTOOPT:
177                 case EOPNOTSUPP:
178                         perror("Internal error");
179                         break;
180                 case ENXIO:
181                         fprintf(stderr, "%s is not an ATM device\n",
182                                         intf);
183                         break;
184                 default:
185                         perror("ioctl (AIOCINFO)");
186                         break;
187                 }
188                 exit(1);
189         }
190         cfg = (struct air_cfg_rsp *) air.air_buf_addr;
191
192         /*
193          * Get vendor-specific statistics from the kernel
194          */
195         UM_ZERO(&air, sizeof(air));
196         air.air_opcode = AIOCS_INF_VST;
197         strcpy(air.air_vinfo_intf, intf);
198         buf_len = do_info_ioctl(&air, sizeof(struct air_vinfo_rsp) + 1024);
199         if (buf_len < 0) {
200                 fprintf(stderr, "%s: ", prog);
201                 switch (errno) {
202                 case ENOPROTOOPT:
203                 case EOPNOTSUPP:
204                         perror("Internal error");
205                         break;
206                 case ENXIO:
207                         fprintf(stderr, "%s is not an ATM device\n",
208                                         intf);
209                         break;
210                 default:
211                         perror("ioctl (AIOCINFO)");
212                         break;
213                 }
214                 exit(1);
215         }
216         stats = (struct air_vinfo_rsp *) air.air_buf_addr;
217
218         /*
219          * Print the statistics
220          */
221         if (buf_len < sizeof(struct air_vinfo_rsp) +
222                         sizeof(Fore_stats)) {
223                 UM_FREE(stats);
224                 UM_FREE(cfg);
225                 return;
226         }
227
228         switch (stats_type) {
229         case SHOW_PHY:
230                 switch (cfg->acp_media) {
231                 case MEDIA_TAXI_100:
232                 case MEDIA_TAXI_140:
233                         print_fore200_taxi(stats);
234                         break;
235                 case MEDIA_OC3C:
236                         print_fore200_oc3(stats);
237                         break;
238                 case MEDIA_OC12C:
239                         break;
240                 default:
241                         break;
242                 }
243                 break;
244         case SHOW_DEV:
245                 print_fore200_dev(stats);
246                 break;
247         case SHOW_ATM:
248                 print_fore200_atm(stats);
249                 break;
250         case SHOW_AAL0:
251                 print_fore200_aal0(stats);
252                 break;
253         case SHOW_AAL4:
254                 print_fore200_aal4(stats);
255                 break;
256         case SHOW_AAL5:
257                 print_fore200_aal5(stats);
258                 break;
259         case SHOW_DRIVER:
260                 print_fore200_driver(stats);
261                 break;
262         }
263
264         UM_FREE(stats);
265         UM_FREE(cfg);
266 }
267
268
269 /*
270  * Print Fore ASX-200 TAXI statistics
271  * 
272  * Arguments:
273  *      vi      pointer to vendor-specific statistics to print
274  *
275  * Returns:
276  *      none
277  *
278  */
279 void
280 print_fore200_taxi(struct air_vinfo_rsp *vi)
281 {
282         Fore_stats      *stats;
283
284         /*
285          * Bump stats pointer past header info
286          */
287         stats = (Fore_stats *) 
288                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
289
290         /*
291          * Print a header
292          */
293         printf(TAXI_STATS_HDR, get_adapter_name(vi->avsp_intf));
294         
295         /*
296          * Print the physical layer info
297          */
298         printf("%10ld  %12ld\n",
299                         stats->st_taxi.taxi_bad_crc,
300                         stats->st_taxi.taxi_framing);
301 }
302
303
304 /*
305  * Print Fore ASX-200 OC-3c statistics
306  * 
307  * Arguments:
308  *      vi      pointer to vendor-specific statistics to print
309  *
310  * Returns:
311  *      none
312  *
313  */
314 void
315 print_fore200_oc3(struct air_vinfo_rsp *vi)
316 {
317         Fore_stats      *stats;
318
319         /*
320          * Bump stats pointer past header info
321          */
322         stats = (Fore_stats *)
323                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
324
325         /*
326          * Print a header
327          */
328         printf(OC3_STATS_HDR, get_adapter_name(vi->avsp_intf));
329         
330         /*
331          * Print the OC-3c info
332          */
333         printf("%7ld  %7ld  %7ld  %7ld  %7ld  %7ld  %7ld\n",
334                         stats->st_oc3.oc3_sect_bip8,
335                         stats->st_oc3.oc3_path_bip8,
336                         stats->st_oc3.oc3_line_bip24,
337                         stats->st_oc3.oc3_line_febe,
338                         stats->st_oc3.oc3_path_febe,
339                         stats->st_oc3.oc3_hec_corr,
340                         stats->st_oc3.oc3_hec_uncorr);
341 }
342
343
344 /*
345  * Print Fore ASX-200 device statistics
346  * 
347  * Arguments:
348  *      vi      pointer to vendor-specific statistics to print
349  *
350  * Returns:
351  *      none
352  *
353  */
354 void
355 print_fore200_dev(struct air_vinfo_rsp *vi)
356 {
357         Fore_stats      *stats;
358
359         /*
360          * Bump stats pointer past header info
361          */
362         stats = (Fore_stats *)
363                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
364
365         /*
366          * Print a header
367          */
368         printf(DEV_STATS_HDR, get_adapter_name(vi->avsp_intf));
369         
370         /*
371          * Print the device info
372          */
373         printf("%10ld  %10ld  %10ld  %10ld  %10ld  %s\n",
374                         stats->st_misc.buf1_sm_fail,
375                         stats->st_misc.buf1_lg_fail,
376                         stats->st_misc.buf2_sm_fail,
377                         stats->st_misc.buf2_lg_fail,
378                         stats->st_misc.rcvd_pdu_fail,
379                         (stats->st_misc.carrier_status ? "On" : "Off"));
380 }
381
382
383 /*
384  * Print Fore ASX-200 ATM statistics
385  * 
386  * Arguments:
387  *      vi      pointer to vendor-specific statistics to print
388  *
389  * Returns:
390  *      none
391  *
392  */
393 void
394 print_fore200_atm(struct air_vinfo_rsp *vi)
395 {
396         Fore_stats      *stats;
397
398         /*
399          * Bump stats pointer past header info
400          */
401         stats = (Fore_stats *)
402                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
403
404         /*
405          * Print a header
406          */
407         printf(ATM_STATS_HDR, get_adapter_name(vi->avsp_intf));
408         
409         /*
410          * Print the ATM layer info
411          */
412         printf("%10ld  %10ld  %10ld  %10ld  %10ld  %10ld\n",
413                         stats->st_atm.atm_rcvd,
414                         stats->st_atm.atm_xmit,
415                         stats->st_atm.atm_vpi_range,
416                         stats->st_atm.atm_vpi_noconn,
417                         stats->st_atm.atm_vci_range,
418                         stats->st_atm.atm_vci_noconn);
419 }
420
421
422 /*
423  * Print Fore ASX-200 AAL 0 statistics
424  * 
425  * Arguments:
426  *      vi      pointer to vendor-specific statistics to print
427  *
428  * Returns:
429  *      none
430  *
431  */
432 void
433 print_fore200_aal0(struct air_vinfo_rsp *vi)
434 {
435         Fore_stats      *stats;
436
437         /*
438          * Bump stats pointer past header info
439          */
440         stats = (Fore_stats *)
441                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
442
443         /*
444          * Print a header
445          */
446         printf(AAL0_STATS_HDR, get_adapter_name(vi->avsp_intf));
447         
448         /*
449          * Print the AAL 0 info
450          */
451         printf("%10ld  %10ld  %10ld\n",
452                         stats->st_aal0.aal0_rcvd,
453                         stats->st_aal0.aal0_xmit,
454                         stats->st_aal0.aal0_drops);
455 }
456
457
458 /*
459  * Print Fore ASX-200 AAL 4 statistics
460  * 
461  * Arguments:
462  *      vi      pointer to vendor-specific statistics to print
463  *
464  * Returns:
465  *      none
466  *
467  */
468 void
469 print_fore200_aal4(struct air_vinfo_rsp *vi)
470 {
471         Fore_stats      *stats;
472
473         /*
474          * Bump stats pointer past header info
475          */
476         stats = (Fore_stats *)
477                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
478
479         /*
480          * Print a header
481          */
482         printf(AAL4_STATS_HDR, get_adapter_name(vi->avsp_intf));
483         
484         /*
485          * Print the AAL 4 info
486          */
487         printf("%10ld  %10ld  %5ld  %5ld  %5ld  %9ld  %9ld  %5ld  %5ld\n",
488                         stats->st_aal4.aal4_rcvd,
489                         stats->st_aal4.aal4_xmit,
490                         stats->st_aal4.aal4_crc,
491                         stats->st_aal4.aal4_sar_cs,
492                         stats->st_aal4.aal4_drops,
493                         stats->st_aal4.aal4_pdu_rcvd,
494                         stats->st_aal4.aal4_pdu_xmit,
495                         stats->st_aal4.aal4_pdu_errs,
496                         stats->st_aal4.aal4_pdu_drops);
497 }
498
499
500 /*
501  * Print Fore ASX-200 AAL 5 statistics
502  * 
503  * Arguments:
504  *      vi      pointer to vendor-specific statistics to print
505  *
506  * Returns:
507  *      none
508  *
509  */
510 void
511 print_fore200_aal5(struct air_vinfo_rsp *vi)
512 {
513         Fore_stats      *stats;
514
515         /*
516          * Bump stats pointer past header info
517          */
518         stats = (Fore_stats *)
519                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
520
521         /*
522          * Print a header
523          */
524         printf(AAL5_STATS_HDR, get_adapter_name(vi->avsp_intf));
525         
526         /*
527          * Print the AAL 5 info
528          */
529         printf("%10ld  %10ld  %5ld  %5ld  %9ld  %9ld  %5ld  %5ld  %5ld\n",
530                         stats->st_aal5.aal5_rcvd,
531                         stats->st_aal5.aal5_xmit,
532                         stats->st_aal5.aal5_crc_len,
533                         stats->st_aal5.aal5_drops,
534                         stats->st_aal5.aal5_pdu_rcvd,
535                         stats->st_aal5.aal5_pdu_xmit,
536                         stats->st_aal5.aal5_pdu_crc,
537                         stats->st_aal5.aal5_pdu_errs,
538                         stats->st_aal5.aal5_pdu_drops);
539 }
540
541
542 /*
543  * Print Fore ASX-200 device driver statistics
544  * 
545  * Arguments:
546  *      vi      pointer to vendor-specific statistics to print
547  *
548  * Returns:
549  *      none
550  *
551  */
552 void
553 print_fore200_driver(struct air_vinfo_rsp *vi)
554 {
555         Fore_stats      *stats;
556
557         /*
558          * Bump stats pointer past header info
559          */
560         stats = (Fore_stats *)
561                         ((u_long) vi + sizeof(struct air_vinfo_rsp));
562
563         /*
564          * Print a header
565          */
566         printf(DRIVER_STATS_HDR, get_adapter_name(vi->avsp_intf));
567         
568         /*
569          * Print the driver info
570          */
571         printf("%4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld  %4ld\n",
572                         stats->st_drv.drv_xm_notact,
573                         stats->st_drv.drv_xm_full,
574                         stats->st_drv.drv_xm_maxpdu,
575                         stats->st_drv.drv_xm_segnoal,
576                         stats->st_drv.drv_xm_seglen,
577                         stats->st_drv.drv_xm_segdma,
578                         stats->st_drv.drv_rv_novcc,
579                         stats->st_drv.drv_rv_nosbf,
580                         stats->st_drv.drv_rv_nomb,
581                         stats->st_drv.drv_rv_ifull,
582                         stats->st_drv.drv_bf_segdma,
583                         stats->st_drv.drv_cm_full,
584                         stats->st_drv.drv_cm_nodma);
585
586 }