From 7bfd04605061f3335e7ca19dd968af136fb22201 Mon Sep 17 00:00:00 2001 From: Holger Freyther Date: Thu, 26 Oct 2006 12:38:27 +0000 Subject: packages: Add net-tools to OpenEmbedded --- packages/net-tools/.mtn2git_empty | 0 packages/net-tools/files/.mtn2git_empty | 0 packages/net-tools/files/README | 1 + packages/net-tools/files/ether-wake.8 | 81 +++ packages/net-tools/files/ether-wake.c | 392 +++++++++++++ packages/net-tools/files/mii-diag.8 | 160 +++++ packages/net-tools/files/mii-diag.c | 650 +++++++++++++++++++++ .../net-tools/files/net-tools-1.57-bug22040.patch | 50 ++ .../files/net-tools-1.60-arp_overflow.patch | 11 + .../net-tools/files/net-tools-1.60-bcast.patch | 99 ++++ .../net-tools/files/net-tools-1.60-bitkeeper.patch | 17 + packages/net-tools/files/net-tools-1.60-config.h | 75 +++ .../net-tools/files/net-tools-1.60-config.make | 36 ++ .../net-tools/files/net-tools-1.60-cycle.patch | 311 ++++++++++ packages/net-tools/files/net-tools-1.60-de.patch | 11 + .../files/net-tools-1.60-duplicate-tcp.patch | 194 ++++++ .../net-tools/files/net-tools-1.60-gcc33.patch | 31 + .../net-tools/files/net-tools-1.60-gcc34.patch | 36 ++ .../files/net-tools-1.60-hostname_man.patch | 35 ++ .../net-tools/files/net-tools-1.60-ifaceopt.patch | 52 ++ .../net-tools/files/net-tools-1.60-ifconfig.patch | 107 ++++ .../files/net-tools-1.60-ifconfig_ib.patch | 202 +++++++ .../files/net-tools-1.60-inet6-lookup.patch | 81 +++ .../net-tools/files/net-tools-1.60-interface.patch | 110 ++++ .../files/net-tools-1.60-interface_stack.patch | 115 ++++ packages/net-tools/files/net-tools-1.60-ipx.patch | 36 ++ .../net-tools/files/net-tools-1.60-isofix.patch | 33 ++ packages/net-tools/files/net-tools-1.60-man.patch | 132 +++++ .../net-tools/files/net-tools-1.60-manydevs.patch | 13 + .../files/net-tools-1.60-mii-tool-obsolete.patch | 25 + .../net-tools/files/net-tools-1.60-miiioctl.patch | 17 + .../net-tools/files/net-tools-1.60-nameif.patch | 67 +++ .../net-tools/files/net-tools-1.60-netmask.patch | 61 ++ .../files/net-tools-1.60-netstat_stop_trim.patch | 80 +++ .../files/net-tools-1.60-netstat_ulong.patch | 11 + packages/net-tools/files/net-tools-1.60-note.patch | 13 + .../net-tools/files/net-tools-1.60-num-ports.patch | 78 +++ .../net-tools/files/net-tools-1.60-overflow.patch | 63 ++ .../net-tools/files/net-tools-1.60-parse.patch | 70 +++ packages/net-tools/files/net-tools-1.60-pie.patch | 13 + .../net-tools/files/net-tools-1.60-return.patch | 28 + .../net-tools/files/net-tools-1.60-selinux.patch | 205 +++++++ .../net-tools/files/net-tools-1.60-siunits.patch | 80 +++ .../net-tools/files/net-tools-1.60-statalias.patch | 15 + .../files/net-tools-1.60-statistics.patch | 65 +++ packages/net-tools/files/net-tools-1.60-stdo.patch | 11 + .../files/net-tools-1.60-trailingblank.patch | 26 + .../files/net-tools-1.60-trim_iface.patch | 31 + .../net-tools/files/net-tools-1.60-trunc.patch | 42 ++ .../net-tools/files/net-tools-1.60-ulong.patch | 215 +++++++ .../files/net-tools-1.60-virtualname.patch | 36 ++ packages/net-tools/net-tools_1.60.bb | 90 +++ 52 files changed, 4413 insertions(+) create mode 100644 packages/net-tools/.mtn2git_empty create mode 100644 packages/net-tools/files/.mtn2git_empty create mode 100644 packages/net-tools/files/README create mode 100644 packages/net-tools/files/ether-wake.8 create mode 100644 packages/net-tools/files/ether-wake.c create mode 100644 packages/net-tools/files/mii-diag.8 create mode 100644 packages/net-tools/files/mii-diag.c create mode 100644 packages/net-tools/files/net-tools-1.57-bug22040.patch create mode 100644 packages/net-tools/files/net-tools-1.60-arp_overflow.patch create mode 100644 packages/net-tools/files/net-tools-1.60-bcast.patch create mode 100644 packages/net-tools/files/net-tools-1.60-bitkeeper.patch create mode 100644 packages/net-tools/files/net-tools-1.60-config.h create mode 100644 packages/net-tools/files/net-tools-1.60-config.make create mode 100644 packages/net-tools/files/net-tools-1.60-cycle.patch create mode 100644 packages/net-tools/files/net-tools-1.60-de.patch create mode 100644 packages/net-tools/files/net-tools-1.60-duplicate-tcp.patch create mode 100644 packages/net-tools/files/net-tools-1.60-gcc33.patch create mode 100644 packages/net-tools/files/net-tools-1.60-gcc34.patch create mode 100644 packages/net-tools/files/net-tools-1.60-hostname_man.patch create mode 100644 packages/net-tools/files/net-tools-1.60-ifaceopt.patch create mode 100644 packages/net-tools/files/net-tools-1.60-ifconfig.patch create mode 100644 packages/net-tools/files/net-tools-1.60-ifconfig_ib.patch create mode 100644 packages/net-tools/files/net-tools-1.60-inet6-lookup.patch create mode 100644 packages/net-tools/files/net-tools-1.60-interface.patch create mode 100644 packages/net-tools/files/net-tools-1.60-interface_stack.patch create mode 100644 packages/net-tools/files/net-tools-1.60-ipx.patch create mode 100644 packages/net-tools/files/net-tools-1.60-isofix.patch create mode 100644 packages/net-tools/files/net-tools-1.60-man.patch create mode 100644 packages/net-tools/files/net-tools-1.60-manydevs.patch create mode 100644 packages/net-tools/files/net-tools-1.60-mii-tool-obsolete.patch create mode 100644 packages/net-tools/files/net-tools-1.60-miiioctl.patch create mode 100644 packages/net-tools/files/net-tools-1.60-nameif.patch create mode 100644 packages/net-tools/files/net-tools-1.60-netmask.patch create mode 100644 packages/net-tools/files/net-tools-1.60-netstat_stop_trim.patch create mode 100644 packages/net-tools/files/net-tools-1.60-netstat_ulong.patch create mode 100644 packages/net-tools/files/net-tools-1.60-note.patch create mode 100644 packages/net-tools/files/net-tools-1.60-num-ports.patch create mode 100644 packages/net-tools/files/net-tools-1.60-overflow.patch create mode 100644 packages/net-tools/files/net-tools-1.60-parse.patch create mode 100644 packages/net-tools/files/net-tools-1.60-pie.patch create mode 100644 packages/net-tools/files/net-tools-1.60-return.patch create mode 100644 packages/net-tools/files/net-tools-1.60-selinux.patch create mode 100644 packages/net-tools/files/net-tools-1.60-siunits.patch create mode 100644 packages/net-tools/files/net-tools-1.60-statalias.patch create mode 100644 packages/net-tools/files/net-tools-1.60-statistics.patch create mode 100644 packages/net-tools/files/net-tools-1.60-stdo.patch create mode 100644 packages/net-tools/files/net-tools-1.60-trailingblank.patch create mode 100644 packages/net-tools/files/net-tools-1.60-trim_iface.patch create mode 100644 packages/net-tools/files/net-tools-1.60-trunc.patch create mode 100644 packages/net-tools/files/net-tools-1.60-ulong.patch create mode 100644 packages/net-tools/files/net-tools-1.60-virtualname.patch create mode 100644 packages/net-tools/net-tools_1.60.bb (limited to 'packages') diff --git a/packages/net-tools/.mtn2git_empty b/packages/net-tools/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/net-tools/files/.mtn2git_empty b/packages/net-tools/files/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/net-tools/files/README b/packages/net-tools/files/README new file mode 100644 index 0000000000..76e14a2341 --- /dev/null +++ b/packages/net-tools/files/README @@ -0,0 +1 @@ +Patches were downloaded from http://ftp.uni-koeln.de/mirrors/fedora/linux/core/5/source/SRPMS/net-tools-1.60-62.1.src.rpm diff --git a/packages/net-tools/files/ether-wake.8 b/packages/net-tools/files/ether-wake.8 new file mode 100644 index 0000000000..26b4f85a8a --- /dev/null +++ b/packages/net-tools/files/ether-wake.8 @@ -0,0 +1,81 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH ETHER-WAKE 8 "March 31, 2003" "Scyld" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +ether-wake \- A tool to send a Wake-On-LAN "Magic Packet" +.SH SYNOPSIS +.B ether-wake +.RI [ options ] " Host-ID" +.SH DESCRIPTION +This manual page documents the usage of the +.B ether-wake +command. +.PP +.\" TeX users may be more comfortable with the \fB\fP and +.\" \fI\fP escape sequences to invode bold face and italics, +.\" respectively. +\fBether-wake\fP is a program that generates and transmits a Wake-On-LAN +(WOL) "Magic Packet", used for restarting machines that have been +soft-powered-down (ACPI D3-warm state). It generates the standard +AMD Magic Packet format, optionally with a password included. The +single required parameter is a station (MAC) address or a host ID that can +be translated to a MAC address by an +.BR ethers (5) +database specified in +.BR nsswitch.conf (5) +. +.SH OPTIONS +\fBether-wake\fP needs a single dash (´-´) in front of options. +A summary of options is included below. +.TP +.B \-b +Send the wake-up packet to the broadcast address. +.TP +.B \-D +Increase the Debug Level. +.TP +.B \-i ifname +Use interface ifname instead of the default "eth0". +.TP +.B \-p passwd +Append a four or six byte password to the packet. Only a few adapters +need or support this. A six byte password may be specified in Ethernet hex +format (00:22:44:66:88:aa) or four byte dotted decimal (192.168.1.1) format. +A four byte password must use the dotted decimal format. + +.TP +.B \-V +Show the program version information. + +.SH EXIT STATUS +This program returns 0 on success. +A permission failures (e.g. run as a non-root user) results in an exit +status of 2. Unrecognized or invalid parameters result in an exit +status of 3. Failure to retrieve network interface information or send +a packet will result in an exit status of 1. + +.SH SEE ALSO +.BR arp (8). +.br +.SH SECURITY +On some non-Linux systems dropping root capability allows the process to be +dumped, traced or debugged. +If someone traces this program, they get control of a raw socket. +Linux handles this safely, but beware when porting this program. +.SH AUTHOR +The etherwake program was written by Donald Becker at Scyld Computing +Corporation for use with the Scyld(\*(Tm) Beowulf System. diff --git a/packages/net-tools/files/ether-wake.c b/packages/net-tools/files/ether-wake.c new file mode 100644 index 0000000000..eef22a7ab2 --- /dev/null +++ b/packages/net-tools/files/ether-wake.c @@ -0,0 +1,392 @@ +/* ether-wake.c: Send a magic packet to wake up sleeping machines. */ + +static char version_msg[] = +"ether-wake.c: v1.09 11/12/2003 Donald Becker, http://www.scyld.com/"; +static char brief_usage_msg[] = +"usage: ether-wake [-i ] [-p aa:bb:cc:dd[:ee:ff]] 00:11:22:33:44:55\n" +" Use '-u' to see the complete set of options.\n"; +static char usage_msg[] = +"usage: ether-wake [-i ] [-p aa:bb:cc:dd[:ee:ff]] 00:11:22:33:44:55\n" +"\n" +" This program generates and transmits a Wake-On-LAN (WOL)\n" +" \"Magic Packet\", used for restarting machines that have been\n" +" soft-powered-down (ACPI D3-warm state).\n" +" It currently generates the standard AMD Magic Packet format, with\n" +" an optional password appended.\n" +"\n" +" The single required parameter is the Ethernet MAC (station) address\n" +" of the machine to wake or a host ID with known NSS 'ethers' entry.\n" +" The MAC address may be found with the 'arp' program while the target\n" +" machine is awake.\n" +"\n" +" Options:\n" +" -b Send wake-up packet to the broadcast address.\n" +" -D Increase the debug level.\n" +" -i ifname Use interface IFNAME instead of the default 'eth0'.\n" +" -p Append the four or six byte password PW to the packet.\n" +" A password is only required for a few adapter types.\n" +" The password may be specified in ethernet hex format\n" +" or dotted decimal (Internet address)\n" +" -p 00:22:44:66:88:aa\n" +" -p 192.168.1.1\n"; + +/* + This program generates and transmits a Wake-On-LAN (WOL) "Magic Packet", + used for restarting machines that have been soft-powered-down + (ACPI D3-warm state). It currently generates the standard AMD Magic Packet + format, with an optional password appended. + + This software may be used and distributed according to the terms + of the GNU Public License, incorporated herein by reference. + Contact the author for use under other terms. + + This source file was originally part of the network tricks package, and + is now distributed to support the Scyld Beowulf system. + Copyright 1999-2003 Donald Becker and Scyld Computing Corporation. + + The author may be reached as becker@scyld, or C/O + Scyld Computing Corporation + 914 Bay Ridge Road, Suite 220 + Annapolis MD 21403 + + Notes: + On some systems dropping root capability allows the process to be + dumped, traced or debugged. + If someone traces this program, they get control of a raw socket. + Linux handles this safely, but beware when porting this program. + + An alternative to needing 'root' is using a UDP broadcast socket, however + doing so only works with adapters configured for unicast+broadcast Rx + filter. That configuration consumes more power. +*/ + +#include +#include +#include +#include +#include +#include + +#if 0 /* Only exists on some versions. */ +#include +#endif + +#include + +#include +#include +#include + +#include +#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1 +#include +#include +#else +#include +#include +#include +#endif +#include +#include + +/* Grrr, no consistency between include versions. + Enable this if setsockopt() isn't declared with your library. */ +#if 0 +extern int setsockopt __P ((int __fd, int __level, int __optname, + __ptr_t __optval, int __optlen)); +#else /* New, correct head files. */ +#include +#endif + +u_char outpack[1000]; +int outpack_sz = 0; +int debug = 0; +u_char wol_passwd[6]; +int wol_passwd_sz = 0; + +static int opt_no_src_addr = 0, opt_broadcast = 0; + +static int get_dest_addr(const char *arg, struct ether_addr *eaddr); +static int get_fill(unsigned char *pkt, struct ether_addr *eaddr); +static int get_wol_pw(const char *optarg); + +int main(int argc, char *argv[]) +{ + char *ifname = "eth0"; + int one = 1; /* True, for socket options. */ + int s; /* Raw socket */ + int errflag = 0, verbose = 0, do_version = 0; + int perm_failure = 0; + int i, c, pktsize; +#if defined(PF_PACKET) + struct sockaddr_ll whereto; +#else + struct sockaddr whereto; /* who to wake up */ +#endif + struct ether_addr eaddr; + + while ((c = getopt(argc, argv, "bDi:p:uvV")) != -1) + switch (c) { + case 'b': opt_broadcast++; break; + case 'D': debug++; break; + case 'i': ifname = optarg; break; + case 'p': get_wol_pw(optarg); break; + case 'u': printf(usage_msg); return 0; + case 'v': verbose++; break; + case 'V': do_version++; break; + case '?': + errflag++; + } + if (verbose || do_version) + printf("%s\n", version_msg); + if (errflag) { + fprintf(stderr, brief_usage_msg); + return 3; + } + + if (optind == argc) { + fprintf(stderr, "Specify the Ethernet address as 00:11:22:33:44:55.\n"); + return 3; + } + + /* Note: PF_INET, SOCK_DGRAM, IPPROTO_UDP would allow SIOCGIFHWADDR to + work as non-root, but we need SOCK_PACKET to specify the Ethernet + destination address. */ +#if defined(PF_PACKET) + s = socket(PF_PACKET, SOCK_RAW, 0); +#else + s = socket(AF_INET, SOCK_PACKET, SOCK_PACKET); +#endif + if (s < 0) { + if (errno == EPERM) + fprintf(stderr, "ether-wake: This program must be run as root.\n"); + else + perror("ether-wake: socket"); + perm_failure++; + } + /* Don't revert if debugging allows a normal user to get the raw socket. */ + setuid(getuid()); + + /* We look up the station address before reporting failure so that + errors may be reported even when run as a normal user. + */ + if (get_dest_addr(argv[optind], &eaddr) != 0) + return 3; + if (perm_failure && ! debug) + return 2; + + pktsize = get_fill(outpack, &eaddr); + + /* Fill in the source address, if possible. + The code to retrieve the local station address is Linux specific. */ + if (! opt_no_src_addr) { + struct ifreq if_hwaddr; + unsigned char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data; + + strcpy(if_hwaddr.ifr_name, ifname); + if (ioctl(s, SIOCGIFHWADDR, &if_hwaddr) < 0) { + fprintf(stderr, "SIOCGIFHWADDR on %s failed: %s\n", ifname, + strerror(errno)); + /* Magic packets still work if our source address is bogus, but + we fail just to be anal. */ + return 1; + } + memcpy(outpack+6, if_hwaddr.ifr_hwaddr.sa_data, 6); + + if (verbose) { + printf("The hardware address (SIOCGIFHWADDR) of %s is type %d " + "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", ifname, + if_hwaddr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1], + hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]); + } + } + + if (wol_passwd_sz > 0) { + memcpy(outpack+pktsize, wol_passwd, wol_passwd_sz); + pktsize += wol_passwd_sz; + } + + if (verbose > 1) { + printf("The final packet is: "); + for (i = 0; i < pktsize; i++) + printf(" %2.2x", outpack[i]); + printf(".\n"); + } + + /* This is necessary for broadcasts to work */ + if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&one, sizeof(one)) < 0) + perror("setsockopt: SO_BROADCAST"); + +#if defined(PF_PACKET) + { + struct ifreq ifr; + strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (ioctl(s, SIOCGIFINDEX, &ifr) == -1) { + fprintf(stderr, "SIOCGIFINDEX on %s failed: %s\n", ifname, + strerror(errno)); + return 1; + } + memset(&whereto, 0, sizeof(whereto)); + whereto.sll_family = AF_PACKET; + whereto.sll_ifindex = ifr.ifr_ifindex; + /* The manual page incorrectly claims the address must be filled. + We do so because the code may change to match the docs. */ + whereto.sll_halen = ETH_ALEN; + memcpy(whereto.sll_addr, outpack, ETH_ALEN); + + } +#else + whereto.sa_family = 0; + strcpy(whereto.sa_data, ifname); +#endif + + if ((i = sendto(s, outpack, pktsize, 0, (struct sockaddr *)&whereto, + sizeof(whereto))) < 0) + perror("sendto"); + else if (debug) + printf("Sendto worked ! %d.\n", i); + +#ifdef USE_SEND + if (bind(s, (struct sockaddr *)&whereto, sizeof(whereto)) < 0) + perror("bind"); + else if (send(s, outpack, 100, 0) < 0) + perror("send"); +#endif +#ifdef USE_SENDMSG + { + struct msghdr msghdr = { 0,}; + struct iovec iovector[1]; + msghdr.msg_name = &whereto; + msghdr.msg_namelen = sizeof(whereto); + msghdr.msg_iov = iovector; + msghdr.msg_iovlen = 1; + iovector[0].iov_base = outpack; + iovector[0].iov_len = pktsize; + if ((i = sendmsg(s, &msghdr, 0)) < 0) + perror("sendmsg"); + else if (debug) + printf("sendmsg worked, %d (%d).\n", i, errno); + } +#endif + + return 0; +} + +/* Convert the host ID string to a MAC address. + The string may be a + Host name + IP address string + MAC address string +*/ + +static int get_dest_addr(const char *hostid, struct ether_addr *eaddr) +{ + struct ether_addr *eap; + + eap = ether_aton(hostid); + if (eap) { + *eaddr = *eap; + if (debug) + fprintf(stderr, "The target station address is %s.\n", + ether_ntoa(eaddr)); + } else if (ether_hostton(hostid, eaddr) == 0) { + if (debug) + fprintf(stderr, "Station address for hostname %s is %s.\n", + hostid, ether_ntoa(eaddr)); + } else { + (void)fprintf(stderr, + "ether-wake: The Magic Packet host address must be " + "specified as\n" + " - a station address, 00:11:22:33:44:55, or\n" + " - a hostname with a known 'ethers' entry.\n"); + return -1; + } + return 0; +} + + +static int get_fill(unsigned char *pkt, struct ether_addr *eaddr) +{ + int offset, i; + unsigned char *station_addr = eaddr->ether_addr_octet; + + if (opt_broadcast) + memset(pkt+0, 0xff, 6); + else + memcpy(pkt, station_addr, 6); + memcpy(pkt+6, station_addr, 6); + pkt[12] = 0x08; /* Or 0x0806 for ARP, 0x8035 for RARP */ + pkt[13] = 0x42; + offset = 14; + + memset(pkt+offset, 0xff, 6); + offset += 6; + + for (i = 0; i < 16; i++) { + memcpy(pkt+offset, station_addr, 6); + offset += 6; + } + if (debug) { + fprintf(stderr, "Packet is "); + for (i = 0; i < offset; i++) + fprintf(stderr, " %2.2x", pkt[i]); + fprintf(stderr, ".\n"); + } + return offset; +} + +static int get_wol_pw(const char *optarg) +{ + int passwd[6]; + int byte_cnt; + int i; + + byte_cnt = sscanf(optarg, "%2x:%2x:%2x:%2x:%2x:%2x", + &passwd[0], &passwd[1], &passwd[2], + &passwd[3], &passwd[4], &passwd[5]); + if (byte_cnt < 4) + byte_cnt = sscanf(optarg, "%d.%d.%d.%d", + &passwd[0], &passwd[1], &passwd[2], &passwd[3]); + if (byte_cnt < 4) { + fprintf(stderr, "Unable to read the Wake-On-LAN password.\n"); + return 0; + } + printf(" The Magic packet password is %2.2x %2.2x %2.2x %2.2x (%d).\n", + passwd[0], passwd[1], passwd[2], passwd[3], byte_cnt); + for (i = 0; i < byte_cnt; i++) + wol_passwd[i] = passwd[i]; + return wol_passwd_sz = byte_cnt; +} + +#if 0 +{ + to = (struct sockaddr_in *)&whereto; + to->sin_family = AF_INET; + if (inet_aton(target, &to->sin_addr)) { + hostname = target; + } + memset (&sa, 0, sizeof sa); + sa.sa_family = AF_INET; + strncpy (sa.sa_data, interface, sizeof sa.sa_data); + sendto (sock, buf, bufix + len, 0, &sa, sizeof sa); + strncpy (sa.sa_data, interface, sizeof sa.sa_data); +#if 1 + sendto (sock, buf, bufix + len, 0, &sa, sizeof sa); +#else + bind (sock, &sa, sizeof sa); + connect(); + send (sock, buf, bufix + len, 0); +#endif +} +#endif + + +/* + * Local variables: + * compile-command: "gcc -O -Wall -o ether-wake ether-wake.c" + * c-indent-level: 4 + * c-basic-offset: 4 + * c-indent-level: 4 + * tab-width: 4 + * End: + */ diff --git a/packages/net-tools/files/mii-diag.8 b/packages/net-tools/files/mii-diag.8 new file mode 100644 index 0000000000..aa0dc0be15 --- /dev/null +++ b/packages/net-tools/files/mii-diag.8 @@ -0,0 +1,160 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" $Revision: 1.1 $ $Date: 2003/09/06 17:20:17 $ +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH MII-DIAG 8 "September 9, 2003" "Scyld Beowulf\*(Tm" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +mii-diag \- Network adapter control and monitoring +.SH SYNOPSIS +.B mii-diag +.RI [ options ] +.SH DESCRIPTION +This manual page documents briefly the +.B mii-diag +network adapter control and monitoring command. +Addition documentation is available from http://scyld.com/diag/index.html. + +.\" TeX users may be more comfortable with the \fB\fP and +.\" \fI\fP escape sequences to invoke bold face and italics, +.\" respectively. +.PP +This \fBmii-diag\fP command configures, controls and monitors the +transceiver management registers for network interfaces, and configures +driver operational parameters. For transceiver control \fBmii-diag\fP +uses the Media Independent Interface (MII) standard (thus the command name). +It also has additional Linux-specific controls to communicate parameters +such as message enable settings and buffer sizes to the underlying device +driver. +.PP +The MII standard defines registers that control and report network +transceiver capabilities, link settings and errors. Examples are link +speed, duplex, capabilities advertised to the link partner, status LED +indications and link error counters. + +.SH OPTIONS +The \fBmii-diag\fP command supports both single character and long +option names. Short options use a single dash (´-´) in front of the option +character. For options without parameters, multiple options may be +concatenated after a single dash. Long options are prefixed by two +dashes (´--´), and may be abbreviated with a unique prefix. +A long option may take a parameter of the form --arg=param or --arg param. + +.PP +A summary of options is as follows. + +.TP +.B \-A, --advertise +.BR +.B \-F, --fixed-speed + +Speed is one of: 100baseT4, 100baseTx, 100baseTx-FD, 100baseTx-HD, 10baseT, +10baseT-FD, 10baseT-HD. For more precise control an explict numeric +register setting is also allowed. + + +.TP +.B \-a, \--all-interfaces +Show the status of all interfaces. This option is not recommended with +any other option, especially ones that change settings. + +.TP +.B \-s,\--status +Return exit status 2 if there is no link beat. + +.TP +.B \-D +Increase the debugging level. This may be used to understand the +actions the command is taking. + +.TP +.B \-g, \--read-parameters +Show driver-specific parameters. + +.TP +.B \-G, \--set-parameters value[,value...] +Set driver-specific parameters. +Set a adapter-specific parameters. +Parameters are comma separated, with missing elements retaining the +existing value. + +.TP +.B \-v +Increase the verbosity level. Additional "-v" options increase the +level further. + +.TP +.B \-V +Show the program version information. + +.TP +.B \-w, \--watch +Continuously monitor the transceiver and report changes. + +.TP +.B \-? +Emit usage information. + +.SH DESCRIPTION + +.PP +Calling the command with just the interface name (which defaults to +'eth0' if missing) produces extensive output describing the transceiver +capabilities, configuration and current status. + +.PP +The '--monitor' option allows scripting link beat changes. +.PP +This option is similar to --watch, but with lower overhead and simplifed +output. It polls the interface only once a second and the output format +is a single line per link change with three fixed words + +.PP +Example output: mii-diag --monitor eth0 + down 0x7809 0x0000 + negotiating 0x7829 0x45e1 + up 0x782d 0x45e1 + down 0x7809 0x0000 + +.PP +This may be used as + mii-diag --monitor eth0 | + while read linkstatus bmsr linkpar; do + case $linkstatus in + up) ifup eth0 ;; + down) ifdown eth0 ;; + esac + done + +.PP +It may be useful to shorten the DHCP client daemon timeout if it does +not receive an address by adding the following setting to +/etc/sysconfig/network: +DHCPCDARGS="-t 3" + +.SH SEE ALSO +.BR ether-wake (8), net-diag (8), mii-tool (8). +.br +Addition documentation is available from http://scyld.com/diag/index.html. + +.SH KNOWN BUGS +The --all-interfaces option is quirky. There are very few settings that +are usefully applied to all interfaces. + +.SH AUTHOR +The manual pages, diagnostic commands, and many of the underlying Linux +network drivers were written by Donald Becker for the Scyld +Beowulf(\*(Tm) cluster system. + diff --git a/packages/net-tools/files/mii-diag.c b/packages/net-tools/files/mii-diag.c new file mode 100644 index 0000000000..17d8bef63b --- /dev/null +++ b/packages/net-tools/files/mii-diag.c @@ -0,0 +1,650 @@ +/* Mode: C; + * mii-diag.c: Examine and set the MII registers of a network interfaces. + + Usage: mii-diag [-vw] interface. + + This program reads and writes the Media Independent Interface (MII) + management registers on network transceivers. The registers control + and report network link settings and errors. Examples are link speed, + duplex, capabilities advertised to the link partner, status LED + indications and link error counters. + + Notes: + The compile-command is at the end of this source file. + This program works with drivers that implement MII ioctl() calls. + + Written/copyright 1997-2003 by Donald Becker + + 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. + + The author may be reached as becker@scyld.com, or C/O + Scyld Computing Corporation + 914 Bay Ridge Road, Suite 220 + Annapolis MD 21403 + + References + http://scyld.com/expert/mii-status.html + http://scyld.com/expert/NWay.html + http://www.national.com/pf/DP/DP83840.html +*/ + +static char version[] = +"mii-diag.c:v2.11 3/21/2005 Donald Becker (becker@scyld.com)\n" +" http://www.scyld.com/diag/index.html\n"; + +static const char usage_msg[] = +"Usage: %s [--help] [-aDfrRvVw] [-AF ] [--watch] .\n"; +static const char long_usage_msg[] = +"Usage: %s [-aDfrRvVw] [-AF ] [--watch] .\n\ +\n\ + This program configures and monitors the transceiver management registers\n\ + for network interfaces. It uses the Media Independent Interface (MII)\n\ + standard with additional Linux-specific controls to communicate with the\n\ + underlying device driver. The MII registers control and report network\n\ + link settings and errors. Examples are link speed, duplex, capabilities\n\ + advertised to the link partner, status LED indications and link error\n\ + counters.\n\ +\n\ + The common usage is\n\ + mii-diag eth0\n\ +\n\ + The default interface is \"eth0\".\n\ + Frequently used options are\n\ + -A --advertise \n\ + -F --fixed-speed \n\ + Speed is one of: 100baseT4, 100baseTx, 100baseTx-FD, 100baseTx-HD,\n\ + 10baseT, 10baseT-FD, 10baseT-HD\n\ + -s --status Return exit status 2 if there is no link beat.\n\ +\n\ + Less frequently used options are\n\ + -a --all-interfaces Show the status all interfaces\n\ + (Not recommended with options that change settings.)\n\ + -D --debug\n\ + -g --read-parameters Get driver-specific parameters.\n\ + -G --set-parameters PARMS Set driver-specific parameters.\n\ + Parameters are comma separated, missing parameters retain\n\ + their previous values.\n\ + -M --msg-level LEVEL Set the driver message bit map.\n\ + -p --phy ADDR Set the PHY (MII address) to report.\n\ + -r --restart Restart the link autonegotiation.\n\ + -R --reset Reset the transceiver.\n\ + -v --verbose Report each action taken.\n\ + -V --version Emit version information.\n\ + -w --watch Continuously monitor the transceiver and report changes.\n\ +\n\ + This command returns success (zero) if the interface information can be\n\ + read. If the --status option is passed, a zero return means that the\n\ + interface has link beat.\n\ +"; + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef use_linux_libc5 +#include +#include +#endif + +typedef u_int32_t u32; +typedef u_int16_t u16; +typedef u_int8_t u8; + +#if defined(SIOCGPARAMS) && SIOCGPARAMS != SIOCDEVPRIVATE+3 +#error Changed definition for SIOCGPARAMS +#else +#define SIOCGPARAMS (SIOCDEVPRIVATE+3) /* Read operational parameters. */ +#define SIOCSPARAMS (SIOCDEVPRIVATE+4) /* Set operational parameters. */ +#endif + +const char shortopts[] = "aA:C:DfF:gG:hmM:p:rRsvVw?"; +struct option longopts[] = { + /* { name has_arg *flag val } */ + {"all-interfaces", 0, 0, 'a'}, /* Show all interfaces. */ + {"advertise", 1, 0, 'A'}, /* Change the capabilities advertised. */ + {"BMCR", 1, 0, 'C'}, /* Set the control register. */ + {"debug", 0, 0, 'D'}, /* Increase the debug level. */ + {"force", 0, 0, 'f'}, /* Force the operation. */ + {"fixed-speed", 1, 0, 'F'}, /* Fixed speed name. */ + {"read-parameters", 0, 0, 'g'}, /* Show general settings values. */ + {"set-parameters", 1, 0, 'G'}, /* Write general settings values. */ + {"help", 0, 0, 'h'}, /* Print a long usage message. */ + {"monitor", 0, 0, 'm'}, /* Monitor status register. */ + {"msg-level", 1, 0, 'M'}, /* Set the driver message level. */ + {"phy", 1, 0, 'p'}, /* Set the PHY (MII address) to report. */ + {"restart", 0, 0, 'r'}, /* Restart the link negotiation */ + {"reset", 0, 0, 'R'}, /* Reset the transceiver. */ + {"status", 0, 0, 's'}, /* Non-zero exit status w/ no link beat. */ + {"verbose", 0, 0, 'v'}, /* Report each action taken. */ + {"version", 0, 0, 'V'}, /* Emit version information. */ + {"watch", 0, 0, 'w'}, /* Constantly monitor the port. */ + {"error", 0, 0, '?'}, /* Return the error message. */ + { 0, 0, 0, 0 } +}; + +/* Usually in libmii.c, but trivial substitions are below. */ +extern int show_mii_details(long ioaddr, int phy_id); +extern void monitor_mii(long ioaddr, int phy_id); +int show_mii_details(long ioaddr, int phy_id) __attribute__((weak)); +void monitor_mii(long ioaddr, int phy_id) __attribute__((weak)); + + +/* Command-line flags. */ +unsigned int opt_a = 0, /* Show-all-interfaces flag. */ + opt_f = 0, /* Force the operation. */ + opt_g = 0, + opt_G = 0, + verbose = 0, /* Verbose flag. */ + debug = 0, + opt_version = 0, + opt_restart = 0, + opt_reset = 0, + opt_status = 0, + opt_watch = 0; +static int msg_level = -1; +static int set_BMCR = -1; +static int nway_advertise = 0; +static int fixed_speed = -1; +static int override_phy = -1; +char *opt_G_string = NULL; + +/* Internal values. */ +int new_ioctl_nums; +int skfd = -1; /* AF_INET socket for ioctl() calls. */ +struct ifreq ifr; + +int do_one_xcvr(int skfd); +int show_basic_mii(long ioaddr, int phy_id); +int mdio_read(int skfd, int phy_id, int location); +void mdio_write(int skfd, int phy_id, int location, int value); +static int parse_advertise(const char *capabilities); +static void monitor_status(long ioaddr, int phy_id); + + +int +main(int argc, char **argv) +{ + int c, errflag = 0; + char **spp, *ifname; + char *progname = rindex(argv[0], '/') ? rindex(argv[0], '/')+1 : argv[0]; + + while ((c = getopt_long(argc, argv, shortopts, longopts, 0)) != EOF) + switch (c) { + case 'a': opt_a++; break; + case 'A': nway_advertise |= parse_advertise(optarg); + if (nway_advertise == -1) errflag++; + break; + case 'C': set_BMCR = strtoul(optarg, NULL, 16); break; + case 'D': debug++; break; + case 'f': opt_f++; break; + case 'F': fixed_speed = parse_advertise(optarg); + if (fixed_speed == -1) errflag++; + break; + case 'g': opt_g++; break; + case 'G': opt_G++; opt_G_string = strdup(optarg); break; + case 'm': opt_watch++; opt_status++; break; + case 'M': msg_level = strtoul(optarg, NULL, 0); break; + case 'h': fprintf(stderr, long_usage_msg, progname); return 0; + case 'p': override_phy = atoi(optarg); break; + case 'r': opt_restart++; break; + case 'R': opt_reset++; break; + case 's': opt_status++; break; + case 'v': verbose++; break; + case 'V': opt_version++; break; + case 'w': opt_watch++; break; + case '?': errflag++; break; + } + if (errflag) { + fprintf(stderr, usage_msg, progname); + return 2; + } + + if (verbose || opt_version) + printf(version); + + /* Open a basic socket. */ + if ((skfd = socket(AF_INET, SOCK_DGRAM,0)) < 0) { + perror("socket"); + return 1; + } + + if (debug) + fprintf(stderr, "DEBUG: argc=%d, optind=%d and argv[optind] is %s.\n", + argc, optind, argv[optind]); + + /* No remaining args means show all interfaces. */ + if (optind == argc) { + ifname = "eth0"; + fprintf(stderr, "Using the default interface 'eth0'.\n"); + } else { + /* Copy the interface name. */ + spp = argv + optind; + ifname = *spp++; + } + + if (ifname == NULL) { + ifname = "eth0"; + fprintf(stderr, "Using the default interface 'eth0'.\n"); + } + + /* Verify that the interface supports the ioctl(), and if + it is using the new or old SIOCGMIIPHY value (grrr...). + */ + { + u16 *data = (u16 *)(&ifr.ifr_data); + + strncpy(ifr.ifr_name, ifname, IFNAMSIZ); + data[0] = 0; + + if (ioctl(skfd, 0x8947, &ifr) >= 0) { + new_ioctl_nums = 1; + } else if (ioctl(skfd, SIOCDEVPRIVATE, &ifr) >= 0) { + new_ioctl_nums = 0; + } else { + fprintf(stderr, "SIOCGMIIPHY on %s failed: %s\n", ifname, + strerror(errno)); + (void) close(skfd); + return 1; + } + if (verbose) + printf(" Using the %s SIOCGMIIPHY value on PHY %d " + "(BMCR 0x%4.4x).\n", + new_ioctl_nums ? "new" : "old", data[0], data[3]); + } + + do_one_xcvr(skfd); + + (void) close(skfd); + return 0; +} + +int do_one_xcvr(int skfd) +{ + u16 *data = (u16 *)(&ifr.ifr_data); + u32 *data32 = (u32 *)(&ifr.ifr_data); + unsigned phy_id = data[0]; + + if (override_phy >= 0) { + printf("Using the specified MII PHY index %d.\n", override_phy); + phy_id = override_phy; + } + + if (opt_g || opt_G || msg_level >= 0) { + if (ioctl(skfd, SIOCGPARAMS, &ifr) < 0) { + fprintf(stderr, "SIOCGPARAMS on %s failed: %s\n", ifr.ifr_name, + strerror(errno)); + return -1; + } + } + if (opt_g) { + int i; + printf("Driver general parameter settings:"); + for (i = 0; i*sizeof(u32) < sizeof(ifr.ifr_ifru); i++) { + printf(" %d", data32[i]); + } + printf(".\n"); + } + if (opt_G) { + /* Set up to four arbitrary driver parameters from the -G parameter. + The format is comma separated integers, with a missing element + retaining the previous value. + */ + char *str = opt_G_string; + int i; + for (i = 0; str && i < 4; i++) { + char *endstr; + u32 newval = strtol(str, &endstr, 0); + if (debug) + printf(" parse string '%s' value %d end '%s'.\n", + str, newval, endstr); + if (str == endstr) { + if (endstr[0] == ',') /* No parameter */ + str = endstr+1; + else { + fprintf(stderr, "Invalid driver parameter '%s'.\n", str); + str = index(str, ','); + } + } else if (endstr[0] == ',') { + data32[i] = newval; + str = endstr + 1; + } else if (endstr[0] == 0) { + data32[i] = newval; + break; + } + } + printf("Setting new driver general parameters:"); + for (i = 0; i*sizeof(u32) < sizeof(ifr.ifr_ifru); i++) { + printf(" %d", data32[i]); + } + printf(".\n"); + if (ioctl(skfd, SIOCSPARAMS, &ifr) < 0) { + fprintf(stderr, "SIOCSPARAMS on %s failed: %s\n", ifr.ifr_name, + strerror(errno)); + return -1; + } + } + if (msg_level >= 0) { + data32[0] = msg_level; + if (ioctl(skfd, SIOCSPARAMS, &ifr) < 0) { + fprintf(stderr, "SIOCSPARAMS on %s failed: %s\n", ifr.ifr_name, + strerror(errno)); + return -1; + } + } + + if (opt_reset) { + printf("Resetting the transceiver...\n"); + mdio_write(skfd, phy_id, 0, 0x8000); + } + /* Note: PHY addresses > 32 are pseudo-MII devices, usually built-in. */ + if (phy_id < 64 && nway_advertise > 0) { + printf(" Setting the media capability advertisement register of " + "PHY #%d to 0x%4.4x.\n", phy_id, nway_advertise | 1); + mdio_write(skfd, phy_id, 4, nway_advertise | 1); + mdio_write(skfd, phy_id, 0, 0x1000); + } + + if (opt_restart) { + printf("Restarting negotiation...\n"); + mdio_write(skfd, phy_id, 0, 0x0000); + mdio_write(skfd, phy_id, 0, 0x1200); + } + /* To force 100baseTx-HD do mdio_write(skfd, phy_id, 0, 0x2000); */ + if (fixed_speed >= 0) { + int reg0_val = 0; + if (fixed_speed & 0x0180) /* 100mpbs */ + reg0_val |= 0x2000; + if ((fixed_speed & 0x0140) && /* A full duplex type and */ + ! (fixed_speed & 0x0820)) /* no half duplex types. */ + reg0_val |= 0x0100; + printf("Setting the speed to \"fixed\", Control register %4.4x.\n", + reg0_val); + mdio_write(skfd, phy_id, 0, reg0_val); + } + if (set_BMCR >= 0) { + printf("Setting the Basic Mode Control Register to 0x%4.4x.\n", + set_BMCR); + mdio_write(skfd, phy_id, 0, set_BMCR); + } + + if (opt_watch && opt_status) + monitor_status(skfd, phy_id); + + show_basic_mii(skfd, phy_id); +#ifdef LIBMII + if (verbose) + show_mii_details(skfd, phy_id); +#else + if (verbose || debug) { + int mii_reg, mii_val; + printf(" MII PHY #%d transceiver registers:", phy_id); + for (mii_reg = 0; mii_reg < 32; mii_reg++) { + mii_val = mdio_read(skfd, phy_id, mii_reg); + printf("%s %4.4x", (mii_reg % 8) == 0 ? "\n " : "", + mii_val); + } + printf("\n"); + } +#endif + + if (opt_watch) + monitor_mii(skfd, phy_id); + if (opt_status && + (mdio_read(skfd, phy_id, 1) & 0x0004) == 0) + exit(2); + return 0; +} + +int mdio_read(int skfd, int phy_id, int location) +{ + u16 *data = (u16 *)(&ifr.ifr_data); + + data[0] = phy_id; + data[1] = location; + + if (ioctl(skfd, new_ioctl_nums ? 0x8948 : SIOCDEVPRIVATE+1, &ifr) < 0) { + fprintf(stderr, "SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name, + strerror(errno)); + return -1; + } + return data[3]; +} + +void mdio_write(int skfd, int phy_id, int location, int value) +{ + u16 *data = (u16 *)(&ifr.ifr_data); + + data[0] = phy_id; + data[1] = location; + data[2] = value; + + if (ioctl(skfd, new_ioctl_nums ? 0x8949 : SIOCDEVPRIVATE+2, &ifr) < 0) { + fprintf(stderr, "SIOCSMIIREG on %s failed: %s\n", ifr.ifr_name, + strerror(errno)); + } +} + +/* Parse the command line argument for advertised capabilities. */ +static int parse_advertise(const char *capabilities) +{ + const char *mtypes[] = { + "100baseT4", "100baseTx", "100baseTx-FD", "100baseTx-HD", + "10baseT", "10baseT-FD", "10baseT-HD", 0, + }; + char *endptr; + int cap_map[] = { 0x0200, 0x0180, 0x0100, 0x0080, 0x0060, 0x0040, 0x0020,}; + int i; + if ( ! capabilities) { + fprintf(stderr, "You passed -A 'NULL'. You must provide a media" + " list to advertise!\n"); + return -1; + } + if (debug) + fprintf(stderr, "Advertise string is '%s'.\n", capabilities); + for (i = 0; mtypes[i]; i++) + if (strcasecmp(mtypes[i], capabilities) == 0) + return cap_map[i]; + if ((i = strtol(capabilities, &endptr, 16)) <= 0xffff && endptr[0] == 0) + return i; + fprintf(stderr, "Invalid media advertisement value '%s'.\n" + " Either pass a numeric value or one of the following names:\n", + capabilities); + for (i = 0; mtypes[i]; i++) + fprintf(stderr, " %-14s %3.3x\n", mtypes[i], cap_map[i]); + return -1; +} + +/* Trivial versions if we don't link against libmii.c */ +static const char *media_names[] = { + "10baseT", "10baseT-FD", "100baseTx", "100baseTx-FD", "100baseT4", + "Flow-control", 0, +}; +/* Various non-good bits in the command register. */ +static const char *bmcr_bits[] = { + " Internal Collision-Test enabled!\n", "", /* 0x0080,0x0100 */ + " Restarted auto-negotiation in progress!\n", + " Transceiver isolated from the MII!\n", + " Transceiver powered down!\n", "", "", + " Transceiver in loopback mode!\n", + " Transceiver currently being reset!\n", +}; + +int show_basic_mii(long ioaddr, int phy_id) +{ + int mii_reg, i; + u16 mii_val[32]; + u16 bmcr, bmsr, new_bmsr, nway_advert, lkpar; + + for (mii_reg = 0; mii_reg < 8; mii_reg++) + mii_val[mii_reg] = mdio_read(ioaddr, phy_id, mii_reg); + if ( ! verbose) { + printf("Basic registers of MII PHY #%d: ", phy_id); + for (mii_reg = 0; mii_reg < 8; mii_reg++) + printf(" %4.4x", mii_val[mii_reg]); + printf(".\n"); + } + + if (mii_val[0] == 0xffff || mii_val[1] == 0x0000) { + printf(" No MII transceiver present!.\n"); + if (! opt_f) { + printf(" Use '--force' to view the information anyway.\n"); + return -1; + } + } + /* Descriptive rename. */ + bmcr = mii_val[0]; + bmsr = mii_val[1]; + nway_advert = mii_val[4]; + lkpar = mii_val[5]; + + if (lkpar & 0x4000) { + int negotiated = nway_advert & lkpar & 0x3e0; + int max_capability = 0; + /* Scan for the highest negotiated capability, highest priority + (100baseTx-FDX) to lowest (10baseT-HDX). */ + int media_priority[] = {8, 9, 7, 6, 5}; /* media_names[i-5] */ + printf(" The autonegotiated capability is %4.4x.\n", negotiated); + for (i = 0; media_priority[i]; i++) + if (negotiated & (1 << media_priority[i])) { + max_capability = media_priority[i]; + break; + } + if (max_capability) + printf("The autonegotiated media type is %s.\n", + media_names[max_capability - 5]); + else + printf("No common media type was autonegotiated!\n" + "This is extremely unusual and typically indicates a " + "configuration error.\n" "Perhaps the advertised " + "capability set was intentionally limited.\n"); + } + printf(" Basic mode control register 0x%4.4x:", bmcr); + if (bmcr & 0x1000) + printf(" Auto-negotiation enabled.\n"); + else + printf(" Auto-negotiation disabled, with\n" + " Speed fixed at 10%s mbps, %s-duplex.\n", + bmcr & 0x2000 ? "0" : "", + bmcr & 0x0100 ? "full":"half"); + for (i = 0; i < 9; i++) + if (bmcr & (0x0080<= 11; i--) + if (bmsr & (1<"); + printf(".\n"); + printf(" %s to perform Auto-negotiation, negotiation %scomplete.\n", + bmsr & 0x0008 ? "Able" : "Unable", + bmsr & 0x0020 ? "" : "not "); + } + + if (bmsr & 0x0010) + printf(" Remote fault detected!\n"); + if (bmsr & 0x0002) + printf(" *** Link Jabber! ***\n"); + + if (lkpar & 0x4000) { + printf(" Your link partner advertised %4.4x:", + lkpar); + for (i = 5; i >= 0; i--) + if (lkpar & (0x20<] [-i ] -Ds [netmask ] pub <-''-\n\n")); + + fprintf(stderr, _(" -a display (all) hosts in alternative (BSD) style\n")); ++ fprintf(stderr, _(" -e display (all) hosts in default (Linux) style\n")); + fprintf(stderr, _(" -s, --set set a new ARP entry\n")); + fprintf(stderr, _(" -d, --delete delete a specified entry\n")); + fprintf(stderr, _(" -v, --verbose be verbose\n")); +--- net-tools-1.57/man/en_US/arp.8.orig Sat Nov 25 15:13:26 2000 ++++ net-tools-1.57/man/en_US/arp.8 Sat Nov 25 15:15:12 2000 +@@ -3,7 +3,7 @@ + arp \- manipulate the system ARP cache + .SH SYNOPSIS + .B arp +-.RB [ \-vn ] ++.RB [ \-evn ] + .RB [ "\-H type" ] + .RB [ "-i if" ] + .B -a +@@ -60,7 +60,7 @@ + shows numerical addresses instead of trying to determine symbolic host, port + or user names. + .TP +-.B "\-H type, \-\-hw-type type" ++.B "\-H type, \-\-hw-type type, \-t type" + When setting or reading the ARP cache, this optional parameter tells + .B arp + which class of entries it should check for. The default value of +@@ -81,7 +81,8 @@ + .B hostname + parameter is not used, + .B all +-entries will be displayed. ++entries will be displayed. ++The entries will be displayed in alternate (BSD) style. + .TP + .B "\-d hostname, \-\-delete hostname" + Remove any entry for the specified host. This can be used if the +@@ -91,6 +92,9 @@ + Use the interface + .BR ifa "'s" + hardware address. ++.TP ++.B "\-e" ++Shows the entries in default (Linux) style. + .TP + .B "\-i If, \-\-device If" + Select an interface. When dumping the ARP cache only entries matching diff --git a/packages/net-tools/files/net-tools-1.60-arp_overflow.patch b/packages/net-tools/files/net-tools-1.60-arp_overflow.patch new file mode 100644 index 0000000000..4679a51675 --- /dev/null +++ b/packages/net-tools/files/net-tools-1.60-arp_overflow.patch @@ -0,0 +1,11 @@ +--- net-tools-1.60/arp.c.old 2005-08-03 08:23:46.000000000 +0200 ++++ net-tools-1.60/arp.c 2005-08-03 11:02:10.000000000 +0200 +@@ -235,7 +235,7 @@ + struct ifreq ifr; + struct hwtype *xhw; + +- strcpy(ifr.ifr_name, ifname); ++ strncpy(ifr.ifr_name, ifname, IFNAMSIZ); + if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0) { + fprintf(stderr, _("arp: cant get HW-Address for `%s': %s.\n"), ifname, strerror(errno)); + return (-1); diff --git a/packages/net-tools/files/net-tools-1.60-bcast.patch b/packages/net-tools/files/net-tools-1.60-bcast.patch new file mode 100644 index 0000000000..9489e26352 --- /dev/null +++ b/packages/net-tools/files/net-tools-1.60-bcast.patch @@ -0,0 +1,99 @@ +--- net-tools-1.60/ifconfig.c.broadcast 2004-11-03 12:05:30.000000000 +0100 ++++ net-tools-1.60/ifconfig.c 2004-11-04 15:39:32.817077232 +0100 +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -138,6 +139,7 @@ + perror("SIOCSIFFLAGS"); + return -1; + } ++ + return (0); + } + +@@ -212,17 +214,41 @@ + exit(0); + } + +-static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa) ++static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa, int new_bcast) + { + int err = 0; +- +- memcpy((char *) &ifr->ifr_netmask, (char *) sa, +- sizeof(struct sockaddr)); ++ struct sockaddr_in * ip_addr, * netmask, *bcast; ++ struct ifreq ifraddr; ++ struct ifreq ifrbcast; ++ ++ memcpy((char *) &ifr->ifr_netmask, (char *) sa, ++ sizeof(struct sockaddr)); + if (ioctl(skfd, SIOCSIFNETMASK, ifr) < 0) { + fprintf(stderr, "SIOCSIFNETMASK: %s\n", + strerror(errno)); + err = 1; + } ++ ++ if (new_bcast) { ++ memcpy(&ifraddr,ifr,sizeof(struct ifreq)); ++ memcpy(&ifrbcast,ifr,sizeof(struct ifreq)); ++ ++ if (ioctl(skfd, SIOCGIFADDR, &ifraddr) < 0) { ++ fprintf(stderr, "SIOCGIFADDR: %s\n", strerror(errno)); ++ err = 1; ++ } ++ ++ ip_addr = (struct sockaddr_in *)&ifraddr.ifr_addr; ++ netmask = (struct sockaddr_in *)&ifr->ifr_netmask; ++ bcast = (struct sockaddr_in *)&ifrbcast.ifr_broadaddr; ++ /* calculate new broadcast adress */ ++ bcast->sin_addr.s_addr = ip_addr->sin_addr.s_addr | ~netmask->sin_addr.s_addr; ++ /* set new broadcast adress */ ++ if (ioctl(skfd, SIOCSIFBRDADDR, &ifrbcast) < 0) { ++ fprintf(stderr, "SIOCSIFBROADCAST: %s\n", strerror(errno)); ++ err = 1; ++ } ++ } + return 0; + } + +@@ -234,7 +260,7 @@ + struct aftype *ap; + struct hwtype *hw; + struct ifreq ifr; +- int goterr = 0, didnetmask = 0, donetmask = 0; ++ int goterr = 0, didnetmask = 0, donetmask = 0, dobcast = 1; + char **spp; + int fd; + #if HAVE_AFINET6 +@@ -506,6 +532,7 @@ + strerror(errno)); + goterr = 1; + } ++ dobcast = 0; + spp++; + } + goterr |= set_flag(ifr.ifr_name, IFF_BROADCAST); +@@ -542,7 +569,7 @@ + continue; + } + didnetmask++; +- goterr = set_netmask(ap->fd, &ifr, &sa); ++ goterr = set_netmask(ap->fd, &ifr, &sa, dobcast); + spp++; + continue; + } +@@ -964,7 +991,7 @@ + /* set CIDR netmask */ + if (donetmask) { + donetmask = 0; +- goterr = set_netmask(skfd, &ifr, &sa_netmask); ++ goterr = set_netmask(skfd, &ifr, &sa_netmask, dobcast); + didnetmask++; + } + diff --git a/packages/net-tools/files/net-tools-1.60-bitkeeper.patch b/packages/net-tools/files/net-tools-1.60-bitkeeper.patch new file mode 100644 index 0000000000..6871304d3b --- /dev/null +++ b/packages/net-tools/files/net-tools-1.60-bitkeeper.patch @@ -0,0 +1,17 @@ +--- net-tools-1.60/netplug-1.2.9/Makefile.kill_bitkeeper 2005-01-10 11:36:32.000000000 +0100 ++++ net-tools-1.60/netplug-1.2.9/Makefile 2005-01-10 11:38:01.796744224 +0100 +@@ -24,10 +24,12 @@ + install $(install_opts) -m 755 scripts/rc.netplugd $(initdir)/netplugd + install -C $(install_opts) -m 444 man/man8/netplugd.8 $(mandir)/man8 + +-bk_root := $(shell bk root) ++#bk_root := $(shell bk root) ++bk_root := $(shell) + tar_root := netplug-$(version) + tar_file := $(bk_root)/$(tar_root).tar.bz2 +-files := $(shell bk sfiles -Ug) ++#files := $(shell bk sfiles -Ug) ++file := $(shell) + + tarball: $(tar_file) + diff --git a/packages/net-tools/files/net-tools-1.60-config.h b/packages/net-tools/files/net-tools-1.60-config.h new file mode 100644 index 0000000000..b01fd72bfe --- /dev/null +++ b/packages/net-tools/files/net-tools-1.60-config.h @@ -0,0 +1,75 @@ +/* +* config.h Automatically generated configuration includefile +* +* NET-TOOLS A collection of programs that form the base set of the +* NET-3 Networking Distribution for the LINUX operating +* system. +* +* DO NOT EDIT DIRECTLY +* +*/ + +/* + * + * Internationalization + * + * The net-tools package has currently been translated to French, + * German and Brazilian Portugese. Other translations are, of + * course, welcome. Answer `n' here if you have no support for + * internationalization on your system. + * + */ +#define I18N 0 + +/* + * + * Protocol Families. + * + */ +#define HAVE_AFUNIX 1 +#define HAVE_AFINET 1 +#define HAVE_AFINET6 1 +#define HAVE_AFIPX 0 +#define HAVE_AFATALK 0 +#define HAVE_AFAX25 0 +#define HAVE_AFNETROM 1 +#define HAVE_AFROSE 0 +#define HAVE_AFX25 0 +#define HAVE_AFECONET 0 +#define HAVE_AFDECnet 0 +#define HAVE_AFASH 0 + +/* + * + * Device Hardware types. + * + */ +#define HAVE_HWETHER 1 +#define HAVE_HWARC 1 +#define HAVE_HWSLIP 1 +#define HAVE_HWPPP 1 +#define HAVE_HWTUNNEL 1 +#define HAVE_HWSTRIP 1 +#define HAVE_HWTR 1 +#define HAVE_HWAX25 0 +#define HAVE_HWROSE 0 +#define HAVE_HWNETROM 1 +#define HAVE_HWX25 0 +#define HAVE_HWFR 1 +#define HAVE_HWSIT 0 +#define HAVE_HWFDDI 0 +#define HAVE_HWHIPPI 0 +#define HAVE_HWASH 0 +#define HAVE_HWHDLCLAPB 0 +#define HAVE_HWIRDA 1 +#define HAVE_HWEC 0 +#define HAVE_HWIB 0 + +/* + * + * Other Features. + * + */ +#define HAVE_FW_MASQUERADE 1 +#define HAVE_IP_TOOLS 1 +#define HAVE_MII 1 diff --git a/packages/net-tools/files/net-tools-1.60-config.make b/packages/net-tools/files/net-tools-1.60-config.make new file mode 100644 index 0000000000..11082004cd --- /dev/null +++ b/packages/net-tools/files/net-tools-1.60-config.make @@ -0,0 +1,36 @@ +# I18N=0 +HAVE_AFUNIX=1 +HAVE_AFINET=1 +HAVE_AFINET6=1 +# HAVE_AFIPX=0 +# HAVE_AFATALK=0 +# HAVE_AFAX25=0 +HAVE_AFNETROM=1 +# HAVE_AFROSE=0 +# HAVE_AFX25=0 +# HAVE_AFECONET=0 +# HAVE_AFDECnet=0 +# HAVE_AFASH=0 +HAVE_HWETHER=1 +HAVE_HWARC=1 +HAVE_HWSLIP=1 +HAVE_HWPPP=1 +HAVE_HWTUNNEL=1 +HAVE_HWSTRIP=1 +HAVE_HWTR=1 +# HAVE_HWAX25=0 +# HAVE_HWROSE=0 +HAVE_HWNETROM=1 +# HAVE_HWX25=0 +HAVE_HWFR=1 +# HAVE_HWSIT=0 +# HAVE_HWFDDI=0 +# HAVE_HWHIPPI=0 +# HAVE_HWASH=0 +# HAVE_HWHDLCLAPB=0 +HAVE_HWIRDA=1 +# HAVE_HWEC=0 +# HAVE_HWIB=0 +HAVE_FW_MASQUERADE=1 +HAVE_IP_TOOLS=1 +HAVE_MII=1 diff --git a/packages/net-tools/files/net-tools-1.60-cycle.patch b/packages/net-tools/files/net-tools-1.60-cycle.patch new file mode 100644 index 0000000000..ce659ec5ad --- /dev/null +++ b/packages/net-tools/files/net-tools-1.60-cycle.patch @@ -0,0 +1,311 @@ +--- net-tools-1.60/lib/interface.c.cycle 2003-02-11 14:29:29.000000000 +0100 ++++ net-tools-1.60/lib/interface.c 2003-02-11 14:29:29.000000000 +0100 +@@ -90,6 +90,7 @@ + static struct interface *int_list, *int_last; + + static int if_readlist_proc(char *); ++static int if_readlist_rep(char *, struct interface *); + + static struct interface *add_interface(char *name) + { +@@ -128,11 +129,13 @@ + int for_all_interfaces(int (*doit) (struct interface *, void *), void *cookie) + { + struct interface *ife; ++ int err; + + if (!int_list && (if_readlist() < 0)) + return -1; + for (ife = int_list; ife; ife = ife->next) { +- int err = doit(ife, cookie); ++ if_readlist_rep(ife->name, ife); ++ err = doit(ife, cookie); + if (err) + return err; + } +@@ -369,6 +372,42 @@ + return err; + } + ++ ++static int if_readlist_rep(char *target, struct interface *ife) ++{ ++ FILE *fh; ++ char buf[512]; ++ int err; ++ ++ fh = fopen(_PATH_PROCNET_DEV, "r"); ++ if (!fh) { ++ fprintf(stderr, _("Warning: cannot open %s (%s). Limited output.\n"), ++ _PATH_PROCNET_DEV, strerror(errno)); ++ return if_readconf(); ++ } ++ fgets(buf, sizeof buf, fh); /* eat line */ ++ fgets(buf, sizeof buf, fh); ++ ++ procnetdev_vsn = procnetdev_version(buf); ++ ++ err = 0; ++ while (fgets(buf, sizeof buf, fh)) { ++ char *s, name[IFNAMSIZ]; ++ s = get_name(name, buf); ++ get_dev_fields(s, ife); ++ ife->statistics_valid = 1; ++ if (target && !strcmp(target,name)) ++ break; ++ } ++ if (ferror(fh)) { ++ perror(_PATH_PROCNET_DEV); ++ err = -1; ++ } ++ ++ fclose(fh); ++ return err; ++} ++ + int if_readlist(void) + { + int err = if_readlist_proc(NULL); +--- net-tools-1.60/man/en_US/netstat.8.cycle 2001-01-07 13:43:57.000000000 +0100 ++++ net-tools-1.60/man/en_US/netstat.8 2003-02-11 14:29:29.000000000 +0100 +@@ -30,6 +30,7 @@ + .RB [ \-\-program | \-p ] + .RB [ \-\-verbose | \-v ] + .RB [ \-\-continuous | \-c] ++.RB [delay] + .P + .B netstat + .RB { \-\-route | \-r } +@@ -39,6 +40,7 @@ + .RB [ \-\-numeric | \-n ] + .RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] + .RB [ \-\-continuous | \-c] ++.RB [delay] + .P + .B netstat + .RB { \-\-interfaces | \-i } +@@ -50,12 +52,14 @@ + .RB [ \-\-numeric | \-n ] + .RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] + .RB [ \-\-continuous | \-c] ++.RB [delay] + .P + .B netstat + .RB { \-\-groups | \-g } + .RB [ \-\-numeric | \-n ] + .RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] + .RB [ \-\-continuous | \-c] ++.RB [delay] + .P + .B netstat + .RB { \-\-masquerade | \-M } +@@ -63,12 +67,14 @@ + .RB [ \-\-numeric | \-n ] + .RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ] + .RB [ \-\-continuous | \-c] ++.RB [delay] + .P + .B netstat + .RB { \-\-statistics | -s } + .RB [ \-\-tcp | \-t ] + .RB [ \-\-udp | \-u ] + .RB [ \-\-raw | \-w ] ++.RB [delay] + .P + .B netstat + .RB { \-\-version | \-V } +@@ -170,6 +176,10 @@ + Print routing information from the FIB. (This is the default.) + .SS "\-C" + Print routing information from the route cache. ++.SS delay ++Netstat will cycle printing through statistics every ++.B delay ++seconds. + .IR UP . + .P + .SH OUTPUT +--- net-tools-1.60/netstat.c.cycle 2003-02-11 14:29:29.000000000 +0100 ++++ net-tools-1.60/netstat.c 2003-02-11 15:07:26.000000000 +0100 +@@ -102,7 +102,7 @@ + #endif + + /* prototypes for statistics.c */ +-void parsesnmp(int, int, int); ++int parsesnmp(int, int, int); + void inittab(void); + + typedef enum { +@@ -1440,6 +1440,8 @@ + + static int iface_info(void) + { ++ static int count=0; ++ + if (skfd < 0) { + if ((skfd = sockets_open(0)) < 0) { + perror("socket"); +@@ -1449,20 +1451,21 @@ + } + if (flag_exp < 2) { + ife_short = 1; +- printf(_("Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n")); ++ if(!(count % 8)) ++ printf(_("Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n")); + } + + if (for_all_interfaces(do_if_print, &flag_all) < 0) { + perror(_("missing interface information")); + exit(1); + } +- if (flag_cnt) ++ if (!flag_cnt) { + free_interface_list(); +- else { + close(skfd); + skfd = -1; + } + ++ count++; + return 0; + } + +@@ -1478,7 +1481,7 @@ + { + fprintf(stderr, _("usage: netstat [-veenNcCF] [] -r netstat {-V|--version|-h|--help}\n")); + fprintf(stderr, _(" netstat [-vnNcaeol] [ ...]\n")); +- fprintf(stderr, _(" netstat { [-veenNac] -i | [-cnNe] -M | -s }\n\n")); ++ fprintf(stderr, _(" netstat { [-veenNac] -i | [-cnNe] -M | -s } [delay]\n\n")); + + fprintf(stderr, _(" -r, --route display routing table\n")); + fprintf(stderr, _(" -i, --interfaces display interface table\n")); +@@ -1514,6 +1517,7 @@ + (int argc, char *argv[]) { + int i; + int lop; ++ int reptimer = 1; + struct option longopts[] = + { + AFTRANS_OPTS, +@@ -1655,6 +1659,12 @@ + flag_sta++; + } + ++ if(argc == optind + 1) { ++ if((reptimer = atoi(argv[optind])) <= 0) ++ usage(); ++ flag_cnt++; ++ } ++ + if (flag_int + flag_rou + flag_mas + flag_sta > 1) + usage(); + +@@ -1666,7 +1676,7 @@ + + flag_arg = flag_tcp + flag_udp + flag_raw + flag_unx + flag_ipx + + flag_ax25 + flag_netrom + flag_igmp + flag_x25; +- ++ + if (flag_mas) { + #if HAVE_FW_MASQUERADE && HAVE_AFINET + #if MORE_THAN_ONE_MASQ_AF +@@ -1678,7 +1688,7 @@ + flag_not & FLAG_NUM_PORT, flag_exp); + if (i || !flag_cnt) + break; +- sleep(1); ++ sleep(reptimer); + } + #else + ENOSUPP("netstat.c", "FW_MASQUERADE"); +@@ -1688,9 +1698,15 @@ + } + + if (flag_sta) { ++ for(;;) { + inittab(); +- parsesnmp(flag_raw, flag_tcp, flag_udp); +- exit(0); ++ i = parsesnmp(flag_raw, flag_tcp, flag_udp); ++ ++ if(i || !flag_cnt) ++ break; ++ sleep(reptimer); ++ } ++ return(i); + } + + if (flag_rou) { +@@ -1712,7 +1728,7 @@ + i = route_info(afname, options); + if (i || !flag_cnt) + break; +- sleep(1); ++ sleep(reptimer); + } + return (i); + } +@@ -1721,7 +1737,7 @@ + i = iface_info(); + if (!f