linprocfs: Migrate to IfAPI
Summary: Migrate linprocfs to use the IfAPI interfaces instead of direct ifnet accesses. Reviewed by: dchagin Sponsored by: Juniper Networks, Inc. Differential Revision: https://reviews.freebsd.org/D38358
This commit is contained in:
parent
2eeb808361
commit
5243598927
@ -1474,26 +1474,79 @@ linprocfs_doprocmem(PFS_FILL_ARGS)
|
||||
return (error);
|
||||
}
|
||||
|
||||
struct linux_ifname_cb_s {
|
||||
struct ifnet *ifp;
|
||||
int ethno;
|
||||
char *buffer;
|
||||
size_t buflen;
|
||||
};
|
||||
|
||||
static int
|
||||
linux_ifname_cb(if_t ifp, void *arg)
|
||||
{
|
||||
struct linux_ifname_cb_s *cbs = arg;
|
||||
|
||||
if (ifp == cbs->ifp)
|
||||
return (snprintf(cbs->buffer, cbs->buflen, "eth%d", cbs->ethno));
|
||||
if (!linux_use_real_ifname(ifp))
|
||||
cbs->ethno++;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
linux_ifname(struct ifnet *ifp, char *buffer, size_t buflen)
|
||||
{
|
||||
struct ifnet *ifscan;
|
||||
int ethno;
|
||||
struct linux_ifname_cb_s arg;
|
||||
|
||||
IFNET_RLOCK_ASSERT();
|
||||
|
||||
arg.ifp = ifp;
|
||||
arg.buffer = buffer;
|
||||
arg.buflen = buflen;
|
||||
arg.ethno = 0;
|
||||
|
||||
/* Short-circuit non ethernet interfaces */
|
||||
if (linux_use_real_ifname(ifp))
|
||||
return (strlcpy(buffer, ifp->if_xname, buflen));
|
||||
return (strlcpy(buffer, if_name(ifp), buflen));
|
||||
|
||||
/* Determine the (relative) unit number for ethernet interfaces */
|
||||
ethno = 0;
|
||||
CK_STAILQ_FOREACH(ifscan, &V_ifnet, if_link) {
|
||||
if (ifscan == ifp)
|
||||
return (snprintf(buffer, buflen, "eth%d", ethno));
|
||||
if (!linux_use_real_ifname(ifscan))
|
||||
ethno++;
|
||||
}
|
||||
return (if_foreach(linux_ifname_cb, &arg));
|
||||
}
|
||||
|
||||
static int
|
||||
linprocfs_donetdev_cb(if_t ifp, void *arg)
|
||||
{
|
||||
char ifname[16]; /* XXX LINUX_IFNAMSIZ */
|
||||
struct sbuf *sb = arg;
|
||||
|
||||
linux_ifname(ifp, ifname, sizeof ifname);
|
||||
sbuf_printf(sb, "%6.6s: ", ifname);
|
||||
sbuf_printf(sb, "%7ju %7ju %4ju %4ju %4lu %5lu %10lu %9ju ",
|
||||
(uintmax_t )if_getcounter(ifp, IFCOUNTER_IBYTES),
|
||||
(uintmax_t )if_getcounter(ifp, IFCOUNTER_IPACKETS),
|
||||
(uintmax_t )if_getcounter(ifp, IFCOUNTER_IERRORS),
|
||||
(uintmax_t )if_getcounter(ifp, IFCOUNTER_IQDROPS),
|
||||
/* rx_missed_errors */
|
||||
0UL, /* rx_fifo_errors */
|
||||
0UL, /* rx_length_errors +
|
||||
* rx_over_errors +
|
||||
* rx_crc_errors +
|
||||
* rx_frame_errors */
|
||||
0UL, /* rx_compressed */
|
||||
(uintmax_t )if_getcounter(ifp, IFCOUNTER_IMCASTS));
|
||||
/* XXX-BZ rx only? */
|
||||
sbuf_printf(sb, "%8ju %7ju %4ju %4ju %4lu %5ju %7lu %10lu\n",
|
||||
(uintmax_t )if_getcounter(ifp, IFCOUNTER_OBYTES),
|
||||
(uintmax_t )if_getcounter(ifp, IFCOUNTER_OPACKETS),
|
||||
(uintmax_t )if_getcounter(ifp, IFCOUNTER_OERRORS),
|
||||
(uintmax_t )if_getcounter(ifp, IFCOUNTER_OQDROPS),
|
||||
0UL, /* tx_fifo_errors */
|
||||
(uintmax_t )if_getcounter(ifp, IFCOUNTER_COLLISIONS),
|
||||
0UL, /* tx_carrier_errors +
|
||||
* tx_aborted_errors +
|
||||
* tx_window_errors +
|
||||
* tx_heartbeat_errors*/
|
||||
0UL); /* tx_compressed */
|
||||
|
||||
return (0);
|
||||
}
|
||||
@ -1504,9 +1557,6 @@ linux_ifname(struct ifnet *ifp, char *buffer, size_t buflen)
|
||||
static int
|
||||
linprocfs_donetdev(PFS_FILL_ARGS)
|
||||
{
|
||||
char ifname[16]; /* XXX LINUX_IFNAMSIZ */
|
||||
struct ifnet *ifp;
|
||||
|
||||
sbuf_printf(sb, "%6s|%58s|%s\n"
|
||||
"%6s|%58s|%58s\n",
|
||||
"Inter-", " Receive", " Transmit",
|
||||
@ -1516,36 +1566,7 @@ linprocfs_donetdev(PFS_FILL_ARGS)
|
||||
|
||||
CURVNET_SET(TD_TO_VNET(curthread));
|
||||
IFNET_RLOCK();
|
||||
CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) {
|
||||
linux_ifname(ifp, ifname, sizeof ifname);
|
||||
sbuf_printf(sb, "%6.6s: ", ifname);
|
||||
sbuf_printf(sb, "%7ju %7ju %4ju %4ju %4lu %5lu %10lu %9ju ",
|
||||
(uintmax_t )ifp->if_get_counter(ifp, IFCOUNTER_IBYTES),
|
||||
(uintmax_t )ifp->if_get_counter(ifp, IFCOUNTER_IPACKETS),
|
||||
(uintmax_t )ifp->if_get_counter(ifp, IFCOUNTER_IERRORS),
|
||||
(uintmax_t )ifp->if_get_counter(ifp, IFCOUNTER_IQDROPS),
|
||||
/* rx_missed_errors */
|
||||
0UL, /* rx_fifo_errors */
|
||||
0UL, /* rx_length_errors +
|
||||
* rx_over_errors +
|
||||
* rx_crc_errors +
|
||||
* rx_frame_errors */
|
||||
0UL, /* rx_compressed */
|
||||
(uintmax_t )ifp->if_get_counter(ifp, IFCOUNTER_IMCASTS));
|
||||
/* XXX-BZ rx only? */
|
||||
sbuf_printf(sb, "%8ju %7ju %4ju %4ju %4lu %5ju %7lu %10lu\n",
|
||||
(uintmax_t )ifp->if_get_counter(ifp, IFCOUNTER_OBYTES),
|
||||
(uintmax_t )ifp->if_get_counter(ifp, IFCOUNTER_OPACKETS),
|
||||
(uintmax_t )ifp->if_get_counter(ifp, IFCOUNTER_OERRORS),
|
||||
(uintmax_t )ifp->if_get_counter(ifp, IFCOUNTER_OQDROPS),
|
||||
0UL, /* tx_fifo_errors */
|
||||
(uintmax_t )ifp->if_get_counter(ifp, IFCOUNTER_COLLISIONS),
|
||||
0UL, /* tx_carrier_errors +
|
||||
* tx_aborted_errors +
|
||||
* tx_window_errors +
|
||||
* tx_heartbeat_errors*/
|
||||
0UL); /* tx_compressed */
|
||||
}
|
||||
if_foreach(linprocfs_donetdev_cb, sb);
|
||||
IFNET_RUNLOCK();
|
||||
CURVNET_RESTORE();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user