📄 mii-tool.c,v
字号:
head 1.10;access;symbols;locks; strict;comment @ * @;1.10date 2000.08.10.01.04.11; author root; state Exp;branches;next 1.9;1.9date 2000.04.28.00.56.08; author root; state Exp;branches;next 1.8;1.8date 2000.04.25.23.48.20; author root; state Exp;branches;next 1.7;1.7date 2000.04.25.22.58.19; author root; state Exp;branches;next 1.6;1.6date 2000.04.25.22.06.05; author root; state Exp;branches;next 1.5;1.5date 2000.04.11.19.53.55; author root; state Exp;branches;next 1.4;1.4date 2000.04.10.20.35.24; author root; state Exp;branches;next 1.3;1.3date 2000.03.31.22.40.37; author root; state Exp;branches;next 1.2;1.2date 2000.03.28.20.49.59; author root; state Exp;branches;next 1.1;1.1date 2000.03.28.20.46.54; author root; state Exp;branches;next ;desc@@1.10log@*** empty log message ***@text@/* mii-tool: monitor and control the MII for a network interface Usage: mii-tool [-VvRrw] [-A media,... | -F media] [interface ...] This program is based on Donald Becker's "mii-diag" program, which is more capable and verbose than this tool, but also somewhat harder to use. Copyright (C) 2000 David A. Hinds -- dhinds@@pcmcia.sourceforge.org mii-diag is written/copyright 1997-2000 by Donald Becker <becker@@scyld.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. Donald Becker may be reached as becker@@scyld.com, or C/O Scyld Computing Corporation, 410 Severn Av., Suite 210, Annapolis, MD 21403 References http://www.scyld.com/diag/mii-status.html http://www.scyld.com/expert/NWay.html http://www.national.com/pf/DP/DP83840.html*/static char version[] ="mii-tool.c $Revision: 1.9 $ $Date: 2000/04/28 00:56:08 $ (David Hinds)\n";#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <ctype.h>#include <string.h>#include <errno.h>#include <fcntl.h>#include <getopt.h>#include <time.h>#include <syslog.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/ioctl.h>#include <net/if.h>#ifdef use_linux_libc5#include <linux/if_arp.h>#include <linux/if_ether.h>#endif#include "mii.h"#define MAX_ETH 8 /* Maximum # of interfaces *//* Table of known MII's */static struct { u_short id1, id2; char *name;} mii_id[] = { { 0x0022, 0x5610, "AdHoc AH101LF" }, { 0x0022, 0x5520, "Altimata AC101LF" }, { 0x0000, 0x6b90, "AMD 79C901A HomePNA" }, { 0x0000, 0x6b70, "AMD 79C901A 10baseT" }, { 0x0181, 0xb800, "Davicom DM9101" }, { 0x0043, 0x7411, "Enable EL40-331" }, { 0x0015, 0xf410, "ICS 1889" }, { 0x0015, 0xf420, "ICS 1890" }, { 0x0015, 0xf430, "ICS 1892" }, { 0x02a8, 0x0150, "Intel 82555" }, { 0x7810, 0x0000, "Level One LXT970" }, { 0x0013, 0x78e0, "Level One LXT971/972" }, { 0x0043, 0x7410, "Lucent LU3X31" }, { 0x0180, 0x7640, "Lucent LU6612" }, { 0x2000, 0x5c00, "National DP83840A" }, { 0x0181, 0x4410, "Quality QS6612" }, { 0x0282, 0x1c50, "SMSC 83C180" }, { 0x0300, 0xe540, "TDK 78Q2120" },};#define NMII (sizeof(mii_id)/sizeof(mii_id[0]))/*--------------------------------------------------------------------*/struct option longopts[] = { /* { name has_arg *flag val } */ {"advertise", 1, 0, 'A'}, /* Change capabilities advertised. */ {"force", 1, 0, 'F'}, /* Change capabilities advertised. */ {"phy", 1, 0, 'p'}, /* Set PHY (MII address) to report. */ {"log", 0, 0, 'l'}, /* Set PHY (MII address) to report. */ {"restart", 0, 0, 'r'}, /* Restart link negotiation */ {"reset", 0, 0, 'R'}, /* Reset the transceiver. */ {"verbose", 0, 0, 'v'}, /* Report each action taken. */ {"version", 0, 0, 'V'}, /* Emit version information. */ {"watch", 0, 0, 'w'}, /* Constantly monitor the port. */ {"help", 0, 0, '?'}, /* Give help */ { 0, 0, 0, 0 }};static unsigned int verbose = 0, opt_version = 0, opt_restart = 0, opt_reset = 0, opt_log = 0, opt_watch = 0;static int nway_advertise = 0;static int fixed_speed = 0;static int override_phy = -1;static int skfd = -1; /* AF_INET socket for ioctl() calls. */static struct ifreq ifr;/*--------------------------------------------------------------------*/static int mdio_read(int skfd, int location){ struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; mii->reg_num = location; if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0) { fprintf(stderr, "SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name, strerror(errno)); return -1; } return mii->val_out;}static void mdio_write(int skfd, int location, int value){ struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; mii->reg_num = location; mii->val_in = value; if (ioctl(skfd, SIOCSMIIREG, &ifr) < 0) { fprintf(stderr, "SIOCSMIIREG on %s failed: %s\n", ifr.ifr_name, strerror(errno)); }}/*--------------------------------------------------------------------*/const struct { char *name; u_short value;} media[] = { /* The order through 100baseT4 matches bits in the BMSR */ { "10baseT-HD", MII_AN_10BASET_HD }, { "10baseT-FD", MII_AN_10BASET_FD }, { "100baseTx-HD", MII_AN_100BASETX_HD }, { "100baseTx-FD", MII_AN_100BASETX_FD }, { "100baseT4", MII_AN_100BASET4 }, { "100baseTx", MII_AN_100BASETX_FD | MII_AN_100BASETX_HD }, { "10baseT", MII_AN_10BASET_FD | MII_AN_10BASET_HD },};#define NMEDIA (sizeof(media)/sizeof(media[0])) /* Parse an argument list of media types */static int parse_media(char *arg){ int mask, i; char *s; mask = strtoul(arg, &s, 16); if ((*arg != '\0') && (*s == '\0')) { if ((mask & MII_AN_ABILITY_MASK) && !(mask & ~MII_AN_ABILITY_MASK)) return mask; goto failed; } else { mask = 0; s = strtok(arg, ", "); do { for (i = 0; i < NMEDIA; i++) if (strcasecmp(media[i].name, s) == 0) break; if (i == NMEDIA) goto failed; mask |= media[i].value; } while ((s = strtok(NULL, ", ")) != NULL); } return mask;failed: fprintf(stderr, "Invalid media specification '%s'.\n", arg); return -1;}/*--------------------------------------------------------------------*/static char *media_list(int mask, int best){ static char buf[100]; int i; *buf = '\0'; mask >>= 5; for (i = 4; i >= 0; i--) { if (mask & (1<<i)) { strcat(buf, " "); strcat(buf, media[i].name); if (best) break; } } if (mask & (1<<5)) strcat(buf, " flow-control"); return buf;}int show_basic_mii(int sock, int phy_id){ char buf[100]; int i, mii_val[32]; int bmcr, bmsr, advert, lkpar; /* Some bits in the BMSR are latched, but we can't rely on being the only reader, so only the current values are meaningful */ mdio_read(sock, MII_BMSR); for (i = 0; i < ((verbose > 1) ? 32 : 8); i++) mii_val[i] = mdio_read(sock, i); if (mii_val[MII_BMCR] == 0xffff) { fprintf(stderr, " No MII transceiver present!.\n"); return -1; } /* Descriptive rename. */ bmcr = mii_val[MII_BMCR]; bmsr = mii_val[MII_BMSR]; advert = mii_val[MII_ANAR]; lkpar = mii_val[MII_ANLPAR]; sprintf(buf, "%s: ", ifr.ifr_name); if (bmcr & MII_BMCR_AN_ENA) { if (bmsr & MII_BMSR_AN_COMPLETE) { if (advert & lkpar) { strcat(buf, (lkpar & MII_AN_ACK) ? "negotiated" : "no autonegotiation,"); strcat(buf, media_list(advert & lkpar, 1)); strcat(buf, ", "); } else { strcat(buf, "autonegotiation failed, "); } } else if (bmcr & MII_BMCR_RESTART) { strcat(buf, "autonegotiation restarted, "); } } else { sprintf(buf+strlen(buf), "%s Mbit, %s duplex, ", (bmcr & MII_BMCR_100MBIT) ? "100" : "10", (bmcr & MII_BMCR_DUPLEX) ? "full" : "half"); } strcat(buf, (bmsr & MII_BMSR_LINK_VALID) ? "link ok" : "no link"); if (opt_watch) { if (opt_log) { syslog(LOG_INFO, buf); } else { char s[20]; time_t t = time(NULL); strftime(s, sizeof(s), "%T", localtime(&t)); printf("%s %s\n", s, buf); } } else { printf("%s\n", buf); } if (verbose > 1) { printf(" registers for MII PHY %d: ", phy_id); for (i = 0; i < 32; i++) printf("%s %4.4x", ((i % 8) ? "" : "\n "), mii_val[i]); printf("\n"); } if (verbose) { printf(" product info: "); for (i = 0; i < NMII; i++) if ((mii_id[i].id1 == mii_val[2]) && (mii_id[i].id2 == (mii_val[3] & 0xfff0))) break; if (i < NMII) printf("%s rev %d\n", mii_id[i].name, mii_val[3]&0x0f); else printf("vendor %02x:%02x:%02x, model %d rev %d\n", mii_val[2]>>10, (mii_val[2]>>2)&0xff, ((mii_val[2]<<6)|(mii_val[3]>>10))&0xff, (mii_val[3]>>4)&0x3f, mii_val[3]&0x0f); printf(" basic mode: "); if (bmcr & MII_BMCR_RESET) printf("software reset, "); if (bmcr & MII_BMCR_LOOPBACK) printf("loopback, "); if (bmcr & MII_BMCR_ISOLATE) printf("isolate, "); if (bmcr & MII_BMCR_COLTEST) printf("collision test, "); if (bmcr & MII_BMCR_AN_ENA) { printf("autonegotiation enabled\n"); } else { printf("%s Mbit, %s duplex\n", (bmcr & MII_BMCR_100MBIT) ? "100" : "10", (bmcr & MII_BMCR_DUPLEX) ? "full" : "half"); } printf(" basic status: "); if (bmsr & MII_BMSR_AN_COMPLETE) printf("autonegotiation complete, "); else if (bmcr & MII_BMCR_RESTART) printf("autonegotiation restarted, "); if (bmsr & MII_BMSR_REMOTE_FAULT) printf("remote fault, "); printf((bmsr & MII_BMSR_LINK_VALID) ? "link ok" : "no link"); printf("\n capabilities:%s", media_list(bmsr >> 6, 0)); printf("\n advertising: %s", media_list(advert, 0)); if (lkpar & MII_AN_ABILITY_MASK) printf("\n link partner:%s", media_list(lkpar, 0)); printf("\n"); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -