implement sigar_net_connection_walk
This commit is contained in:
parent
475ddf2428
commit
bf6984b477
|
@ -1695,10 +1695,10 @@ int sigar_net_interface_stat_get(sigar_t *sigar, const char *name,
|
||||||
#include <netinet/tcp_var.h>
|
#include <netinet/tcp_var.h>
|
||||||
#include <netinet/tcp_fsm.h>
|
#include <netinet/tcp_fsm.h>
|
||||||
|
|
||||||
static int net_connection_list_get(sigar_t *sigar,
|
static int net_connection_get(sigar_net_connection_walker_t *walker, int proto)
|
||||||
sigar_net_connection_list_t *connlist,
|
|
||||||
int flags, int proto)
|
|
||||||
{
|
{
|
||||||
|
sigar_t *sigar = walker->sigar;
|
||||||
|
int flags = walker->flags;
|
||||||
int type, istcp = 0;
|
int type, istcp = 0;
|
||||||
char *buf;
|
char *buf;
|
||||||
const char *mibvar;
|
const char *mibvar;
|
||||||
|
@ -1764,62 +1764,68 @@ static int net_connection_list_get(sigar_t *sigar,
|
||||||
if ((((flags & SIGAR_NETCONN_SERVER) && so->so_qlimit) ||
|
if ((((flags & SIGAR_NETCONN_SERVER) && so->so_qlimit) ||
|
||||||
((flags & SIGAR_NETCONN_CLIENT) && !so->so_qlimit)))
|
((flags & SIGAR_NETCONN_CLIENT) && !so->so_qlimit)))
|
||||||
{
|
{
|
||||||
sigar_net_connection_t *conn;
|
sigar_net_connection_t conn;
|
||||||
|
|
||||||
SIGAR_NET_CONNLIST_GROW(connlist);
|
SIGAR_ZERO(&conn);
|
||||||
conn = &connlist->data[connlist->number++];
|
|
||||||
|
|
||||||
sigar_inet_ntoa(sigar, inp->inp_laddr.s_addr,
|
sigar_inet_ntoa(sigar, inp->inp_laddr.s_addr,
|
||||||
conn->local_address);
|
conn.local_address);
|
||||||
sigar_inet_ntoa(sigar, inp->inp_faddr.s_addr,
|
sigar_inet_ntoa(sigar, inp->inp_faddr.s_addr,
|
||||||
conn->remote_address);
|
conn.remote_address);
|
||||||
conn->local_port = ntohs(inp->inp_lport);
|
conn.local_port = ntohs(inp->inp_lport);
|
||||||
conn->remote_port = ntohs(inp->inp_fport);
|
conn.remote_port = ntohs(inp->inp_fport);
|
||||||
conn->receive_queue = so->so_rcv.sb_cc;
|
conn.receive_queue = so->so_rcv.sb_cc;
|
||||||
conn->send_queue = so->so_snd.sb_cc;
|
conn.send_queue = so->so_snd.sb_cc;
|
||||||
conn->type = type;
|
conn.type = type;
|
||||||
|
|
||||||
if (!istcp) {
|
if (!istcp) {
|
||||||
conn->state = SIGAR_TCP_UNKNOWN;
|
conn.state = SIGAR_TCP_UNKNOWN;
|
||||||
|
if (walker->add_connection(walker, &conn) != SIGAR_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (tp->t_state) {
|
switch (tp->t_state) {
|
||||||
case TCPS_CLOSED:
|
case TCPS_CLOSED:
|
||||||
conn->state = SIGAR_TCP_CLOSE;
|
conn.state = SIGAR_TCP_CLOSE;
|
||||||
break;
|
break;
|
||||||
case TCPS_LISTEN:
|
case TCPS_LISTEN:
|
||||||
conn->state = SIGAR_TCP_LISTEN;
|
conn.state = SIGAR_TCP_LISTEN;
|
||||||
break;
|
break;
|
||||||
case TCPS_SYN_SENT:
|
case TCPS_SYN_SENT:
|
||||||
conn->state = SIGAR_TCP_SYN_SENT;
|
conn.state = SIGAR_TCP_SYN_SENT;
|
||||||
break;
|
break;
|
||||||
case TCPS_SYN_RECEIVED:
|
case TCPS_SYN_RECEIVED:
|
||||||
conn->state = SIGAR_TCP_SYN_RECV;
|
conn.state = SIGAR_TCP_SYN_RECV;
|
||||||
break;
|
break;
|
||||||
case TCPS_ESTABLISHED:
|
case TCPS_ESTABLISHED:
|
||||||
conn->state = SIGAR_TCP_ESTABLISHED;
|
conn.state = SIGAR_TCP_ESTABLISHED;
|
||||||
break;
|
break;
|
||||||
case TCPS_CLOSE_WAIT:
|
case TCPS_CLOSE_WAIT:
|
||||||
conn->state = SIGAR_TCP_CLOSE_WAIT;
|
conn.state = SIGAR_TCP_CLOSE_WAIT;
|
||||||
break;
|
break;
|
||||||
case TCPS_FIN_WAIT_1:
|
case TCPS_FIN_WAIT_1:
|
||||||
conn->state = SIGAR_TCP_FIN_WAIT1;
|
conn.state = SIGAR_TCP_FIN_WAIT1;
|
||||||
break;
|
break;
|
||||||
case TCPS_CLOSING:
|
case TCPS_CLOSING:
|
||||||
conn->state = SIGAR_TCP_CLOSING;
|
conn.state = SIGAR_TCP_CLOSING;
|
||||||
break;
|
break;
|
||||||
case TCPS_LAST_ACK:
|
case TCPS_LAST_ACK:
|
||||||
conn->state = SIGAR_TCP_LAST_ACK;
|
conn.state = SIGAR_TCP_LAST_ACK;
|
||||||
break;
|
break;
|
||||||
case TCPS_FIN_WAIT_2:
|
case TCPS_FIN_WAIT_2:
|
||||||
conn->state = SIGAR_TCP_FIN_WAIT2;
|
conn.state = SIGAR_TCP_FIN_WAIT2;
|
||||||
break;
|
break;
|
||||||
case TCPS_TIME_WAIT:
|
case TCPS_TIME_WAIT:
|
||||||
conn->state = SIGAR_TCP_TIME_WAIT;
|
conn.state = SIGAR_TCP_TIME_WAIT;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
conn->state = SIGAR_TCP_UNKNOWN;
|
conn.state = SIGAR_TCP_UNKNOWN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (walker->add_connection(walker, &conn) != SIGAR_OK) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1830,24 +1836,19 @@ static int net_connection_list_get(sigar_t *sigar,
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sigar_net_connection_list_get(sigar_t *sigar,
|
int sigar_net_connection_walk(sigar_net_connection_walker_t *walker)
|
||||||
sigar_net_connection_list_t *connlist,
|
|
||||||
int flags)
|
|
||||||
{
|
{
|
||||||
|
int flags = walker->flags;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
sigar_net_connection_list_create(connlist);
|
|
||||||
|
|
||||||
if (flags & SIGAR_NETCONN_TCP) {
|
if (flags & SIGAR_NETCONN_TCP) {
|
||||||
status = net_connection_list_get(sigar, connlist,
|
status = net_connection_get(walker, IPPROTO_TCP);
|
||||||
flags, IPPROTO_TCP);
|
|
||||||
if (status != SIGAR_OK) {
|
if (status != SIGAR_OK) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (flags & SIGAR_NETCONN_UDP) {
|
if (flags & SIGAR_NETCONN_UDP) {
|
||||||
status = net_connection_list_get(sigar, connlist,
|
status = net_connection_get(walker, IPPROTO_UDP);
|
||||||
flags, IPPROTO_UDP);
|
|
||||||
if (status != SIGAR_OK) {
|
if (status != SIGAR_OK) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -1856,6 +1857,42 @@ int sigar_net_connection_list_get(sigar_t *sigar,
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int net_connection_list_walker(sigar_net_connection_walker_t *walker,
|
||||||
|
sigar_net_connection_t *conn)
|
||||||
|
{
|
||||||
|
sigar_net_connection_list_t *connlist =
|
||||||
|
(sigar_net_connection_list_t *)walker->data;
|
||||||
|
|
||||||
|
SIGAR_NET_CONNLIST_GROW(connlist);
|
||||||
|
memcpy(&connlist->data[connlist->number++],
|
||||||
|
conn, sizeof(*conn));
|
||||||
|
|
||||||
|
return SIGAR_OK; /* continue loop */
|
||||||
|
}
|
||||||
|
|
||||||
|
int sigar_net_connection_list_get(sigar_t *sigar,
|
||||||
|
sigar_net_connection_list_t *connlist,
|
||||||
|
int flags)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
sigar_net_connection_walker_t walker;
|
||||||
|
|
||||||
|
sigar_net_connection_list_create(connlist);
|
||||||
|
|
||||||
|
walker.sigar = sigar;
|
||||||
|
walker.flags = flags;
|
||||||
|
walker.data = connlist;
|
||||||
|
walker.add_connection = net_connection_list_walker;
|
||||||
|
|
||||||
|
status = sigar_net_connection_walk(&walker);
|
||||||
|
|
||||||
|
if (status != SIGAR_OK) {
|
||||||
|
sigar_net_connection_list_destroy(sigar, connlist);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef DARWIN
|
#ifndef DARWIN
|
||||||
|
|
||||||
#define _KERNEL
|
#define _KERNEL
|
||||||
|
|
Loading…
Reference in New Issue