Package init

This commit is contained in:
overweight 2019-09-30 11:09:40 -04:00
commit 8f5a8a1f9a
18 changed files with 2757 additions and 0 deletions

14
arp-ethers.service Normal file
View File

@ -0,0 +1,14 @@
[Unit]
Description=Load static arp entries
Documentation=man:arp(8) man:ethers(5)
ConditionPathExists=/etc/ethers
After=network.service
Before=network.target
[Service]
Type=oneshot
ExecStart=/sbin/arp -f /etc/ethers
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

178
ether-wake-interfaces.patch Normal file
View File

@ -0,0 +1,178 @@
diff -up net-tools-2.0/ether-wake.c.interfaces net-tools-2.0/ether-wake.c
--- net-tools-2.0/ether-wake.c.interfaces 2015-09-15 18:02:18.595968129 +0200
+++ net-tools-2.0/ether-wake.c 2015-09-15 18:02:18.607968095 +0200
@@ -22,7 +22,7 @@ static char usage_msg[] =
" 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"
+" -i ifname Use interface ifname instead of sending a wake packet to all interfaces.\n"
" -p <pw> 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"
@@ -89,6 +89,9 @@ static char usage_msg[] =
#include <netdb.h>
#include <netinet/ether.h>
+#include "interface.h"
+#include "sockets.h"
+
/* Grrr, no consistency between include versions.
Enable this if setsockopt() isn't declared with your library. */
#if 0
@@ -110,20 +113,29 @@ static int get_dest_addr(const char *arg
static int get_fill(unsigned char *pkt, struct ether_addr *eaddr);
static int get_wol_pw(const char *optarg);
+typedef struct {
+ int s;
+ int verbose;
+ int pktsize;
+} if_info;
+
+static int send_wol_packet(char *ifname, int s, int verbose, int pktsize);
+
+static int do_wake(struct interface *ife, void *cookie) {
+ if_info *info = (if_info *)cookie;
+ send_wol_packet(ife->name, info->s, info->verbose, info->pktsize);
+ return 0;
+}
+
int main(int argc, char *argv[])
{
- char *ifname = "eth0";
- int one = 1; /* True, for socket options. */
+ char *ifname = NULL;
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
+ int c, pktsize;
struct ether_addr eaddr;
+ if_info info;
while ((c = getopt(argc, argv, "bDi:p:uvV")) != -1)
switch (c) {
@@ -131,7 +143,7 @@ int main(int argc, char *argv[])
case 'D': debug++; break;
case 'i': ifname = optarg; break;
case 'p': get_wol_pw(optarg); break;
- case 'u': printf(usage_msg); return 0;
+ case 'u': printf("%s",usage_msg); return 0;
case 'v': verbose++; break;
case 'V': do_version++; break;
case '?':
@@ -140,7 +152,7 @@ int main(int argc, char *argv[])
if (verbose || do_version)
printf("%s\n", version_msg);
if (errflag) {
- fprintf(stderr, brief_usage_msg);
+ fprintf(stderr,"%s", brief_usage_msg);
return 3;
}
@@ -177,13 +189,45 @@ int main(int argc, char *argv[])
pktsize = get_fill(outpack, &eaddr);
+ if (ifname == NULL) {
+ info.s = s;
+ info.verbose = verbose;
+ info.pktsize = pktsize;
+
+ /* Create a channel to the NET kernel. */
+ if ((sockets_open(0)) < 0) {
+ perror("socket");
+ exit(1);
+ }
+
+ return for_all_interfaces(do_wake, &info);
+ }
+
+ return send_wol_packet(ifname, s, verbose, pktsize);
+}
+
+/* Send a Wake-On-LAN (WOL) "Magic Packet" to Interface IFNAME using
+ Socket S with a packet size PKTSIZE. VERBOSE implies
+ verbosity. */
+
+static int send_wol_packet(char *ifname, int s, int verbose, int pktsize)
+{
+ int i;
+ int one = 1; /* True, for socket options. */
+#if defined(PF_PACKET)
+ struct sockaddr_ll whereto;
+#else
+ struct sockaddr whereto; /* who to wake up */
+#endif
+
/* 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;
+ const char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data;
- strcpy(if_hwaddr.ifr_name, ifname);
+ strncpy(if_hwaddr.ifr_name, ifname, IFNAMSIZ);
+ if_hwaddr.ifr_name[IFNAMSIZ-1] = '\0';
if (ioctl(s, SIOCGIFHWADDR, &if_hwaddr) < 0) {
fprintf(stderr, "SIOCGIFHWADDR on %s failed: %s\n", ifname,
strerror(errno));
@@ -220,7 +264,8 @@ int main(int argc, char *argv[])
#if defined(PF_PACKET)
{
struct ifreq ifr;
- strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+ ifr.ifr_name[IFNAMSIZ-1] = '\0';
if (ioctl(s, SIOCGIFINDEX, &ifr) == -1) {
fprintf(stderr, "SIOCGIFINDEX on %s failed: %s\n", ifname,
strerror(errno));
@@ -240,11 +285,14 @@ int main(int argc, char *argv[])
strcpy(whereto.sa_data, ifname);
#endif
+ char senderrmsg[IFNAMSIZ+16] = "'";
+ strcat(senderrmsg, ifname);
+ strcat(senderrmsg, "', sendto");
if ((i = sendto(s, outpack, pktsize, 0, (struct sockaddr *)&whereto,
sizeof(whereto))) < 0)
- perror("sendto");
+ perror(senderrmsg);
else if (debug)
- printf("Sendto worked ! %d.\n", i);
+ printf("'%s', Sendto worked ! %d.\n", ifname, i);
#ifdef USE_SEND
if (bind(s, (struct sockaddr *)&whereto, sizeof(whereto)) < 0)
diff -up net-tools-2.0/Makefile.interfaces net-tools-2.0/Makefile
--- net-tools-2.0/Makefile.interfaces 2015-09-15 18:02:18.608968093 +0200
+++ net-tools-2.0/Makefile 2015-09-15 18:04:06.273668275 +0200
@@ -193,6 +193,9 @@ ipmaddr: $(NET_LIB) ipmaddr.o
mii-tool: $(NET_LIB) mii-tool.o
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ mii-tool.o $(NLIB)
+ether-wake: $(NET_LIB) ether-wake.o
+ $(CC) $(CFLAGS) $(LDFLAGS) -o ether-wake ether-wake.o $(NLIB)
+
installbin:
@echo
@echo "######################################################"
diff -up net-tools-2.0/man/en_US/ether-wake.8.interfaces net-tools-2.0/man/en_US/ether-wake.8
--- net-tools-2.0/man/en_US/ether-wake.8.interfaces 2015-09-15 18:02:18.597968123 +0200
+++ net-tools-2.0/man/en_US/ether-wake.8 2015-09-15 18:02:18.608968093 +0200
@@ -49,7 +49,7 @@ Send the wake-up packet to the broadcast
Increase the Debug Level.
.TP
.B \-i ifname
-Use interface ifname instead of the default "eth0".
+Use interface ifname instead of sending a wake packet to all interfaces.
.TP
.B \-p passwd
Append a four or six byte password to the packet. Only a few adapters

81
ether-wake.8 Normal file
View File

@ -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 <n> 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<whatever>\fP and
.\" \fI<whatever>\fP escape sequences to invoke 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 ether-wake program was written by Donald Becker at Scyld Computing
Corporation for use with the Scyld(\*(Tm) Beowulf System.

392
ether-wake.c Normal file
View File

@ -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 <ifname>] [-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 <ifname>] [-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 <pw> 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 <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
#if 0 /* Only exists on some versions. */
#include <ioctls.h>
#endif
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <features.h>
#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
#include <netpacket/packet.h>
#include <net/ethernet.h>
#else
#include <asm/types.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#endif
#include <netdb.h>
#include <netinet/ether.h>
/* 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 <sys/socket.h>
#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:
*/

34
ipmaddr.8 Normal file
View File

@ -0,0 +1,34 @@
.\" Process this file with
.\" groff -man -Tascii ipmaddr.8
.\"
.TH IPMADDR 8 "SEPTEMBER 2009" "" ""
.\"
.\" Man page written by Jiri Popelka <jpopelka AT redhat DOT com>
.\"
.SH NAME
.B ipmaddr
\- adds, deletes, and displays multicast addresses
.SH SYNOPSIS
.B /usr/sbin/ipmaddr
.RB [< operation >]
.RB [< args >]
.SH NOTE
.P
This program is obsolete. For replacement check \fBip maddr\fR.
.SH DESCRIPTION
The \fBipmaddr\fR command can perform one of the following operations:
.B add
\- add a multicast address
.B del
\- delete a multicast address
.B show
\- list multicast addresses
.SH SEE ALSO
.BR ip (8).

41
iptunnel.8 Normal file
View File

@ -0,0 +1,41 @@
.\" Process this file with
.\" groff -man -Tascii iptunnel.8
.\"
.TH IPTUNNEL 8 "SEPTEMBER 2009" "" ""
.\"
.\" Man page written by Jiri Popelka <jpopelka AT redhat DOT com>
.\"
.SH NAME
.B iptunnel
\- creates, deletes, and displays configured tunnels
.SH SYNOPSIS
.B /usr/sbin/iptunnel
.RB [< operation >]
.RB [< args >]
.SH NOTE
.P
This program is obsolete. For replacement check \fBip tunnel\fR.
.SH DESCRIPTION
The \fBiptunnel\fR
command creates configured tunnels for sending and receiving
IPV6 or IPV4 packets that are encapsulated as the payload of an IPV4
datagram.
The
.B iptunnel
command can perform one of the following operations:
.B create
\- create a tunnel interface, which you must subsequently configure.
.B delete
\- delete a tunnel interface. You must disable the tunnel before you can delete it.
.B show
\- show the tunnel attributes (name, tunnel end points, next hop for tunneled packets).
.SH SEE ALSO
.BR ip (8).

160
mii-diag.8 Normal file
View File

@ -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 <n> 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 ] <interface>
.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<whatever>\fP and
.\" \fI<whatever>\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 <speed|setting>
.BR
.B \-F, --fixed-speed <speed|setting>
Speed is one of: 100baseT4, 100baseTx, 100baseTx-FD, 100baseTx-HD, 10baseT,
10baseT-FD, 10baseT-HD. For more precise control an explicit 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
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 simplified
output. It polls the interface only once a second and the output format
is a single line per link change with three fixed words
<unknown|down||negotiating|up> <STATUS> <PARTNER-CAP>
.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.

653
mii-diag.c Normal file
View File

@ -0,0 +1,653 @@
/* 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 <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.
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 <speed+duplex>] [--watch] <interface>\n";
static const char long_usage_msg[] =
"Usage: %s [-aDfrRvVw] [-AF <speed+duplex>] [--watch] <interface>\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\
Frequently used options are\n\
-A --advertise <speed|setting>\n\
-F --fixed-speed <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 <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.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
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("%s", 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 interface wasn't specified. */
if (optind == argc) {
fprintf(stderr, "No interface specified.\n");
fprintf(stderr, usage_msg, progname);
(void) close(skfd);
return 2;
} else {
/* Copy the interface name. */
spp = argv + optind;
ifname = *spp++;
}
if (ifname == NULL) {
fprintf(stderr, "No ifname.\n");
(void) close(skfd);
return -1;
}
/* 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);
ifr.ifr_name[IFNAMSIZ-1] = '\0';
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<<i))
printf("%s", bmcr_bits[i]);
new_bmsr = mdio_read(ioaddr, phy_id, 1);
if ((bmsr & 0x0016) == 0x0004)
printf( " You have link beat, and everything is working OK.\n");
else
printf(" Basic mode status register 0x%4.4x ... %4.4x.\n"
" Link status: %sestablished.\n",
bmsr, new_bmsr,
bmsr & 0x0004 ? "" :
(new_bmsr & 0x0004) ? "previously broken, but now re" : "not ");
if (verbose) {
printf(" This transceiver is capable of ");
if (bmsr & 0xF800) {
for (i = 15; i >= 11; i--)
if (bmsr & (1<<i))
printf(" %s", media_names[i-11]);
} else
printf("<Warning! No media capabilities>");
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))
printf(" %s", media_names[i]);
printf("%s.\n", lkpar & 0x0400 ? ", w/ 802.3X flow control" : "");
} else if (lkpar & 0x00A0)
printf(" Your link partner is generating %s link beat (no"
" autonegotiation).\n",
lkpar & 0x0080 ? "100baseTx" : "10baseT");
else if ( ! (bmcr & 0x1000))
printf(" Link partner information is not exchanged when in"
" fixed speed mode.\n");
else if ( ! (new_bmsr & 0x004))
; /* If no partner, do not report status. */
else if (lkpar == 0x0001 || lkpar == 0x0000) {
printf(" Your link partner does not do autonegotiation, and this "
"transceiver type\n does not report the sensed link "
"speed.\n");
} else
printf(" Your link partner is strange, status %4.4x.\n", lkpar);
printf(" End of basic transceiver information.\n\n");
return 0;
}
static void monitor_status(long ioaddr, int phy_id)
{
unsigned int baseline_1 = 0x55555555; /* Always show initial status. */
while (1) {
unsigned int new_1 = mdio_read(ioaddr, phy_id, 1);
if (new_1 != baseline_1) {
printf("%-12s 0x%4.4x 0x%4.4x\n",
new_1 & 0x04 ? (new_1==0xffff ? "unknown" : "up") :
new_1 & 0x20 ? "negotiating" : "down",
new_1, mdio_read(ioaddr, phy_id, 5));
fflush(stdout);
baseline_1 = new_1;
}
sleep(1);
}
}
int show_mii_details(long ioaddr, int phy_id)
{
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("\nThis version of 'mii-diag' has not been linked with "
"the libmii.c library.\n"
" That library provides extended transceiver status reports.\n");
return 0;
}
void monitor_mii(long ioaddr, int phy_id)
{
fprintf(stderr, "\nThis version of 'mii-diag' has not been linked with "
"the libmii.c library \n"
" required for the media monitor option.\n");
}
/*
* Local variables:
* version-control: t
* kept-new-versions: 5
* c-indent-level: 4
* c-basic-offset: 4
* tab-width: 4
* compile-command: "gcc -Wall -Wstrict-prototypes -O mii-diag.c -DLIBMII libmii.c -o mii-diag"
* simple-compile-command: "gcc mii-diag.c -o mii-diag"
* End:
*/

Binary file not shown.

83
net-tools-config.h Normal file
View File

@ -0,0 +1,83 @@
/*
* 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 1
/*
*
* Protocol Families.
*
*/
#define HAVE_AFUNIX 1
#define HAVE_AFINET 1
#define HAVE_AFINET6 1
#define HAVE_AFIPX 1
#define HAVE_AFATALK 1
#define HAVE_AFAX25 1
#define HAVE_AFNETROM 1
#define HAVE_AFROSE 1
#define HAVE_AFX25 1
#define HAVE_AFECONET 0
#define HAVE_AFDECnet 0
#define HAVE_AFASH 1
#define HAVE_AFBLUETOOTH 1
/*
*
* 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 0
#define HAVE_HWTR 0
#define HAVE_HWAX25 1
#define HAVE_HWROSE 1
#define HAVE_HWNETROM 1
#define HAVE_HWX25 1
#define HAVE_HWFR 1
#define HAVE_HWSIT 1
#define HAVE_HWFDDI 1
#define HAVE_HWHIPPI 1
#define HAVE_HWASH 1
#define HAVE_HWHDLCLAPB 1
#define HAVE_HWIRDA 1
#define HAVE_HWEC 0
#define HAVE_HWEUI64 1
#define HAVE_HWIB 1
/*
*
* Other Features.
*
*/
#define HAVE_FW_MASQUERADE 1
#define HAVE_ARP_TOOLS 1
#define HAVE_HOSTNAME_TOOLS 0
#define HAVE_HOSTNAME_SYMLINKS 0
#define HAVE_IP_TOOLS 1
#define HAVE_MII 1
#define HAVE_PLIP_TOOLS 1
#define HAVE_SERIAL_TOOLS 1
#define HAVE_SELINUX 1

44
net-tools-config.make Normal file
View File

@ -0,0 +1,44 @@
I18N=1
HAVE_AFUNIX=1
HAVE_AFINET=1
HAVE_AFINET6=1
HAVE_AFIPX=1
HAVE_AFATALK=1
HAVE_AFAX25=1
HAVE_AFNETROM=1
HAVE_AFROSE=1
HAVE_AFX25=1
# HAVE_AFECONET=0
# HAVE_AFDECnet=0
HAVE_AFASH=1
HAVE_AFBLUETOOTH=1
HAVE_HWETHER=1
HAVE_HWARC=1
HAVE_HWSLIP=1
HAVE_HWPPP=1
HAVE_HWTUNNEL=1
# HAVE_HWSTRIP=0
# HAVE_HWTR=0
HAVE_HWAX25=1
HAVE_HWROSE=1
HAVE_HWNETROM=1
HAVE_HWX25=1
HAVE_HWFR=1
HAVE_HWSIT=1
HAVE_HWFDDI=1
HAVE_HWHIPPI=1
HAVE_HWASH=1
HAVE_HWHDLCLAPB=1
HAVE_HWIRDA=1
# HAVE_HWEC=0
HAVE_HWEUI64=1
HAVE_HWIB=1
HAVE_FW_MASQUERADE=1
HAVE_ARP_TOOLS=1
# HAVE_HOSTNAME_TOOLS=0
# HAVE_HOSTNAME_SYMLINKS=0
HAVE_IP_TOOLS=1
HAVE_MII=1
HAVE_PLIP_TOOLS=1
HAVE_SERIAL_TOOLS=1
HAVE_SELINUX=1

675
net-tools-cycle.patch Normal file
View File

@ -0,0 +1,675 @@
diff -up net-tools-2.0/lib/interface.c.cycle net-tools-2.0/lib/interface.c
--- net-tools-2.0/lib/interface.c.cycle 2016-02-15 16:54:18.000000000 +0100
+++ net-tools-2.0/lib/interface.c 2016-03-30 09:58:18.247891588 +0200
@@ -93,6 +93,7 @@ int if_list_all = 0; /* do we have reque
static struct interface *int_list, *int_last;
static int if_readlist_proc(const char *);
+static int if_readlist_rep(const char *, struct interface *);
static struct interface *if_cache_add(const char *name)
{
@@ -138,11 +139,14 @@ struct interface *lookup_interface(const
int for_all_interfaces(int (*doit) (struct interface *, void *), void *cookie)
{
struct interface *ife;
+ int err;
if (!if_list_all && (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;
}
@@ -210,16 +214,24 @@ out:
return err;
}
-static const char *get_name(char *name, const char *p)
+static const char *get_name(char **namep, const char *p)
{
+ int count = 0;
while (isspace(*p))
p++;
+ char *name = *namep = p;
while (*p) {
if (isspace(*p))
break;
if (*p == ':') { /* could be an alias */
const char *dot = p++;
- while (*p && isdigit(*p)) p++;
+ count++;
+ while (*p && isdigit(*p)) {
+ p++;
+ count++;
+ if (count == (IFNAMSIZ-1))
+ break;
+ }
if (*p == ':') {
/* Yes it is, backup and copy it. */
p = dot;
@@ -235,6 +247,9 @@ static const char *get_name(char *name,
break;
}
*name++ = *p++;
+ count++;
+ if (count == (IFNAMSIZ-1))
+ break;
}
*name++ = '\0';
return p;
@@ -316,9 +331,10 @@ static int get_dev_fields(const char *bp
static int if_readlist_proc(const char *target)
{
FILE *fh;
- char buf[512];
struct interface *ife;
int err;
+ char *line = NULL;
+ size_t linelen = 0;
fh = fopen(_PATH_PROCNET_DEV, "r");
if (!fh) {
@@ -326,10 +342,11 @@ static int if_readlist_proc(const char *
_PATH_PROCNET_DEV, strerror(errno));
return -2;
}
- if (fgets(buf, sizeof buf, fh))
- /* eat line */;
- if (fgets(buf, sizeof buf, fh))
- /* eat line */;
+ if (getline(&line, &linelen, fh) == -1 /* eat line */
+ || getline(&line, &linelen, fh) == -1) { /* eat line */
+ err = -1;
+ goto out;
+ }
#if 0 /* pretty, but can't cope with missing fields */
fmt = proc_gen_fmt(_PATH_PROCNET_DEV, 1, fh,
@@ -354,14 +371,14 @@ static int if_readlist_proc(const char *
if (!fmt)
return -1;
#else
- procnetdev_vsn = procnetdev_version(buf);
+ procnetdev_vsn = procnetdev_version(line);
#endif
err = 0;
- while (fgets(buf, sizeof buf, fh)) {
+ while (getline(&line, &linelen, fh) != -1) {
const char *s;
- char name[IFNAMSIZ];
- s = get_name(name, buf);
+ char *name;
+ s = get_name(&name, line);
ife = if_cache_add(name);
get_dev_fields(s, ife);
ife->statistics_valid = 1;
@@ -376,6 +393,51 @@ static int if_readlist_proc(const char *
#if 0
free(fmt);
#endif
+ out:
+ free(line);
+ fclose(fh);
+ return err;
+}
+
+static int if_readlist_rep(const char *target, struct interface *ife)
+{
+ FILE *fh;
+ int err;
+ char *line = NULL;
+ size_t linelen = 0;
+
+ 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();
+ }
+ if (getline(&line, &linelen, fh) == -1 /* eat line */
+ || getline(&line, &linelen, fh) == -1) { /* eat line */
+ err = -1;
+ goto out;
+ }
+
+ procnetdev_vsn = procnetdev_version(line);
+
+ err = 0;
+ while (getline(&line, &linelen, fh) != -1) {
+ char *s, *name;
+ s = get_name(&name, line);
+ get_dev_fields(s, ife);
+ if (target && !strcmp(target,name))
+ {
+ ife->statistics_valid = 1;
+ break;
+ }
+ }
+ if (ferror(fh)) {
+ perror(_PATH_PROCNET_DEV);
+ err = -1;
+ }
+
+ out:
+ free(line);
fclose(fh);
return err;
}
diff -up net-tools-2.0/man/en_US/netstat.8.cycle net-tools-2.0/man/en_US/netstat.8
--- net-tools-2.0/man/en_US/netstat.8.cycle 2016-02-15 16:54:18.000000000 +0100
+++ net-tools-2.0/man/en_US/netstat.8 2016-03-30 09:58:18.241891637 +0200
@@ -36,6 +36,7 @@ netstat \- Print network connections, ro
.RB [ \-\-verbose | \-v ]
.RB [ \-\-continuous | \-c]
.RB [ \-\-wide | \-W ]
+.RB [delay]
.P
.B netstat
.RB { \-\-route | \-r }
@@ -45,22 +46,25 @@ netstat \- Print network connections, ro
.RB [ \-\-numeric | \-n ]
.RB [ \-\-numeric\-hosts "] [" \-\-numeric\-ports "] [" \-\-numeric\-users ]
.RB [ \-\-continuous | \-c ]
+.RB [delay]
.P
.B netstat
-.RB { \-\-interfaces | \-i }
+.RB { \-\-interfaces | \-I | \-i }
.RB [ \-\-all | \-a ]
-.RB [ \-\-extend | \-e [ \-\-extend | \-e] ]
+.RB [ \-\-extend | \-e ]
.RB [ \-\-verbose | \-v ]
.RB [ \-\-program | \-p ]
.RB [ \-\-numeric | \-n ]
.RB [ \-\-numeric-hosts "] [" \-\-numeric-ports "] [" \-\-numeric-users ]
.RB [ \-\-continuous | \-c ]
+.RB [delay]
.P
.B netstat
.RB { \-\-groups | \-g }
.RB [ \-\-numeric | \-n ]
.RB [ \-\-numeric\-hosts "] [" \-\-numeric\-ports "] [" \-\-numeric\-users ]
.RB [ \-\-continuous | \-c ]
+.RB [delay]
.P
.B netstat
.RB { \-\-masquerade | \-M }
@@ -68,6 +72,7 @@ netstat \- Print network connections, ro
.RB [ \-\-numeric | \-n ]
.RB [ \-\-numeric\-hosts "] [" \-\-numeric\-ports "] [" \-\-numeric\-users ]
.RB [ \-\-continuous | \-c ]
+.RB [delay]
.P
.B netstat
.RB { \-\-statistics | -s }
@@ -76,6 +81,7 @@ netstat \- Print network connections, ro
.RB [ \-\-udplite | \-U ]
.RB [ \-\-sctp | \-S ]
.RB [ \-\-raw | \-w ]
+.RB [delay]
.P
.B netstat
.RB { \-\-version | \-V }
@@ -128,8 +134,8 @@ and
produce the same output.
.SS "\-\-groups, \-g"
Display multicast group membership information for IPv4 and IPv6.
-.SS "\-\-interfaces, \-i"
-Display a table of all network interfaces.
+.SS "\-\-interfaces=\fIiface \fR, \fB\-I=\fIiface \fR, \fB\-i"
+Display a table of all network interfaces, or the specified \fIiface\fR.
.SS "\-\-masquerade, \-M"
Display a list of masqueraded connections.
.SS "\-\-statistics, \-s"
@@ -201,13 +207,18 @@ Show the PID and name of the program to
.SS "\-l, \-\-listening"
Show only listening sockets. (These are omitted by default.)
.SS "\-a, \-\-all"
-Show both listening and non-listening sockets. With the
+Show both listening and non-listening (for TCP this means established
+connections) sockets. With the
.B \-\-interfaces
option, show interfaces that are not up
.SS "\-F"
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.
.P
.SH OUTPUT
.P
diff -up net-tools-2.0/netstat.c.cycle net-tools-2.0/netstat.c
--- net-tools-2.0/netstat.c.cycle 2016-02-15 16:54:18.000000000 +0100
+++ net-tools-2.0/netstat.c 2016-03-30 10:04:07.617171984 +0200
@@ -115,8 +115,8 @@
#endif
/* prototypes for statistics.c */
-void parsesnmp(int, int, int, int);
-void parsesnmp6(int, int, int);
+int parsesnmp(int, int, int, int);
+int parsesnmp6(int, int, int);
typedef enum {
SS_FREE = 0, /* not allocated */
@@ -142,6 +142,7 @@ static char *Release = RELEASE, *Signatu
#define E_IOCTL -3
int flag_int = 0;
+char *flag_int_name = NULL;
int flag_rou = 0;
int flag_mas = 0;
int flag_sta = 0;
@@ -340,10 +341,10 @@ static void prg_cache_clear(void)
prg_cache_loaded = 0;
}
-static void wait_continous(void)
+static void wait_continous(int reptimer)
{
fflush(stdout);
- sleep(1);
+ sleep(reptimer);
}
static int extract_type_1_socket_inode(const char lname[], unsigned long * inode_p) {
@@ -501,6 +502,121 @@ static void prg_cache_load(void)
" will not be shown, you would have to be root to see it all.)\n"));
}
+#define TCP_HASH_SIZE 1009
+
+static struct tcp_node {
+ struct tcp_node *next;
+ char *socket_pair;
+} *tcp_node_hash[TCP_HASH_SIZE];
+
+static unsigned int tcp_node_compute_string_hash(const char *p)
+{
+ unsigned int h = *p;
+
+ if (h)
+ for (p += 1; *p != '\0'; p++)
+ h = (h << 5) - h + *p;
+
+ return h;
+}
+
+#define TCP_NODE_HASH_STRING(x) \
+ (tcp_node_compute_string_hash(x) % TCP_HASH_SIZE)
+
+static void tcp_node_hash_clear(void)
+{
+ int i;
+ struct tcp_node *next_node;
+ struct tcp_node *tmp_node;
+ for (i=0; i < TCP_HASH_SIZE; i++) {
+ if (tcp_node_hash[i]) {
+ /* free the children of this hash bucket */
+ next_node = tcp_node_hash[i]->next;
+ while (next_node) {
+ tmp_node = next_node;
+ next_node = next_node->next;
+ free(tmp_node->socket_pair);
+ free(tmp_node);
+ }
+
+ /* free the bucket itself */
+ free(tcp_node_hash[i]->socket_pair);
+ free(tcp_node_hash[i]);
+ tcp_node_hash[i] = NULL;
+ }
+ }
+}
+
+/* This function takes a socket pair string. If it already exists in
+ the hash it returns -1, otherwise it returns 0. */
+
+static int tcp_node_hash_check_and_append(const char *local_addr,
+ int local_port,
+ const char *rem_addr,
+ int rem_port)
+{
+ unsigned int hash_val;
+ struct tcp_node *tmp_node;
+ int tmp_string_len;
+ char *tmp_string;;
+
+ /* Size of the string is the size of the two lengths of the address
+ strings plus enough sizes for the colons and the ports. */
+ tmp_string_len = strlen(local_addr) + strlen(rem_addr) + 32;
+ tmp_string = malloc(tmp_string_len);
+ if (!tmp_string)
+ return 0;
+
+ if (snprintf(tmp_string, tmp_string_len - 1, "%s:%d:%s:%d",
+ local_addr, local_port, rem_addr, rem_port) < 0) {
+ free(tmp_string);
+ return 0;
+ }
+
+ hash_val = TCP_NODE_HASH_STRING(tmp_string);
+
+ /* See if we have to allocate this node */
+ if (!tcp_node_hash[hash_val]) {
+ tcp_node_hash[hash_val] = malloc(sizeof(struct tcp_node));
+ if (!tcp_node_hash[hash_val]) {
+ free(tmp_string);
+ return 0;
+ }
+
+ memset(tcp_node_hash[hash_val], 0, sizeof(struct tcp_node));
+
+ /* Stuff this new value into the hash bucket and return early */
+ tcp_node_hash[hash_val]->socket_pair = tmp_string;
+ return 0;
+ }
+
+ /* Try to find the value in the hash bucket. */
+ tmp_node = tcp_node_hash[hash_val];
+ while (tmp_node) {
+ if (!strcmp(tmp_node->socket_pair, tmp_string)) {
+ free(tmp_string);
+ return -1;
+ }
+ tmp_node = tmp_node->next;
+ }
+
+ /* If we got this far it means that it isn't in the hash bucket.
+ Add it to the front since it's faster that way. */
+ tmp_node = tcp_node_hash[hash_val];
+
+ tcp_node_hash[hash_val] = malloc(sizeof(struct tcp_node));
+ if (!tcp_node_hash[hash_val]) {
+ free(tmp_string);
+ tcp_node_hash[hash_val] = tmp_node;
+ return 0;
+ }
+
+ tcp_node_hash[hash_val]->socket_pair = tmp_string;
+ tcp_node_hash[hash_val]->next = tmp_node;
+
+ return 0;
+}
+
#if HAVE_AFNETROM
static const char *netrom_state[] =
{
@@ -1109,6 +1225,12 @@ static void tcp_do_one(int lnr, const ch
return;
}
+ /* make sure that we haven't seen this socket pair before */
+ if (tcp_node_hash_check_and_append(local_addr, local_port, rem_addr, rem_port) < 0) {
+ /* fprintf(stderr, _("warning, got duplicate tcp line.\n")); */
+ return;
+ }
+
addr_do_one(local_addr, sizeof(local_addr), 22, ap, &localsas, local_port, "tcp");
addr_do_one(rem_addr, sizeof(rem_addr), 22, ap, &remsas, rem_port, "tcp");
@@ -1877,6 +1999,9 @@ static int rfcomm_info(void)
static int iface_info(void)
{
+ static int count=0;
+ struct interface *ife = NULL;
+
if (skfd < 0) {
if ((skfd = sockets_open(0)) < 0) {
perror("socket");
@@ -1886,20 +2011,25 @@ static int iface_info(void)
}
if (flag_exp < 2) {
ife_short = 1;
- printf(_("Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n"));
+ if(!(count % 8))
+ printf(_("Iface MTU 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) {
+ if (flag_int_name) {
+ ife = lookup_interface(flag_int_name);
+ do_if_print(ife, &flag_all);
+ }
+ else if (for_all_interfaces(do_if_print, &flag_all) < 0) {
perror(_("missing interface information"));
exit(1);
}
- if (flag_cnt)
+ if (!flag_cnt) {
if_cache_free();
- else {
close(skfd);
skfd = -1;
}
+ count++;
return 0;
}
@@ -1915,9 +2045,10 @@ static void usage(int rc)
{
fprintf(stderr, _("usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}\n"));
fprintf(stderr, _(" netstat [-vWnNcaeol] [<Socket> ...]\n"));
- fprintf(stderr, _(" netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }\n\n"));
+ fprintf(stderr, _(" netstat { [-vWeenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay]\n\n"));
fprintf(stderr, _(" -r, --route display routing table\n"));
+ fprintf(stderr, _(" -I, --interfaces=<Iface> display interface table for <Iface>\n"));
fprintf(stderr, _(" -i, --interfaces display interface table\n"));
fprintf(stderr, _(" -g, --groups display multicast group memberships\n"));
fprintf(stderr, _(" -s, --statistics display networking statistics (like SNMP)\n"));
@@ -1957,11 +2088,12 @@ int main
(int argc, char *argv[]) {
int i;
int lop;
+ int reptimer = 1;
static struct option longopts[] =
{
AFTRANS_OPTS,
{"version", 0, 0, 'V'},
- {"interfaces", 0, 0, 'i'},
+ {"interfaces", 2, 0, 'I'},
{"help", 0, 0, 'h'},
{"route", 0, 0, 'r'},
#if HAVE_FW_MASQUERADE
@@ -2005,7 +2137,7 @@ int main
getroute_init(); /* Set up AF routing support */
afname[0] = '\0';
- while ((i = getopt_long(argc, argv, "A:CFMacdeghilnNoprsStuUvVWw2fx64?Z", longopts, &lop)) != EOF)
+ while ((i = getopt_long(argc, argv, "A:CFMacdeghiI::lnNoprsStuUvVWw2fx64?Z", longopts, &lop)) != EOF)
switch (i) {
case -1:
break;
@@ -2046,6 +2178,13 @@ int main
case 'p':
flag_prg++;
break;
+ case 'I':
+ if (optarg && strcmp(optarg, "(null)"))
+ if (optarg[0] == '=') optarg++;
+ if (optarg && strcmp(optarg, "(null)"))
+ flag_int_name = strdup(optarg);
+ flag_int++;
+ break;
case 'i':
flag_int++;
break;
@@ -2140,6 +2279,12 @@ int main
flag_sta++;
}
+ if(argc == optind + 1) {
+ if((reptimer = atoi(argv[optind])) <= 0)
+ usage(E_USAGE);
+ flag_cnt++;
+ }
+
if (flag_int + flag_rou + flag_mas + flag_sta > 1)
usage(E_OPTERR);
@@ -2169,7 +2314,7 @@ int main
flag_not & FLAG_NUM_PORT, flag_exp);
if (i || !flag_cnt)
break;
- wait_continous();
+ wait_continous(reptimer);
}
#else
ENOSUPP("netstat", "FW_MASQUERADE");
@@ -2182,15 +2327,16 @@ int main
if (!afname[0])
safe_strncpy(afname, DFLT_AF, sizeof(afname));
+ for (;;) {
if (!strcmp(afname, "inet")) {
#if HAVE_AFINET
- parsesnmp(flag_raw, flag_tcp, flag_udp, flag_sctp);
+ i = parsesnmp(flag_raw, flag_tcp, flag_udp, flag_sctp);
#else
ENOSUPP("netstat", "AF INET");
#endif
} else if(!strcmp(afname, "inet6")) {
#if HAVE_AFINET6
- parsesnmp6(flag_raw, flag_tcp, flag_udp);
+ i = parsesnmp6(flag_raw, flag_tcp, flag_udp);
#else
ENOSUPP("netstat", "AF INET6");
#endif
@@ -2198,7 +2344,11 @@ int main
printf(_("netstat: No statistics support for specified address family: %s\n"), afname);
exit(1);
}
- exit(0);
+ if(i || !flag_cnt)
+ break;
+ sleep(reptimer);
+ }
+ return (i);
}
if (flag_rou) {
@@ -2220,7 +2370,7 @@ int main
i = route_info(afname, options);
if (i || !flag_cnt)
break;
- wait_continous();
+ wait_continous(reptimer);
}
return (i);
}
@@ -2229,7 +2379,7 @@ int main
i = iface_info();
if (!flag_cnt || i)
break;
- wait_continous();
+ wait_continous(reptimer);
}
return (i);
}
@@ -2416,8 +2566,9 @@ int main
if (!flag_cnt || i)
break;
- wait_continous();
+ wait_continous(reptimer);
prg_cache_clear();
+ tcp_node_hash_clear();
}
return (i);
}
diff -up net-tools-2.0/statistics.c.cycle net-tools-2.0/statistics.c
--- net-tools-2.0/statistics.c.cycle 2016-02-15 16:54:18.000000000 +0100
+++ net-tools-2.0/statistics.c 2016-03-30 09:58:18.238891661 +0200
@@ -527,7 +527,7 @@ static void process_fd2(FILE *f, const c
}
}
-void parsesnmp(int flag_raw, int flag_tcp, int flag_udp, int flag_sctp)
+int parsesnmp(int flag_raw, int flag_tcp, int flag_udp, int flag_sctp)
{
FILE *f;
@@ -536,14 +536,17 @@ void parsesnmp(int flag_raw, int flag_tc
f = proc_fopen("/proc/net/snmp");
if (!f) {
perror(_("cannot open /proc/net/snmp"));
- return;
+ return(1);
}
if (process_fd(f, 1, NULL) < 0)
fprintf(stderr, _("Problem while parsing /proc/net/snmp\n"));
- if (ferror(f))
+ if (ferror(f)) {
perror("/proc/net/snmp");
+ fclose(f);
+ return(1);
+ }
fclose(f);
@@ -553,8 +556,11 @@ void parsesnmp(int flag_raw, int flag_tc
if (process_fd(f, 1, NULL) <0)
fprintf(stderr, _("Problem while parsing /proc/net/netstat\n"));
- if (ferror(f))
- perror("/proc/net/netstat");
+ if (ferror(f)) {
+ perror("/proc/net/netstat");
+ fclose(f);
+ return(1);
+ }
fclose(f);
}
@@ -567,9 +573,10 @@ void parsesnmp(int flag_raw, int flag_tc
fclose(f);
}
}
+ return(0);
}
-void parsesnmp6(int flag_raw, int flag_tcp, int flag_udp)
+int parsesnmp6(int flag_raw, int flag_tcp, int flag_udp)
{
FILE *f;
@@ -578,7 +585,7 @@ void parsesnmp6(int flag_raw, int flag_t
f = fopen("/proc/net/snmp6", "r");
if (!f) {
perror(_("cannot open /proc/net/snmp6"));
- return;
+ return(1);
}
process6_fd(f);
if (ferror(f))
@@ -588,11 +595,14 @@ void parsesnmp6(int flag_raw, int flag_t
f = fopen("/proc/net/snmp", "r");
if (!f) {
perror(_("cannot open /proc/net/snmp"));
- return;
+ return(1);
}
process_fd(f, 0, "Tcp");
- if (ferror(f))
+ if (ferror(f)) {
perror("/proc/net/snmp");
+ return(1);
+ }
fclose(f);
+ return(0);
}

View File

@ -0,0 +1,34 @@
diff --git a/lib/interface.c.old b/lib/interface.c
index c734c83..9c49a03 100644
--- a/lib/interface.c.old
+++ b/lib/interface.c
@@ -928,10 +928,10 @@ void ife_print_long(struct interface *ptr)
*/
rx = ptr->stats.rx_bytes;
short_rx = rx * 10;
- if (rx > 1125899906842624ull) {
- if (rx > (9223372036854775807ull / 10))
- short_rx = rx / 112589990684262ull;
- else
+ if (rx > 1152921504606846976ull) {
+ short_rx = rx / 115292150460684697ull;
+ Rext = "EiB";
+ } else if (rx > 1125899906842624ull) {
short_rx /= 1125899906842624ull;
Rext = "PiB";
} else if (rx > 1099511627776ull) {
@@ -949,10 +949,10 @@ void ife_print_long(struct interface *ptr)
}
tx = ptr->stats.tx_bytes;
short_tx = tx * 10;
- if (tx > 1125899906842624ull) {
- if (tx > (9223372036854775807ull / 10))
- short_tx = tx / 112589990684262ull;
- else
+ if (tx > 1152921504606846976ull) {
+ short_tx = tx / 115292150460684697ull;
+ Text = "EiB";
+ } else if (tx > 1125899906842624ull) {
short_tx /= 1125899906842624ull;
Text = "PiB";
} else if (tx > 1099511627776ull) {

View File

@ -0,0 +1,59 @@
diff --git a/netstat.c b/netstat.c
index c084dfb..cfcfb78 100644
--- a/netstat.c
+++ b/netstat.c
@@ -743,6 +743,7 @@ static void igmp_do_one(int lnr, const char *line,const char *prot)
static int igmp6_flag = 0;
static char device[16];
int num, idx, refcnt;
+ char* offset;
if (lnr == 0) {
/* IPV6 ONLY */
@@ -794,17 +795,21 @@ static void igmp_do_one(int lnr, const char *line,const char *prot)
#if HAVE_AFINET
if (line[0] != '\t') {
if (idx_flag) {
- if ((num = sscanf( line, "%d\t%10c", &idx, device)) < 2) {
+ if ((num = sscanf( line, "%d\t%15c", &idx, device)) < 2) {
fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr);
return;
}
} else {
- if ( (num = sscanf( line, "%10c", device )) < 1 ) {
+ if ( (num = sscanf( line, "%15c", device )) < 1 ) {
fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr);
return;
}
}
- device[10] = '\0';
+
+ offset = strrchr(device, ':');
+ if(offset)
+ *offset = 0;
+
return;
} else if ( line[0] == '\t' ) {
if ( (num = sscanf(line, "\t%8[0-9A-Fa-f] %d", mcast_addr, &refcnt)) < 2 ) {
@@ -2037,7 +2037,7 @@ static int iface_info(void)
if (flag_exp < 2) {
ife_short = 1;
if(!(count % 8))
- printf(_("Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n"));
+ printf(_("Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n"));
}
if (flag_int_name) {
diff --git a/lib/interface.c b/lib/interface.c
index 3bd999f..97f3db5 100644
--- a/lib/interface.c
+++ b/lib/interface.c
@@ -655,7 +655,7 @@ int do_if_print(struct interface *ife, void *cookie)
void ife_print_short(struct interface *ptr)
{
- printf("%-8.8s ", ptr->name);
+ printf("%-15.15s ", ptr->name);
printf("%5d ", ptr->mtu);
/* If needed, display the interface statistics. */
if (ptr->statistics_valid) {

12
net-tools-linux48.patch Normal file
View File

@ -0,0 +1,12 @@
diff -up net-tools-2.0/iptunnel.c.linux48 net-tools-2.0/iptunnel.c
--- net-tools-2.0/iptunnel.c.linux48 2016-02-15 16:54:18.000000000 +0100
+++ net-tools-2.0/iptunnel.c 2016-10-12 09:16:57.429279406 +0200
@@ -26,7 +26,7 @@
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
-#include <netinet/ip.h>
+#include <linux/ip.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <net/if_arp.h>

136
net-tools-man.patch Normal file
View File

@ -0,0 +1,136 @@
diff -up net-tools-2.0/man/en_US/arp.8.man net-tools-2.0/man/en_US/arp.8
--- net-tools-2.0/man/en_US/arp.8.man 2014-04-26 02:45:16.000000000 +0200
+++ net-tools-2.0/man/en_US/arp.8 2014-07-07 14:51:31.378459439 +0200
@@ -63,6 +63,10 @@ arp \- manipulate the system ARP cache
.B \-f
.RI [ filename ]
+.SH NOTE
+.P
+This program is obsolete. For replacement check \fBip neigh\fR.
+
.SH DESCRIPTION
.B Arp
manipulates or displays the kernel's IPv4 network neighbour cache. It can add
@@ -219,6 +223,6 @@ published proxy ARP entries and permanen
.br
.I /etc/ethers
.SH SEE ALSO
-rarp(8), route(8), ifconfig(8), netstat(8)
+.BR ip(8)
.SH AUTHORS
Fred N. van Kempen <waltje@uwalt.nl.mugnet.org>, Bernd Eckenfels <net\-tools@lina.inka.de>.
diff -up net-tools-2.0/man/en_US/ethers.5.man net-tools-2.0/man/en_US/ethers.5
--- net-tools-2.0/man/en_US/ethers.5.man 2014-04-26 02:45:16.000000000 +0200
+++ net-tools-2.0/man/en_US/ethers.5 2014-07-07 14:51:31.378459439 +0200
@@ -26,6 +26,3 @@ can be resolved by DNS or a dot separate
.SH FILES \"{{{
/etc/ethers
.\"}}}
-.SH "SEE ALSO" \"{{{
-rarp(8)
-.\"}}}
diff -up net-tools-2.0/man/en_US/ifconfig.8.man net-tools-2.0/man/en_US/ifconfig.8
--- net-tools-2.0/man/en_US/ifconfig.8.man 2014-04-26 02:45:16.000000000 +0200
+++ net-tools-2.0/man/en_US/ifconfig.8 2014-07-07 14:51:31.379459422 +0200
@@ -5,6 +5,13 @@ ifconfig \- configure a network interfac
.B "ifconfig [-v] [-a] [-s] [interface]"
.br
.B "ifconfig [-v] interface [aftype] options | address ..."
+
+.SH NOTE
+.P
+This program is obsolete!
+For replacement check \fBip addr\fR and \fBip link\fR.
+For statistics use \fBip -s link\fR.
+
.SH DESCRIPTION
.B Ifconfig
is used to configure the kernel-resident network interfaces. It is
@@ -222,7 +229,8 @@ package to display link layer informatio
While appletalk DDP and IPX addresses will be displayed they cannot be
altered by this command.
.SH SEE ALSO
-route(8), netstat(8), arp(8), rarp(8), iptables(8), ifup(8), interfaces(5).
+.BR ip(8),
+.BR iptables(8)
.br
http://physics.nist.gov/cuu/Units/binary.html - Prefixes for binary multiples
.SH AUTHORS
diff -up net-tools-2.0/man/en_US/mii-tool.8.man net-tools-2.0/man/en_US/mii-tool.8
--- net-tools-2.0/man/en_US/mii-tool.8.man 2014-04-26 02:45:16.000000000 +0200
+++ net-tools-2.0/man/en_US/mii-tool.8 2014-07-07 14:51:31.379459422 +0200
@@ -18,6 +18,10 @@ mii\-tool \- view, manipulate media-inde
[\fB\-p\fR, \fB\-\-phy=\fIaddr\fR]
.RI "interface\ ..."
+.SH NOTE
+.P
+This program is obsolete. For replacement check \fBethtool\fB.
+
.SH DESCRIPTION
This utility checks or sets the status of a network interface's Media
Independent Interface (MII) unit. Most fast ethernet adapters use an
@@ -93,6 +97,9 @@ SIOCGMIIPHY on 'eth?' failed: Operation
The interface in question does not support MII queries. Most likely, it does not have
MII transceivers, at all.
+.SH SEE ALSO
+ethtool(8)
+
.SH AUTHORS
David Hinds \- dhinds@pcmcia.sourceforge.org
.br
diff -up net-tools-2.0/man/en_US/nameif.8.man net-tools-2.0/man/en_US/nameif.8
--- net-tools-2.0/man/en_US/nameif.8.man 2014-04-26 02:45:16.000000000 +0200
+++ net-tools-2.0/man/en_US/nameif.8 2014-07-07 14:51:31.379459422 +0200
@@ -5,6 +5,12 @@ nameif \- name network interfaces based
.B "nameif [\-c configfile] [\-s]"
.br
.B "nameif [\-c configfile] [\-s] {interface macaddress}"
+
+.SH NOTE
+.P
+This program is obsolete. For replacement check \fBip link\fR.
+This functionality is also much better provided by udev methods.
+
.SH DESCRIPTION
.B nameif
renames network interfaces based on mac addresses. When no arguments are
@@ -31,5 +37,10 @@ should be run before the interface is up
.SH FILES
/etc/mactab
+
+.SH SEE ALSO
+.BR ip(8),
+.BR udev(7)
+
.SH BUGS
Only works for Ethernet currently.
diff -up net-tools-2.0/man/en_US/route.8.man net-tools-2.0/man/en_US/route.8
--- net-tools-2.0/man/en_US/route.8.man 2014-04-26 02:45:16.000000000 +0200
+++ net-tools-2.0/man/en_US/route.8 2014-07-07 14:52:58.766977905 +0200
@@ -57,6 +57,11 @@ family
.RB [ \-\-version ]
.RB [ \-h ]
.RB [ \-\-help ]
+
+.SH NOTE
+.P
+This program is obsolete. For replacement check \fBip route\fR.
+
.SH DESCRIPTION
.B Route
manipulates the kernel's IP routing tables. Its primary use is to set
@@ -330,10 +335,6 @@ Whether or not the hardware address for
.I /proc/net/rt_cache
.LP
.SH "SEE ALSO"
-.IR ifconfig (8),
-.IR netstat (8),
-.IR arp (8),
-.IR rarp (8),
.IR ip (8)
.LP
.SH HISTORY

43
net-tools-timer-man.patch Normal file
View File

@ -0,0 +1,43 @@
diff --git a/man/en_US/netstat.8.old b/man/en_US/netstat.8
index f22c2c5..d78a54a 100644
--- a/man/en_US/netstat.8.old
+++ b/man/en_US/netstat.8
@@ -311,7 +311,37 @@ causes this column to be included. You will also need
privileges to see this information on sockets you don't own. This
identification information is not yet available for IPX sockets.
.SS "Timer"
-(this needs to be written)
+TCP timer associated with this socket. The format is timer(a/b/c). The timer is one of the following values:
+.TP
+.I
+off
+There is no timer set for this socket.
+.TP
+.I
+on
+The retransmission timer is active for the socket.
+.TP
+.I
+keepalive
+The keepalive timer is active for the socket.
+.TP
+.I
+timewait
+The connection is closing and the timewait timer is active for the socket.
+.P
+The values in the brackets:
+.TP
+.I
+a
+Timer value.
+.TP
+.I
+b
+Number of retransmissions sent.
+.TP
+.I
+c
+Number of keepalives sent.
.P
.SS Active UNIX domain Sockets
.SS "Proto"

118
net-tools.spec Normal file
View File

@ -0,0 +1,118 @@
%global checkout 20160912git
Name: net-tools
Version: 2.0
Release: 0.53
Summary: Important Programs for Networking
License: GPLv2+
URL: https://sourceforge.net/projects/net-tools/
Source0: net-tools-%{version}.%{checkout}.tar.xz
Source1: net-tools-config.h
Source2: net-tools-config.make
Source3: ether-wake.c
Source4: ether-wake.8
Source5: mii-diag.c
Source6: mii-diag.8
Source7: iptunnel.8
Source8: ipmaddr.8
Source9: arp-ethers.service
Patch1: net-tools-cycle.patch
Patch2: net-tools-man.patch
Patch3: net-tools-linux48.patch
Patch20: ether-wake-interfaces.patch
Patch21: net-tools-ifconfig-EiB.patch
Patch22: net-tools-timer-man.patch
Patch23: net-tools-interface-name-len.patch
BuildRequires: bluez-libs-devel gettext, libselinux libselinux-devel systemd gcc
%{?systemd_requires}
%description
This package contains programs for network administration and maintenance.
Most of the utilities formerly contained in this package (netstat, arp,
ifconfig, rarp, route) are obsoleted by the tools from iproute2 package (ip, ss)
and have been moved to net-tools-deprecated.
%package_help
%prep
%setup -q -c
cp %SOURCE1 ./config.h
cp %SOURCE2 ./config.make
cp %SOURCE3 .
cp %SOURCE4 ./man/en_US
cp %SOURCE5 .
cp %SOURCE6 ./man/en_US
cp %SOURCE7 ./man/en_US
cp %SOURCE8 ./man/en_US
%patch1 -p1 -b .cycle
%patch2 -p1 -b .man
%patch3 -p1 -b .linux48
%patch20 -p1 -b .interfaces
%patch21 -p1 -b .ifconfig-EiB
%patch22 -p1 -b .timer-man
%patch23 -p1 -b .interface-name-len
touch ./config.h
%build
export CFLAGS="${RPM_OPT_FLAGS} -fpie"
export LDFLAGS="${RPM_LD_FLAGS} -pie -Wl,-z,now"
make
make ether-wake
gcc ${RPM_OPT_FLAGS} ${RPM_LD_FLAGS} -o mii-diag mii-diag.c
%install
mv man/de_DE man/de
mv man/fr_FR man/fr
mv man/pt_BR man/pt
make BASEDIR=%{buildroot} BINDIR=%{_bindir} SBINDIR=%{_sbindir} install
cp %{buildroot}%{_bindir}/ifconfig %{buildroot}%{_sbindir}
rm -f %{buildroot}%{_bindir}/ifconfig
cp %{buildroot}%{_bindir}/route %{buildroot}%{_sbindir}
rm -f %{buildroot}%{_bindir}/route
cp -p ether-wake %{buildroot}%{_sbindir}
chmod 755 %{buildroot}%{_sbindir}/ether-wake
cp -p mii-diag %{buildroot}%{_sbindir}
chmod 755 %{buildroot}%{_sbindir}/mii-diag
mkdir -p %{buildroot}%{_unitdir}
cp %{SOURCE9} %{buildroot}%{_unitdir}
chmod 644 %{buildroot}%{_unitdir}/arp-ethers.service
touch %{buildroot}%{_unitdir}/arp-ethers.service
%post
%systemd_post arp-ethers.service
%files
%defattr(-,root,root)
%license COPYING
%{_bindir}/netstat
%{_prefix}/lib/systemd/system/arp-ethers.service
%{_sbindir}/*
%{_datadir}/locale/*
%exclude %{_sbindir}/rarp
%files help
%defattr(-,root,root)
%{_mandir}/de/man5/*.gz
%{_mandir}/de/man8/*.gz
%{_mandir}/fr/man5/*.gz
%{_mandir}/fr/man8/*.gz
%{_mandir}/man5/ethers.5.gz
%{_mandir}/man8/*.gz
%{_mandir}/pt/man8/*.gz
%exclude %{_mandir}/man8/rarp.8*
%exclude %{_mandir}/de/man8/rarp.8*
%exclude %{_mandir}/fr/man8/rarp.8*
%exclude %{_mandir}/pt/man8/rarp.8*
%exclude %{_mandir}/de/man1
%exclude %{_mandir}/fr/man1
%exclude %{_mandir}/man1
%exclude %{_mandir}/pt/man1
%exclude %{_mandir}/pt/man5
%changelog
* Wed Sep 11 2019 openEuler Buildteam <buildteam@openeuler.org> - 2.0-0.53
- Package init