rfc1650.c revision 225736
11541Srgrimes#include <sys/types.h>
21541Srgrimes#include <sys/socket.h>		/* for PF_LINK */
31541Srgrimes#include <sys/sysctl.h>
41541Srgrimes#include <sys/time.h>
51541Srgrimes
61541Srgrimes#include <err.h>
71541Srgrimes#include <stdio.h>
81541Srgrimes#include <string.h>
91541Srgrimes#include <sysexits.h>
101541Srgrimes
111541Srgrimes#include <net/if.h>
121541Srgrimes#include <net/if_types.h>
131541Srgrimes#include <net/if_mib.h>
141541Srgrimes
151541Srgrimes#include "ifinfo.h"
161541Srgrimes
171541Srgrimes#define print(msg, var) \
181541Srgrimes	if (var) printf("\t" msg ": %lu\n", (u_long)var)
191541Srgrimes
201541Srgrimesstatic void identify_chipset(u_int32_t chipset);
211541Srgrimes
221541Srgrimesvoid
231541Srgrimesprint_1650(const void *xmd, size_t len)
241541Srgrimes{
251541Srgrimes	const struct ifmib_iso_8802_3 *md = xmd;
261541Srgrimes
271541Srgrimes	if (len != sizeof *md)
281541Srgrimes		warnx("cannot interpret %lu bytes of MIB data", (u_long)len);
291541Srgrimes
301541Srgrimes	identify_chipset(md->dot3StatsEtherChipSet);
311541Srgrimes	print("Alignment errors", md->dot3StatsAlignmentErrors);
321541Srgrimes	print("FCS errors", md->dot3StatsFCSErrors);
331541Srgrimes	print("Single-collision frames", md->dot3StatsSingleCollisionFrames);
341541Srgrimes	print("Multiple-collision frames", md->dot3StatsMultipleCollisionFrames);
3550477Speter	print("SQE (Heartbeat) test errors", md->dot3StatsSQETestErrors);
361541Srgrimes	print("Deferred transmissions", md->dot3StatsDeferredTransmissions);
371541Srgrimes	print("Late collisions", md->dot3StatsLateCollisions);
38221059Skib	print("Excessive collisions", md->dot3StatsExcessiveCollisions);
39221059Skib	print("Internal transmit errors", md->dot3StatsInternalMacTransmitErrors);
402165Spaul	print("Carrier sense errors", md->dot3StatsCarrierSenseErrors);
4129683Sgibbs	print("Frame-too-long errors", md->dot3StatsFrameTooLongs);
4229683Sgibbs	print("Internal receive errors", md->dot3StatsInternalMacReceiveErrors);
43173760Sattilio	print("Missed frames", md->dot3StatsMissedFrames);
44141428Siedowse#define	cprint(num) print("Packets with " #num " collisions", \
4560938Sjake			  md->dot3StatsCollFrequencies[num - 1])
4660938Sjake	if (md->dot3Compliance >= DOT3COMPLIANCE_COLLS) {
4729683Sgibbs		cprint(1); cprint(2); cprint(3); cprint(4);
4883045Sobrien		cprint(5); cprint(6); cprint(7); cprint(8);
4929683Sgibbs		cprint(9); cprint(10); cprint(11); cprint(12);
5060938Sjake		cprint(13); cprint(14); cprint(15); cprint(16);
5160938Sjake	}
5229683Sgibbs	switch(md->dot3Compliance) {
5331470Sdg	case DOT3COMPLIANCE_STATS:
541541Srgrimes		printf("\tCompliance: statistics only\n");
55177859Sjeff		break;
56173760Sattilio	case DOT3COMPLIANCE_COLLS:
5744510Swollman		printf("\tCompliance: statistics and collisions\n");
58177859Sjeff		break;
591541Srgrimes	}
601541Srgrimes}
6155205Speter
62static const char *const amd[] = {
63	0, "Am7990", "Am79900", "Am79C940"
64};
65
66static const char *const intel[] = {
67	0, "82586", "82596", "82557"
68};
69
70static const char *const national[] = {
71	0, "8390", "Sonic"
72};
73
74static const char *const fujitsu[] = {
75	0, "86950"
76};
77
78static const char *const digital[] = {
79	0, "DC21040", "DC21140", "DC21041", "DC21140A", "DC21142"
80};
81
82static const char *const westerndigital[] = {
83	0, "83C690", "83C790"
84};
85
86#define vendor(name, sets) { name, sets, (sizeof sets)/(sizeof sets[0]) }
87static struct {
88	const char *name;
89	const char *const *chips;
90	size_t len;
91} chipset_names[] = {
92	{ 0 },
93	vendor("AMD", amd),
94	vendor("Intel", intel),
95	{ 0 },
96	vendor("National Semiconductor", national),
97	vendor("Fujitsu", fujitsu),
98	vendor("Digital", digital),
99	vendor("Western Digital", westerndigital)
100};
101
102static void
103identify_chipset(u_int32_t chipset)
104{
105	enum dot3Vendors vendor = DOT3CHIPSET_VENDOR(chipset);
106	u_int part = DOT3CHIPSET_PART(chipset);
107
108	printf("\tChipset: ");
109	if (vendor < 1
110	    || vendor >= (sizeof chipset_names)/(sizeof chipset_names[0])
111	    || !chipset_names[vendor].name) {
112		printf("unknown\n");
113		return;
114	}
115
116	printf("%s ", chipset_names[vendor].name);
117	if (part < 1 || part >= chipset_names[vendor].len) {
118		printf("unknown\n");
119		return;
120	}
121
122	printf("%s\n", chipset_names[vendor].chips[part]);
123}
124
125