fillin tcp connection info
This commit is contained in:
parent
94a5365b7f
commit
b01785ba7c
|
@ -3,6 +3,8 @@
|
|||
#include "sigar_util.h"
|
||||
#include "sigar_os.h"
|
||||
|
||||
#include <inet/ip.h>
|
||||
#include <inet/tcp.h>
|
||||
#include <sys/link.h>
|
||||
#include <sys/lwp.h>
|
||||
#include <sys/proc.h>
|
||||
|
@ -1801,6 +1803,12 @@ int sigar_net_interface_stat_get(sigar_t *sigar, const char *name,
|
|||
return ENXIO;
|
||||
}
|
||||
|
||||
static void ip_format(char *buffer, IpAddress addr)
|
||||
{
|
||||
unsigned char *ap = (unsigned char *)&addr;
|
||||
sprintf(buffer, "%d.%d.%d.%d", ap[0], ap[1], ap[2], ap[3]);
|
||||
}
|
||||
|
||||
static int tcp_connection_list_get(sigar_t *sigar,
|
||||
sigar_net_connection_list_t *connlist,
|
||||
int flags,
|
||||
|
@ -1810,6 +1818,67 @@ static int tcp_connection_list_get(sigar_t *sigar,
|
|||
char *end = (char *)entry + len;
|
||||
|
||||
while ((char *)entry < end) {
|
||||
int state = entry->tcpConnEntryInfo.ce_state;
|
||||
|
||||
if (((flags & SIGAR_NETCONN_SERVER) && (state == TCPS_LISTEN)) ||
|
||||
((flags & SIGAR_NETCONN_CLIENT) && (state != TCPS_LISTEN)))
|
||||
{
|
||||
sigar_net_connection_t *conn;
|
||||
|
||||
SIGAR_NET_CONNLIST_GROW(connlist);
|
||||
conn = &connlist->data[connlist->number++];
|
||||
|
||||
ip_format(conn->local_address, entry->tcpConnLocalAddress);
|
||||
ip_format(conn->remote_address, entry->tcpConnRemAddress);
|
||||
conn->local_port = entry->tcpConnLocalPort;
|
||||
conn->remote_port = entry->tcpConnRemPort;
|
||||
conn->type = SIGAR_NETCONN_TCP;
|
||||
|
||||
switch (state) {
|
||||
case TCPS_CLOSED:
|
||||
conn->state = SIGAR_TCP_CLOSE;
|
||||
break;
|
||||
case TCPS_IDLE:
|
||||
conn->state = SIGAR_TCP_UNKNOWN;/*XXX*/
|
||||
break;
|
||||
case TCPS_BOUND:
|
||||
conn->state = SIGAR_TCP_UNKNOWN;/*XXX*/
|
||||
break;
|
||||
case TCPS_LISTEN:
|
||||
conn->state = SIGAR_TCP_LISTEN;
|
||||
break;
|
||||
case TCPS_SYN_SENT:
|
||||
conn->state = SIGAR_TCP_SYN_SENT;
|
||||
break;
|
||||
case TCPS_SYN_RCVD:
|
||||
conn->state = SIGAR_TCP_SYN_RECV;
|
||||
break;
|
||||
case TCPS_ESTABLISHED:
|
||||
conn->state = SIGAR_TCP_ESTABLISHED;
|
||||
break;
|
||||
case TCPS_CLOSE_WAIT:
|
||||
conn->state = SIGAR_TCP_CLOSE_WAIT;
|
||||
break;
|
||||
case TCPS_FIN_WAIT_1:
|
||||
conn->state = SIGAR_TCP_FIN_WAIT1;
|
||||
break;
|
||||
case TCPS_CLOSING:
|
||||
conn->state = SIGAR_TCP_CLOSING;
|
||||
break;
|
||||
case TCPS_LAST_ACK:
|
||||
conn->state = SIGAR_TCP_LAST_ACK;
|
||||
break;
|
||||
case TCPS_FIN_WAIT_2:
|
||||
conn->state = SIGAR_TCP_FIN_WAIT2;
|
||||
break;
|
||||
case TCPS_TIME_WAIT:
|
||||
conn->state = SIGAR_TCP_TIME_WAIT;
|
||||
break;
|
||||
default:
|
||||
conn->state = SIGAR_TCP_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
entry++;
|
||||
}
|
||||
|
||||
|
@ -1840,6 +1909,8 @@ int sigar_net_connection_list_get(sigar_t *sigar,
|
|||
int rc;
|
||||
struct opthdr *op;
|
||||
|
||||
sigar_net_connection_list_create(connlist);
|
||||
|
||||
while ((rc = get_mib2(&sigar->mib2, &op, &data, &len)) == GET_MIB2_OK) {
|
||||
if ((op->level == MIB2_TCP) &&
|
||||
(op->name == MIB2_TCP_13) &&
|
||||
|
@ -1863,5 +1934,5 @@ int sigar_net_connection_list_get(sigar_t *sigar,
|
|||
/*XXX*/
|
||||
}
|
||||
|
||||
return SIGAR_ENOTIMPL;
|
||||
return SIGAR_OK;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue