[SIGAR-4] Move to walk version of net_stat
This commit is contained in:
parent
86deb1a2d9
commit
614fd63728
|
@ -66,7 +66,8 @@
|
||||||
char *ifconf_buf; \
|
char *ifconf_buf; \
|
||||||
int ifconf_len; \
|
int ifconf_len; \
|
||||||
char *self_path; \
|
char *self_path; \
|
||||||
sigar_cache_t *proc_cpu
|
sigar_cache_t *proc_cpu; \
|
||||||
|
sigar_cache_t *net_listen
|
||||||
|
|
||||||
#if defined(WIN32)
|
#if defined(WIN32)
|
||||||
# define SIGAR_INLINE __inline
|
# define SIGAR_INLINE __inline
|
||||||
|
|
127
src/sigar.c
127
src/sigar.c
|
@ -38,6 +38,7 @@ SIGAR_DECLARE(int) sigar_open(sigar_t **sigar)
|
||||||
(*sigar)->ptql_re_data = NULL;
|
(*sigar)->ptql_re_data = NULL;
|
||||||
(*sigar)->self_path = NULL;
|
(*sigar)->self_path = NULL;
|
||||||
(*sigar)->proc_cpu = NULL;
|
(*sigar)->proc_cpu = NULL;
|
||||||
|
(*sigar)->net_listen = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
@ -54,6 +55,9 @@ SIGAR_DECLARE(int) sigar_close(sigar_t *sigar)
|
||||||
if (sigar->proc_cpu) {
|
if (sigar->proc_cpu) {
|
||||||
sigar_cache_destroy(sigar->proc_cpu);
|
sigar_cache_destroy(sigar->proc_cpu);
|
||||||
}
|
}
|
||||||
|
if (sigar->net_listen) {
|
||||||
|
sigar_cache_destroy(sigar->net_listen);
|
||||||
|
}
|
||||||
|
|
||||||
return sigar_os_close(sigar);
|
return sigar_os_close(sigar);
|
||||||
}
|
}
|
||||||
|
@ -843,7 +847,6 @@ sigar_net_connection_list_get(sigar_t *sigar,
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
sigar_net_stat_t *netstat;
|
sigar_net_stat_t *netstat;
|
||||||
sigar_cache_t *listen_ports;
|
|
||||||
sigar_net_connection_list_t *connlist;
|
sigar_net_connection_list_t *connlist;
|
||||||
} net_stat_getter_t;
|
} net_stat_getter_t;
|
||||||
|
|
||||||
|
@ -856,21 +859,23 @@ static int net_stat_walker(sigar_net_connection_walker_t *walker,
|
||||||
sigar_net_connection_t *conn)
|
sigar_net_connection_t *conn)
|
||||||
{
|
{
|
||||||
int state = conn->state;
|
int state = conn->state;
|
||||||
|
sigar_cache_t *listen_ports = walker->sigar->net_listen;
|
||||||
net_stat_getter_t *getter =
|
net_stat_getter_t *getter =
|
||||||
(net_stat_getter_t *)walker->data;
|
(net_stat_getter_t *)walker->data;
|
||||||
|
|
||||||
if (conn->type == SIGAR_NETCONN_TCP) {
|
if (conn->type == SIGAR_NETCONN_TCP) {
|
||||||
getter->netstat->tcp_states[state]++;
|
getter->netstat->tcp_states[state]++;
|
||||||
|
|
||||||
|
/* XXX listen_ports may get stale */
|
||||||
if (state == SIGAR_TCP_LISTEN) {
|
if (state == SIGAR_TCP_LISTEN) {
|
||||||
sigar_cache_entry_t *entry =
|
sigar_cache_entry_t *entry =
|
||||||
sigar_cache_get(getter->listen_ports,
|
sigar_cache_get(listen_ports,
|
||||||
conn->local_port);
|
conn->local_port);
|
||||||
|
|
||||||
entry->value = (void*)conn->local_port;
|
entry->value = (void*)conn->local_port;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (sigar_cache_find(getter->listen_ports,
|
if (sigar_cache_find(listen_ports,
|
||||||
conn->local_port))
|
conn->local_port))
|
||||||
{
|
{
|
||||||
getter->netstat->tcp_inbound_total++;
|
getter->netstat->tcp_inbound_total++;
|
||||||
|
@ -884,109 +889,39 @@ static int net_stat_walker(sigar_net_connection_walker_t *walker,
|
||||||
/*XXX*/
|
/*XXX*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getter->netstat->all_inbound_total =
|
||||||
|
getter->netstat->tcp_inbound_total;
|
||||||
|
|
||||||
|
getter->netstat->all_outbound_total =
|
||||||
|
getter->netstat->tcp_outbound_total;
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sigar_net_stat_get_walk(sigar_t *sigar,
|
|
||||||
sigar_net_stat_t *netstat,
|
|
||||||
int flags)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
sigar_net_connection_walker_t walker;
|
|
||||||
net_stat_getter_t getter;
|
|
||||||
|
|
||||||
getter.netstat = netstat;
|
|
||||||
getter.listen_ports = sigar_cache_new(32);
|
|
||||||
getter.listen_ports->free_value = listen_port_free;
|
|
||||||
|
|
||||||
walker.sigar = sigar;
|
|
||||||
walker.data = &getter;
|
|
||||||
walker.add_connection = net_stat_walker;
|
|
||||||
|
|
||||||
walker.flags = flags;
|
|
||||||
|
|
||||||
status = sigar_net_connection_walk(&walker);
|
|
||||||
|
|
||||||
sigar_cache_destroy(getter.listen_ports);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int sigar_net_stat_get_list(sigar_t *sigar,
|
|
||||||
sigar_net_stat_t *netstat,
|
|
||||||
int flags)
|
|
||||||
{
|
|
||||||
int status, i;
|
|
||||||
sigar_net_connection_list_t connlist;
|
|
||||||
sigar_cache_t *listen_ports;
|
|
||||||
status = sigar_net_connection_list_get(sigar, &connlist, flags);
|
|
||||||
|
|
||||||
if (status != SIGAR_OK) {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
listen_ports = sigar_cache_new(32);
|
|
||||||
listen_ports->free_value = listen_port_free;
|
|
||||||
|
|
||||||
/* first pass, get states and listening port numbers */
|
|
||||||
for (i=0; i<connlist.number; i++) {
|
|
||||||
sigar_net_connection_t *conn = &connlist.data[i];
|
|
||||||
int state = conn->state;
|
|
||||||
|
|
||||||
netstat->tcp_states[state]++;
|
|
||||||
|
|
||||||
if (state == SIGAR_TCP_LISTEN) {
|
|
||||||
sigar_cache_entry_t *entry =
|
|
||||||
sigar_cache_get(listen_ports,
|
|
||||||
conn->local_port);
|
|
||||||
|
|
||||||
entry->value = (void*)conn->local_port;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* second pass, get addresses connected to listening ports */
|
|
||||||
for (i=0; i<connlist.number; i++) {
|
|
||||||
sigar_net_connection_t *conn = &connlist.data[i];
|
|
||||||
|
|
||||||
if (conn->state != SIGAR_TCP_LISTEN) {
|
|
||||||
if (sigar_cache_find(listen_ports,
|
|
||||||
conn->local_port))
|
|
||||||
{
|
|
||||||
netstat->tcp_inbound_total++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
netstat->tcp_outbound_total++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sigar_cache_destroy(listen_ports);
|
|
||||||
sigar_net_connection_list_destroy(sigar, &connlist);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
SIGAR_DECLARE(int)
|
SIGAR_DECLARE(int)
|
||||||
sigar_net_stat_get(sigar_t *sigar,
|
sigar_net_stat_get(sigar_t *sigar,
|
||||||
sigar_net_stat_t *netstat,
|
sigar_net_stat_t *netstat,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
|
sigar_net_connection_walker_t walker;
|
||||||
|
net_stat_getter_t getter;
|
||||||
|
|
||||||
|
if (!sigar->net_listen) {
|
||||||
|
sigar->net_listen = sigar_cache_new(32);
|
||||||
|
sigar->net_listen->free_value = listen_port_free;
|
||||||
|
}
|
||||||
|
|
||||||
SIGAR_ZERO(netstat);
|
SIGAR_ZERO(netstat);
|
||||||
|
|
||||||
if (getenv("SIGAR_NETSTAT_WALK")) {
|
getter.netstat = netstat;
|
||||||
/* XXX only for testing atm
|
|
||||||
* The 'walk' version is faster that the 'list' version,
|
walker.sigar = sigar;
|
||||||
* however the 'walk' version depends on the underlying
|
walker.data = &getter;
|
||||||
* OS to return connections in the LISTEN state before
|
walker.add_connection = net_stat_walker;
|
||||||
* those which are connected to the given LISTEN port.
|
|
||||||
* Seems this is the case in Linux at least, but that
|
walker.flags = flags;
|
||||||
* is likely subject to change.
|
|
||||||
*/
|
return sigar_net_connection_walk(&walker);
|
||||||
return sigar_net_stat_get_walk(sigar, netstat, flags);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return sigar_net_stat_get_list(sigar, netstat, flags);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
Loading…
Reference in New Issue