diff --git a/net-tools-1.60-mii-refactor.patch b/net-tools-1.60-mii-refactor.patch new file mode 100644 index 0000000..8f5a582 --- /dev/null +++ b/net-tools-1.60-mii-refactor.patch @@ -0,0 +1,224 @@ +diff -up net-tools-1.60/mii-tool.c.mii-refactor net-tools-1.60/mii-tool.c +--- net-tools-1.60/mii-tool.c.mii-refactor 2009-10-30 16:25:23.000000000 +0100 ++++ net-tools-1.60/mii-tool.c 2009-10-30 16:45:01.000000000 +0100 +@@ -50,9 +50,11 @@ static char version[] = + #include + #include + #endif +-#include "mii.h" ++#include ++#include + + #define MAX_ETH 8 /* Maximum # of interfaces */ ++#define LPA_ABILITY_MASK 0x07e0 + + /* Table of known MII's */ + static struct { +@@ -112,7 +114,7 @@ static struct ifreq ifr; + + static int mdio_read(int skfd, int location) + { +- struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; ++ struct mii_ioctl_data *mii = (struct mii_ioctl_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, +@@ -124,7 +126,7 @@ static int mdio_read(int skfd, int locat + + static void mdio_write(int skfd, int location, int value) + { +- struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; ++ struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data; + mii->reg_num = location; + mii->val_in = value; + if (ioctl(skfd, SIOCSMIIREG, &ifr) < 0) { +@@ -140,13 +142,13 @@ const struct { + 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 }, ++ { "10baseT-HD", LPA_10HALF }, ++ { "10baseT-FD", LPA_10FULL }, ++ { "100baseTx-HD", LPA_100HALF }, ++ { "100baseTx-FD", LPA_100FULL }, ++ { "100baseT4", LPA_100BASE4 }, ++ { "100baseTx", LPA_100FULL | LPA_100HALF }, ++ { "10baseT", LPA_10FULL | LPA_10HALF }, + }; + #define NMEDIA (sizeof(media)/sizeof(media[0])) + +@@ -157,8 +159,8 @@ static int parse_media(char *arg) + char *s; + mask = strtoul(arg, &s, 16); + if ((*arg != '\0') && (*s == '\0')) { +- if ((mask & MII_AN_ABILITY_MASK) && +- !(mask & ~MII_AN_ABILITY_MASK)) ++ if ((mask & LPA_ABILITY_MASK) && ++ !(mask & ~LPA_ABILITY_MASK)) + return mask; + goto failed; + } else { +@@ -202,13 +204,22 @@ 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); +- ++ for (i = 0; i < ((verbose > 1) ? 32 : 8); i++) { ++ if ((i == MII_BMCR) || (i == MII_BMSR) || (i == MII_PHYSID1) || ++ (i == MII_PHYSID2) || (i == MII_ADVERTISE) || (i == MII_LPA) || ++ (i == MII_EXPANSION) || (i == MII_CTRL1000) || (i == MII_STAT1000) || ++ (i == MII_ESTATUS) || (i == MII_DCOUNTER) || (i == MII_FCSCOUNTER) || ++ (i == MII_NWAYTEST) || (i == MII_RERRCOUNTER) || ++ (i == MII_SREVISION) || (i == MII_RESV1) || (i == MII_LBRERROR) || ++ (i == MII_PHYADDR) || (i == MII_RESV2) || ++ (i == MII_TPISTATUS) || (i == MII_NCONFIG)) ++ mii_val[i] = mdio_read(sock, i); ++ else ++ mii_val[i] = 0; ++ } + if (mii_val[MII_BMCR] == 0xffff) { + fprintf(stderr, " No MII transceiver present!.\n"); + return -1; +@@ -216,28 +227,28 @@ int show_basic_mii(int sock, int phy_id) + + /* Descriptive rename. */ + bmcr = mii_val[MII_BMCR]; bmsr = mii_val[MII_BMSR]; +- advert = mii_val[MII_ANAR]; lkpar = mii_val[MII_ANLPAR]; ++ advert = mii_val[MII_ADVERTISE]; lkpar = mii_val[MII_LPA]; + + sprintf(buf, "%s: ", ifr.ifr_name); +- if (bmcr & MII_BMCR_AN_ENA) { +- if (bmsr & MII_BMSR_AN_COMPLETE) { ++ if (bmcr & BMCR_ANENABLE) { ++ if (bmsr & BMSR_ANEGCOMPLETE) { + if (advert & lkpar) { +- strcat(buf, (lkpar & MII_AN_ACK) ? ++ strcat(buf, (lkpar & LPA_LPACK) ? + "negotiated" : "no autonegotiation,"); + strcat(buf, media_list(advert & lkpar, 1)); + strcat(buf, ", "); + } else { + strcat(buf, "autonegotiation failed, "); + } +- } else if (bmcr & MII_BMCR_RESTART) { ++ } else if (bmcr & BMCR_ANRESTART) { + 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"); ++ (bmcr & BMCR_SPEED100) ? "100" : "10", ++ (bmcr & BMCR_FULLDPLX) ? "full" : "half"); + } +- strcat(buf, (bmsr & MII_BMSR_LINK_VALID) ? "link ok" : "no link"); ++ strcat(buf, (bmsr & BMSR_LSTATUS) ? "link ok" : "no link"); + + if (opt_watch) { + if (opt_log) { +@@ -273,32 +284,32 @@ int show_basic_mii(int sock, int phy_id) + ((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) ++ if (bmcr & BMCR_RESET) + printf("software reset, "); +- if (bmcr & MII_BMCR_LOOPBACK) ++ if (bmcr & BMCR_LOOPBACK) + printf("loopback, "); +- if (bmcr & MII_BMCR_ISOLATE) ++ if (bmcr & BMCR_ISOLATE) + printf("isolate, "); +- if (bmcr & MII_BMCR_COLTEST) ++ if (bmcr & BMCR_CTST) + printf("collision test, "); +- if (bmcr & MII_BMCR_AN_ENA) { ++ if (bmcr & BMCR_ANENABLE) { + printf("autonegotiation enabled\n"); + } else { + printf("%s Mbit, %s duplex\n", +- (bmcr & MII_BMCR_100MBIT) ? "100" : "10", +- (bmcr & MII_BMCR_DUPLEX) ? "full" : "half"); ++ (bmcr & BMCR_SPEED100) ? "100" : "10", ++ (bmcr & BMCR_FULLDPLX) ? "full" : "half"); + } + printf(" basic status: "); +- if (bmsr & MII_BMSR_AN_COMPLETE) ++ if (bmsr & BMSR_ANEGCOMPLETE) + printf("autonegotiation complete, "); +- else if (bmcr & MII_BMCR_RESTART) ++ else if (bmcr & BMCR_ANRESTART) + printf("autonegotiation restarted, "); +- if (bmsr & MII_BMSR_REMOTE_FAULT) ++ if (bmsr & BMSR_RFAULT) + printf("remote fault, "); +- printf((bmsr & MII_BMSR_LINK_VALID) ? "link ok" : "no link"); ++ printf((bmsr & BMSR_LSTATUS) ? "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) ++ if (lkpar & LPA_ABILITY_MASK) + printf("\n link partner:%s", media_list(lkpar, 0)); + printf("\n"); + } +@@ -310,7 +321,7 @@ int show_basic_mii(int sock, int phy_id) + + static int do_one_xcvr(int skfd, char *ifname, int maybe) + { +- struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; ++ struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data; + + /* Get the vitals from the interface. */ + strncpy(ifr.ifr_name, ifname, IFNAMSIZ); +@@ -328,23 +339,23 @@ static int do_one_xcvr(int skfd, char *i + + if (opt_reset) { + printf("resetting the transceiver...\n"); +- mdio_write(skfd, MII_BMCR, MII_BMCR_RESET); ++ mdio_write(skfd, MII_BMCR, BMCR_RESET); + } + if (nway_advertise) { +- mdio_write(skfd, MII_ANAR, nway_advertise | 1); ++ mdio_write(skfd, MII_ADVERTISE, nway_advertise | 1); + opt_restart = 1; + } + if (opt_restart) { + printf("restarting autonegotiation...\n"); + mdio_write(skfd, MII_BMCR, 0x0000); +- mdio_write(skfd, MII_BMCR, MII_BMCR_AN_ENA|MII_BMCR_RESTART); ++ mdio_write(skfd, MII_BMCR, BMCR_ANENABLE|BMCR_ANRESTART); + } + if (fixed_speed) { + int bmcr = 0; +- if (fixed_speed & (MII_AN_100BASETX_FD|MII_AN_100BASETX_HD)) +- bmcr |= MII_BMCR_100MBIT; +- if (fixed_speed & (MII_AN_100BASETX_FD|MII_AN_10BASET_FD)) +- bmcr |= MII_BMCR_DUPLEX; ++ if (fixed_speed & (LPA_100FULL|LPA_100HALF)) ++ bmcr |= BMCR_SPEED100; ++ if (fixed_speed & (LPA_100FULL|LPA_10FULL)) ++ bmcr |= BMCR_FULLDPLX; + mdio_write(skfd, MII_BMCR, bmcr); + } + +@@ -358,7 +369,7 @@ static int do_one_xcvr(int skfd, char *i + + static void watch_one_xcvr(int skfd, char *ifname, int index) + { +- struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; ++ struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data; + static int status[MAX_ETH] = { 0, /* ... */ }; + int now; + diff --git a/net-tools.spec b/net-tools.spec index 7453452..e7e0bcf 100644 --- a/net-tools.spec +++ b/net-tools.spec @@ -3,7 +3,7 @@ Summary: Basic networking tools Name: net-tools Version: 1.60 -Release: 94%{?dist} +Release: 95%{?dist} License: GPL+ Group: System Environment/Base URL: http://net-tools.berlios.de/ @@ -84,6 +84,7 @@ Patch70: net-tools-1.60-metric-tunnel-man.patch Patch71: net-tools-1.60-netstat-probe.patch Patch72: net-tools-1.60-scanf-format.patch Patch73: net-tools-1.60-hostname-short.patch +Patch74: net-tools-1.60-mii-refactor.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires(post): /sbin/chkconfig @@ -168,6 +169,7 @@ ifconfig, netstat, route, and others. %patch71 -p1 -b .probe %patch72 -p1 -b .scanf-format %patch73 -p1 -b .hostname-short +%patch74 -p1 -b .mii-refactor cp %SOURCE2 ./config.h cp %SOURCE3 ./config.make @@ -283,6 +285,9 @@ exit 0 %{_sysconfdir}/rc.d/init.d/netplugd %changelog +* Wed Nov 4 2009 Jiri Popelka - 1.60-95 +- in mii-tool.c use instead of "mii.h" and fix Bug #491358 + * Thu Oct 29 2009 Jiri Popelka - 1.60-94 - Make "hostname -s" display host name cut at the first dot (no matter if the host name resolves or not) (bug #531702)