use libperfstat for net_interface_stat when available
This commit is contained in:
parent
98c1392db0
commit
ea4f9c7ee4
|
@ -379,6 +379,23 @@ static int sigar_perfstat_init(sigar_t *sigar)
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sigar->perfstat.ifstat =
|
||||||
|
(perfstat_ifstat_func_t)dlsym(handle,
|
||||||
|
"sigar_perfstat_netinterface");
|
||||||
|
|
||||||
|
if (!sigar->perfstat.ifstat) {
|
||||||
|
if (SIGAR_LOG_IS_DEBUG(sigar)) {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_DEBUG,
|
||||||
|
"dlsym(sigar_perfstat_netinterface) failed: %s",
|
||||||
|
dlerror());
|
||||||
|
}
|
||||||
|
|
||||||
|
dlclose(handle);
|
||||||
|
|
||||||
|
sigar->perfstat.avail = -1;
|
||||||
|
return ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
sigar->perfstat.avail = 1;
|
sigar->perfstat.avail = 1;
|
||||||
sigar->perfstat.handle = handle;
|
sigar->perfstat.handle = handle;
|
||||||
|
|
||||||
|
@ -1951,14 +1968,17 @@ int sigar_net_route_list_get(sigar_t *sigar,
|
||||||
return SIGAR_ENOTIMPL;
|
return SIGAR_ENOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sigar_net_interface_stat_get(sigar_t *sigar, const char *name,
|
static int sigar_net_interface_stat_get_kmem(sigar_t *sigar,
|
||||||
sigar_net_interface_stat_t *ifstat)
|
const char *name,
|
||||||
|
sigar_net_interface_stat_t *ifstat)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
struct ifnet data;
|
struct ifnet data;
|
||||||
caddr_t offset = 0;
|
caddr_t offset = 0;
|
||||||
char if_name[32];
|
char if_name[32];
|
||||||
|
|
||||||
|
sigar_log(sigar, SIGAR_LOG_DEBUG, "[ifstat] using /dev/kmem");
|
||||||
|
|
||||||
status = kread(sigar, &offset, sizeof(offset),
|
status = kread(sigar, &offset, sizeof(offset),
|
||||||
sigar->koffsets[KOFFSET_IFNET]);
|
sigar->koffsets[KOFFSET_IFNET]);
|
||||||
|
|
||||||
|
@ -2008,6 +2028,61 @@ int sigar_net_interface_stat_get(sigar_t *sigar, const char *name,
|
||||||
return ENXIO;
|
return ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sigar_net_interface_stat_get_perfstat(sigar_t *sigar,
|
||||||
|
const char *name,
|
||||||
|
sigar_net_interface_stat_t *ifstat)
|
||||||
|
{
|
||||||
|
perfstat_id_t id;
|
||||||
|
perfstat_netinterface_t data;
|
||||||
|
|
||||||
|
sigar_log(sigar, SIGAR_LOG_DEBUG, "[ifstat] using libperfstat");
|
||||||
|
|
||||||
|
SIGAR_SSTRCPY(id.name, name);
|
||||||
|
|
||||||
|
if (sigar->perfstat.ifstat(&id, &data) == 1) {
|
||||||
|
ifstat->rx_bytes = data.ibytes;
|
||||||
|
ifstat->rx_packets = data.ipackets;
|
||||||
|
ifstat->rx_errors = data.ierrors;
|
||||||
|
ifstat->rx_dropped = SIGAR_FIELD_NOTIMPL;
|
||||||
|
ifstat->rx_overruns = SIGAR_FIELD_NOTIMPL;
|
||||||
|
ifstat->rx_frame = SIGAR_FIELD_NOTIMPL;
|
||||||
|
|
||||||
|
ifstat->tx_bytes = data.obytes;
|
||||||
|
ifstat->tx_packets = data.opackets;
|
||||||
|
ifstat->tx_errors = data.oerrors;
|
||||||
|
ifstat->tx_dropped = SIGAR_FIELD_NOTIMPL;
|
||||||
|
ifstat->tx_overruns = SIGAR_FIELD_NOTIMPL;
|
||||||
|
ifstat->tx_collisions = data.collisions;
|
||||||
|
ifstat->tx_carrier = SIGAR_FIELD_NOTIMPL;
|
||||||
|
|
||||||
|
ifstat->speed = data.bitrate;
|
||||||
|
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SIGAR_LOG_IS_DEBUG(sigar)) {
|
||||||
|
sigar_log_printf(sigar, SIGAR_LOG_DEBUG,
|
||||||
|
"[ifstat] dev=%s query failed: %s",
|
||||||
|
name,
|
||||||
|
sigar_strerror(sigar, errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
return sigar_net_interface_stat_get_kmem(sigar, name, ifstat);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sigar_net_interface_stat_get(sigar_t *sigar, const char *name,
|
||||||
|
sigar_net_interface_stat_t *ifstat)
|
||||||
|
{
|
||||||
|
sigar_perfstat_init(sigar);
|
||||||
|
|
||||||
|
if (sigar->perfstat.ifstat) {
|
||||||
|
return sigar_net_interface_stat_get_perfstat(sigar, name, ifstat);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return sigar_net_interface_stat_get_kmem(sigar, name, ifstat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#define IS_TCP_SERVER(state, flags) \
|
#define IS_TCP_SERVER(state, flags) \
|
||||||
((flags & SIGAR_NETCONN_SERVER) && (state == TCPS_LISTEN))
|
((flags & SIGAR_NETCONN_SERVER) && (state == TCPS_LISTEN))
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,9 @@ typedef int (*perfstat_disk_func_t)(perfstat_id_t *,
|
||||||
perfstat_disk_t *,
|
perfstat_disk_t *,
|
||||||
size_t, int);
|
size_t, int);
|
||||||
|
|
||||||
|
typedef int (*perfstat_ifstat_func_t)(perfstat_id_t *,
|
||||||
|
perfstat_netinterface_t *);
|
||||||
|
|
||||||
typedef int (*thread_rusage_func_t)(struct rusage *, int);
|
typedef int (*thread_rusage_func_t)(struct rusage *, int);
|
||||||
|
|
||||||
struct sigar_t {
|
struct sigar_t {
|
||||||
|
@ -60,6 +63,7 @@ struct sigar_t {
|
||||||
perfstat_cpu_total_func_t cpu_total;
|
perfstat_cpu_total_func_t cpu_total;
|
||||||
perfstat_swap_func_t swap;
|
perfstat_swap_func_t swap;
|
||||||
perfstat_disk_func_t disk;
|
perfstat_disk_func_t disk;
|
||||||
|
perfstat_ifstat_func_t ifstat;
|
||||||
thread_rusage_func_t thread_rusage;
|
thread_rusage_func_t thread_rusage;
|
||||||
void *handle;
|
void *handle;
|
||||||
} perfstat;
|
} perfstat;
|
||||||
|
|
Loading…
Reference in New Issue