xref: /freebsd-src/tools/tools/ifinfo/rfc1650.c (revision b01aba1d41ccafda5d03b99220702903cefee3e2)
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