1*b01aba1dSGarrett Wollman #include <sys/types.h>
2*b01aba1dSGarrett Wollman #include <sys/socket.h> /* for PF_LINK */
3*b01aba1dSGarrett Wollman #include <sys/sysctl.h>
4*b01aba1dSGarrett Wollman #include <sys/time.h>
5*b01aba1dSGarrett Wollman
6*b01aba1dSGarrett Wollman #include <err.h>
7*b01aba1dSGarrett Wollman #include <stdio.h>
8*b01aba1dSGarrett Wollman #include <string.h>
9*b01aba1dSGarrett Wollman #include <sysexits.h>
10*b01aba1dSGarrett Wollman
11*b01aba1dSGarrett Wollman #include <net/if.h>
12*b01aba1dSGarrett Wollman #include <net/if_types.h>
13*b01aba1dSGarrett Wollman #include <net/if_mib.h>
14*b01aba1dSGarrett Wollman
15*b01aba1dSGarrett Wollman #include "ifinfo.h"
16*b01aba1dSGarrett Wollman
17*b01aba1dSGarrett Wollman #define print(msg, var) \
18*b01aba1dSGarrett Wollman if (var) printf("\t" msg ": %lu\n", (u_long)var)
19*b01aba1dSGarrett Wollman
20*b01aba1dSGarrett Wollman static void identify_chipset(u_int32_t chipset);
21*b01aba1dSGarrett Wollman
22*b01aba1dSGarrett Wollman void
print_1650(const void * xmd,size_t len)23*b01aba1dSGarrett Wollman print_1650(const void *xmd, size_t len)
24*b01aba1dSGarrett Wollman {
25*b01aba1dSGarrett Wollman const struct ifmib_iso_8802_3 *md = xmd;
26*b01aba1dSGarrett Wollman
27*b01aba1dSGarrett Wollman if (len != sizeof *md)
28*b01aba1dSGarrett Wollman warnx("cannot interpret %lu bytes of MIB data", (u_long)len);
29*b01aba1dSGarrett Wollman
30*b01aba1dSGarrett Wollman identify_chipset(md->dot3StatsEtherChipSet);
31*b01aba1dSGarrett Wollman print("Alignment errors", md->dot3StatsAlignmentErrors);
32*b01aba1dSGarrett Wollman print("FCS errors", md->dot3StatsFCSErrors);
33*b01aba1dSGarrett Wollman print("Single-collision frames", md->dot3StatsSingleCollisionFrames);
34*b01aba1dSGarrett Wollman print("Multiple-collision frames", md->dot3StatsMultipleCollisionFrames);
35*b01aba1dSGarrett Wollman print("SQE (Heartbeat) test errors", md->dot3StatsSQETestErrors);
36*b01aba1dSGarrett Wollman print("Deferred transmissions", md->dot3StatsDeferredTransmissions);
37*b01aba1dSGarrett Wollman print("Late collisions", md->dot3StatsLateCollisions);
38*b01aba1dSGarrett Wollman print("Excessive collisions", md->dot3StatsExcessiveCollisions);
39*b01aba1dSGarrett Wollman print("Internal transmit errors", md->dot3StatsInternalMacTransmitErrors);
40*b01aba1dSGarrett Wollman print("Carrier sense errors", md->dot3StatsCarrierSenseErrors);
41*b01aba1dSGarrett Wollman print("Frame-too-long errors", md->dot3StatsFrameTooLongs);
42*b01aba1dSGarrett Wollman print("Internal receive errors", md->dot3StatsInternalMacReceiveErrors);
43*b01aba1dSGarrett Wollman print("Missed frames", md->dot3StatsMissedFrames);
44*b01aba1dSGarrett Wollman #define cprint(num) print("Packets with " #num " collisions", \
45*b01aba1dSGarrett Wollman md->dot3StatsCollFrequencies[num - 1])
46*b01aba1dSGarrett Wollman if (md->dot3Compliance >= DOT3COMPLIANCE_COLLS) {
47*b01aba1dSGarrett Wollman cprint(1); cprint(2); cprint(3); cprint(4);
48*b01aba1dSGarrett Wollman cprint(5); cprint(6); cprint(7); cprint(8);
49*b01aba1dSGarrett Wollman cprint(9); cprint(10); cprint(11); cprint(12);
50*b01aba1dSGarrett Wollman cprint(13); cprint(14); cprint(15); cprint(16);
51*b01aba1dSGarrett Wollman }
52*b01aba1dSGarrett Wollman switch(md->dot3Compliance) {
53*b01aba1dSGarrett Wollman case DOT3COMPLIANCE_STATS:
54*b01aba1dSGarrett Wollman printf("\tCompliance: statistics only\n");
55*b01aba1dSGarrett Wollman break;
56*b01aba1dSGarrett Wollman case DOT3COMPLIANCE_COLLS:
57*b01aba1dSGarrett Wollman printf("\tCompliance: statistics and collisions\n");
58*b01aba1dSGarrett Wollman break;
59*b01aba1dSGarrett Wollman }
60*b01aba1dSGarrett Wollman }
61*b01aba1dSGarrett Wollman
62*b01aba1dSGarrett Wollman static const char *const amd[] = {
63*b01aba1dSGarrett Wollman 0, "Am7990", "Am79900", "Am79C940"
64*b01aba1dSGarrett Wollman };
65*b01aba1dSGarrett Wollman
66*b01aba1dSGarrett Wollman static const char *const intel[] = {
67*b01aba1dSGarrett Wollman 0, "82586", "82596", "82557"
68*b01aba1dSGarrett Wollman };
69*b01aba1dSGarrett Wollman
70*b01aba1dSGarrett Wollman static const char *const national[] = {
71*b01aba1dSGarrett Wollman 0, "8390", "Sonic"
72*b01aba1dSGarrett Wollman };
73*b01aba1dSGarrett Wollman
74*b01aba1dSGarrett Wollman static const char *const fujitsu[] = {
75*b01aba1dSGarrett Wollman 0, "86950"
76*b01aba1dSGarrett Wollman };
77*b01aba1dSGarrett Wollman
78*b01aba1dSGarrett Wollman static const char *const digital[] = {
79*b01aba1dSGarrett Wollman 0, "DC21040", "DC21140", "DC21041", "DC21140A", "DC21142"
80*b01aba1dSGarrett Wollman };
81*b01aba1dSGarrett Wollman
82*b01aba1dSGarrett Wollman static const char *const westerndigital[] = {
83*b01aba1dSGarrett Wollman 0, "83C690", "83C790"
84*b01aba1dSGarrett Wollman };
85*b01aba1dSGarrett Wollman
86*b01aba1dSGarrett Wollman #define vendor(name, sets) { name, sets, (sizeof sets)/(sizeof sets[0]) }
87*b01aba1dSGarrett Wollman static struct {
88*b01aba1dSGarrett Wollman const char *name;
89*b01aba1dSGarrett Wollman const char *const *chips;
90*b01aba1dSGarrett Wollman size_t len;
91*b01aba1dSGarrett Wollman } chipset_names[] = {
92*b01aba1dSGarrett Wollman { 0 },
93*b01aba1dSGarrett Wollman vendor("AMD", amd),
94*b01aba1dSGarrett Wollman vendor("Intel", intel),
95*b01aba1dSGarrett Wollman { 0 },
96*b01aba1dSGarrett Wollman vendor("National Semiconductor", national),
97*b01aba1dSGarrett Wollman vendor("Fujitsu", fujitsu),
98*b01aba1dSGarrett Wollman vendor("Digital", digital),
99*b01aba1dSGarrett Wollman vendor("Western Digital", westerndigital)
100*b01aba1dSGarrett Wollman };
101*b01aba1dSGarrett Wollman
102*b01aba1dSGarrett Wollman static void
identify_chipset(u_int32_t chipset)103*b01aba1dSGarrett Wollman identify_chipset(u_int32_t chipset)
104*b01aba1dSGarrett Wollman {
105*b01aba1dSGarrett Wollman enum dot3Vendors vendor = DOT3CHIPSET_VENDOR(chipset);
106*b01aba1dSGarrett Wollman u_int part = DOT3CHIPSET_PART(chipset);
107*b01aba1dSGarrett Wollman
108*b01aba1dSGarrett Wollman printf("\tChipset: ");
109*b01aba1dSGarrett Wollman if (vendor < 1
110*b01aba1dSGarrett Wollman || vendor >= (sizeof chipset_names)/(sizeof chipset_names[0])
111*b01aba1dSGarrett Wollman || !chipset_names[vendor].name) {
112*b01aba1dSGarrett Wollman printf("unknown\n");
113*b01aba1dSGarrett Wollman return;
114*b01aba1dSGarrett Wollman }
115*b01aba1dSGarrett Wollman
116*b01aba1dSGarrett Wollman printf("%s ", chipset_names[vendor].name);
117*b01aba1dSGarrett Wollman if (part < 1 || part >= chipset_names[vendor].len) {
118*b01aba1dSGarrett Wollman printf("unknown\n");
119*b01aba1dSGarrett Wollman return;
120*b01aba1dSGarrett Wollman }
121*b01aba1dSGarrett Wollman
122*b01aba1dSGarrett Wollman printf("%s\n", chipset_names[vendor].chips[part]);
123*b01aba1dSGarrett Wollman }
124*b01aba1dSGarrett Wollman
125