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