* Copyright (c) 1983 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
static char sccsid
[] = "@(#)if.c 5.5 (Berkeley) %G%";
#include <netinet/in_var.h>
extern char *routename(), *netname(), *ns_phost();
* Print a description of the network interfaces.
intpr(interval
, ifnetaddr
)
printf("ifnet: symbol not defined\n");
sidewaysintpr((unsigned)interval
, ifnetaddr
);
klseek(kmem
, ifnetaddr
, 0);
read(kmem
, (char *)&ifnetaddr
, sizeof ifnetaddr
);
printf("%-5.5s %-5.5s %-11.11s %-15.15s %8.8s %5.5s %8.8s %5.5s",
"Name", "Mtu", "Network", "Address", "Ipkts", "Ierrs",
while (ifnetaddr
|| ifaddraddr
) {
struct in_addr
inet_makeaddr();
klseek(kmem
, ifnetaddr
, 0);
read(kmem
, (char *)&ifnet
, sizeof ifnet
);
klseek(kmem
, (off_t
)ifnet
.if_name
, 0);
ifnetaddr
= (off_t
) ifnet
.if_next
;
(strcmp(name
, interface
) != 0 || unit
!= ifnet
.if_unit
))
*cp
++ = ifnet
.if_unit
+ '0';
if ((ifnet
.if_flags
&IFF_UP
) == 0)
ifaddraddr
= (off_t
)ifnet
.if_addrlist
;
printf("%-5.5s %-5d ", name
, ifnet
.if_mtu
);
printf("%-11.11s ", "none");
printf("%-15.15s ", "none");
klseek(kmem
, ifaddraddr
, 0);
read(kmem
, (char *)&ifaddr
, sizeof ifaddr
);
ifaddraddr
= (off_t
)ifaddr
.ifa
.ifa_next
;
switch (ifaddr
.ifa
.ifa_addr
.sa_family
) {
printf("%-11.11s ", "none");
printf("%-15.15s ", "none");
sin
= (struct sockaddr_in
*)&ifaddr
.in
.ia_addr
;
/* can't use inet_makeaddr because kernel
in
= inet_makeaddr(ifaddr
.in
.ia_subnet
,
printf("%-11.11s ", netname(in
));
netname(htonl(ifaddr
.in
.ia_subnet
),
ifaddr
.in
.ia_subnetmask
));
printf("%-15.15s ", routename(sin
->sin_addr
));
struct sockaddr_ns
*sns
=
(struct sockaddr_ns
*)&ifaddr
.in
.ia_addr
;
*(union ns_net
*) &net
= sns
->sns_addr
.x_net
;
sprintf(netnum
, "%lxH", ntohl(net
));
printf("ns:%-8s ", netnum
);
printf("%-15s ", ns_phost(sns
));
printf("af%2d: ", ifaddr
.ifa
.ifa_addr
.sa_family
);
for (cp
= (char *)&ifaddr
.ifa
.ifa_addr
+
sizeof(struct sockaddr
) - 1;
cp
>= ifaddr
.ifa
.ifa_addr
.sa_data
; --cp
)
n
= cp
- (char *)ifaddr
.ifa
.ifa_addr
.sa_data
+ 1;
cp
= (char *)ifaddr
.ifa
.ifa_addr
.sa_data
;
printf("%02d.", *cp
++ & 0xff);
printf("%02d", *cp
++ & 0xff);
printf("%02d ", *cp
& 0xff);
printf("%8d %5d %8d %5d %5d",
ifnet
.if_ipackets
, ifnet
.if_ierrors
,
ifnet
.if_opackets
, ifnet
.if_oerrors
,
printf(" %3d", ifnet
.if_timer
);
char ift_name
[16]; /* interface name */
int ift_ip
; /* input packets */
int ift_ie
; /* input errors */
int ift_op
; /* output packets */
int ift_oe
; /* output errors */
int ift_co
; /* collisions */
u_char signalled
; /* set if alarm goes off "early" */
* Print a running summary of interface statistics.
* Repeat display every interval seconds, showing statistics
* collected over that interval. Assumes that interval is non-zero.
* First line printed at top of screen is always cumulative.
sidewaysintpr(interval
, off
)
register struct iftot
*ip
, *total
;
struct iftot
*lastif
, *sum
, *interesting
;
read(kmem
, (char *)&firstifnet
, sizeof (off_t
));
for (off
= firstifnet
, ip
= iftot
; off
;) {
read(kmem
, (char *)&ifnet
, sizeof ifnet
);
klseek(kmem
, (off_t
)ifnet
.if_name
, 0);
read(kmem
, ip
->ift_name
+ 1, 15);
if (interface
&& strcmp(ip
->ift_name
+ 1, interface
) == 0 &&
cp
= index(ip
->ift_name
, '\0');
sprintf(cp
, "%d)", ifnet
.if_unit
);
if (ip
>= iftot
+ MAXIF
- 2)
off
= (off_t
) ifnet
.if_next
;
(void)signal(SIGALRM
, catchalarm
);
printf(" input %-6.6s output ", interesting
->ift_name
);
printf(" input (Total) output");
for (ip
= iftot
; ip
< iftot
+ MAXIF
; ip
++) {
printf("%8.8s %5.5s %8.8s %5.5s %5.5s ",
"packets", "errs", "packets", "errs", "colls");
printf("%8.8s %5.5s %8.8s %5.5s %5.5s ",
"packets", "errs", "packets", "errs", "colls");
for (off
= firstifnet
, ip
= iftot
; off
&& ip
< lastif
; ip
++) {
read(kmem
, (char *)&ifnet
, sizeof ifnet
);
printf("%8d %5d %8d %5d %5d ",
ifnet
.if_ipackets
- ip
->ift_ip
,
ifnet
.if_ierrors
- ip
->ift_ie
,
ifnet
.if_opackets
- ip
->ift_op
,
ifnet
.if_oerrors
- ip
->ift_oe
,
ifnet
.if_collisions
- ip
->ift_co
);
ip
->ift_ip
= ifnet
.if_ipackets
;
ip
->ift_ie
= ifnet
.if_ierrors
;
ip
->ift_op
= ifnet
.if_opackets
;
ip
->ift_oe
= ifnet
.if_oerrors
;
ip
->ift_co
= ifnet
.if_collisions
;
sum
->ift_ip
+= ip
->ift_ip
;
sum
->ift_ie
+= ip
->ift_ie
;
sum
->ift_op
+= ip
->ift_op
;
sum
->ift_oe
+= ip
->ift_oe
;
sum
->ift_co
+= ip
->ift_co
;
off
= (off_t
) ifnet
.if_next
;
printf("%8d %5d %8d %5d %5d ",
sum
->ift_ip
- total
->ift_ip
,
sum
->ift_ie
- total
->ift_ie
,
sum
->ift_op
- total
->ift_op
,
sum
->ift_oe
- total
->ift_oe
,
sum
->ift_co
- total
->ift_co
);
oldmask
= sigblock(sigmask(SIGALRM
));
* Called if an interval expires before sidewaysintpr has completed a loop.
* Sets a flag to not wait for the alarm.