2 * $DragonFly: src/tools/tools/ifinfo/rfc1650.c,v 1.2 2003/11/07 14:38:38 eirikn Exp $
6 #include <sys/socket.h> /* for PF_LINK */
7 #include <sys/sysctl.h>
16 #include <net/if_types.h>
17 #include <net/if_mib.h>
21 #define print(msg, var) \
22 if (var) printf("\t" msg ": %lu\n", (u_long)var)
24 static void identify_chipset(u_int32_t chipset
);
27 print_1650(const void *xmd
, size_t len
)
29 const struct ifmib_iso_8802_3
*md
= xmd
;
31 if (len
!= sizeof *md
)
32 warnx("cannot interpret %lu bytes of MIB data", (u_long
)len
);
34 identify_chipset(md
->dot3StatsEtherChipSet
);
35 print("Alignment errors", md
->dot3StatsAlignmentErrors
);
36 print("FCS errors", md
->dot3StatsFCSErrors
);
37 print("Single-collision frames", md
->dot3StatsSingleCollisionFrames
);
38 print("Multiple-collision frames", md
->dot3StatsMultipleCollisionFrames
);
39 print("SQE (Heartbeat) test errors", md
->dot3StatsSQETestErrors
);
40 print("Deferred transmissions", md
->dot3StatsDeferredTransmissions
);
41 print("Late collisions", md
->dot3StatsLateCollisions
);
42 print("Excessive collisions", md
->dot3StatsExcessiveCollisions
);
43 print("Internal transmit errors", md
->dot3StatsInternalMacTransmitErrors
);
44 print("Carrier sense errors", md
->dot3StatsCarrierSenseErrors
);
45 print("Frame-too-long errors", md
->dot3StatsFrameTooLongs
);
46 print("Internal receive errors", md
->dot3StatsInternalMacReceiveErrors
);
47 print("Missed frames", md
->dot3StatsMissedFrames
);
48 #define cprint(num) print("Packets with " #num " collisions", \
49 md->dot3StatsCollFrequencies[num - 1])
50 if (md
->dot3Compliance
>= DOT3COMPLIANCE_COLLS
) {
51 cprint(1); cprint(2); cprint(3); cprint(4);
52 cprint(5); cprint(6); cprint(7); cprint(8);
53 cprint(9); cprint(10); cprint(11); cprint(12);
54 cprint(13); cprint(14); cprint(15); cprint(16);
56 switch(md
->dot3Compliance
) {
57 case DOT3COMPLIANCE_STATS
:
58 printf("\tCompliance: statistics only\n");
60 case DOT3COMPLIANCE_COLLS
:
61 printf("\tCompliance: statistics and collisions\n");
66 static const char *const amd
[] = {
67 0, "Am7990", "Am79900", "Am79C940"
70 static const char *const intel
[] = {
71 0, "82586", "82596", "82557"
74 static const char *const national
[] = {
78 static const char *const fujitsu
[] = {
82 static const char *const digital
[] = {
83 0, "DC21040", "DC21140", "DC21041", "DC21140A", "DC21142"
86 static const char *const westerndigital
[] = {
90 #define vendor(name, sets) { name, sets, (sizeof sets)/(sizeof sets[0]) }
93 const char *const *chips
;
98 vendor("Intel", intel
),
100 vendor("National Semiconductor", national
),
101 vendor("Fujitsu", fujitsu
),
102 vendor("Digital", digital
),
103 vendor("Western Digital", westerndigital
)
107 identify_chipset(u_int32_t chipset
)
109 enum dot3Vendors vendor
= DOT3CHIPSET_VENDOR(chipset
);
110 u_int part
= DOT3CHIPSET_PART(chipset
);
112 printf("\tChipset: ");
114 || vendor
>= (sizeof chipset_names
)/(sizeof chipset_names
[0])
115 || !chipset_names
[vendor
].name
) {
120 printf("%s ", chipset_names
[vendor
].name
);
121 if (part
< 1 || part
>= chipset_names
[vendor
].len
) {
126 printf("%s\n", chipset_names
[vendor
].chips
[part
]);