|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* tcpConnTable MIB architecture support for NetBSD
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
#include <net-snmp/net-snmp-config.h>
|
|
Packit |
fcad23 |
#include <net-snmp/net-snmp-includes.h>
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include <net-snmp/agent/net-snmp-agent-includes.h>
|
|
Packit |
fcad23 |
#include <net-snmp/data_access/tcpConn.h>
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include "tcp-mib/tcpConnectionTable/tcpConnectionTable_constants.h"
|
|
Packit |
fcad23 |
#include "tcp-mib/data_access/tcpConn_private.h"
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include "mibII/mibII_common.h"
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#if HAVE_NETINET_TCP_H
|
|
Packit |
fcad23 |
#include <netinet/tcp.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_NETINET_TCP_TIMER_H
|
|
Packit |
fcad23 |
#include <netinet/tcp_timer.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_NETINET_TCPIP_H
|
|
Packit |
fcad23 |
#include <netinet/tcpip.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_NETINET_TCP_VAR_H
|
|
Packit |
fcad23 |
#include <netinet/tcp_var.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static int _load(netsnmp_container *container, u_int flags, int var);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* initialize arch specific storage
|
|
Packit |
fcad23 |
*
|
|
Packit |
fcad23 |
* @retval 0: success
|
|
Packit |
fcad23 |
* @retval <0: error
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
netsnmp_arch_tcpconn_entry_init(netsnmp_tcpconn_entry *entry)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* init
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* cleanup arch specific storage
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
netsnmp_arch_tcpconn_entry_cleanup(netsnmp_tcpconn_entry *entry)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* cleanup
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* copy arch specific storage
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
netsnmp_arch_tcpconn_entry_copy(netsnmp_tcpconn_entry *lhs,
|
|
Packit |
fcad23 |
netsnmp_tcpconn_entry *rhs)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* delete an entry
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
netsnmp_arch_tcpconn_entry_delete(netsnmp_tcpconn_entry *entry)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
if (NULL == entry)
|
|
Packit |
fcad23 |
return -1;
|
|
Packit |
fcad23 |
/** xxx-rks:9 tcpConn delete not implemented */
|
|
Packit |
fcad23 |
return -1;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/**
|
|
Packit |
fcad23 |
*
|
|
Packit |
fcad23 |
* @retval 0 no errors
|
|
Packit |
fcad23 |
* @retval !0 errors
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
netsnmp_arch_tcpconn_container_load(netsnmp_container *container,
|
|
Packit |
fcad23 |
u_int load_flags )
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
int rc = 0;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
DEBUGMSGTL(("access:tcpconn:container",
|
|
Packit |
fcad23 |
"tcpconn_container_arch_load (flags %x)\n", load_flags));
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (NULL == container) {
|
|
Packit |
fcad23 |
snmp_log(LOG_ERR, "no container specified/found for access_tcpconn\n");
|
|
Packit |
fcad23 |
return -1;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
rc = _load(container, load_flags, 4);
|
|
Packit |
fcad23 |
#if defined(NETSNMP_ENABLE_IPV6)
|
|
Packit |
fcad23 |
rc = _load(container, load_flags, 6);
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return rc;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/**
|
|
Packit |
fcad23 |
*
|
|
Packit |
fcad23 |
* @retval 0 no errors
|
|
Packit |
fcad23 |
* @retval !0 errors
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
static int
|
|
Packit |
fcad23 |
_load(netsnmp_container *container, u_int load_flags, int ver)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
const char *mibname;
|
|
Packit |
fcad23 |
int mib[8];
|
|
Packit |
fcad23 |
size_t mib_len;
|
|
Packit |
fcad23 |
struct kinfo_pcb *pcblist;
|
|
Packit |
fcad23 |
size_t pcb_len;
|
|
Packit |
fcad23 |
int StateMap[] = { 1, 2, 3, 4, 5, 8, 6, 10, 9, 7, 11 };
|
|
Packit |
fcad23 |
netsnmp_tcpconn_entry *entry;
|
|
Packit |
fcad23 |
int state;
|
|
Packit |
fcad23 |
int i, rc = 0;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Read in the buffer containing the TCP table data
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
switch (ver) {
|
|
Packit |
fcad23 |
case 4:
|
|
Packit |
fcad23 |
mibname = "net.inet.tcp.pcblist";
|
|
Packit |
fcad23 |
break;
|
|
Packit |
fcad23 |
case 6:
|
|
Packit |
fcad23 |
mibname = "net.inet6.tcp6.pcblist";
|
|
Packit |
fcad23 |
break;
|
|
Packit |
fcad23 |
default:
|
|
Packit |
fcad23 |
snmp_log(LOG_ERR, "tcp-mib:data_access:_load: bad version %d\n", ver);
|
|
Packit |
fcad23 |
return -1;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (sysctlnametomib(mibname, mib, &mib_len) == -1) {
|
|
Packit |
fcad23 |
snmp_log(LOG_ERR, "tcp-mib:data_access:_load: cant resolve mib %s\n", mibname);
|
|
Packit |
fcad23 |
return -1;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (sysctl(mib, sizeof(mib) / sizeof(*mib), NULL, &pcb_len, NULL, 0) == -1) {
|
|
Packit |
fcad23 |
snmp_log(LOG_ERR, "tcp-mib:data_access:_load: cant size mib %s\n", mibname);
|
|
Packit |
fcad23 |
return -1;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if ((pcblist = malloc(pcb_len)) == NULL) {
|
|
Packit |
fcad23 |
snmp_log(LOG_ERR, "tcp-mib:data_access:_load: cant allocate mib %s\n", mibname);
|
|
Packit |
fcad23 |
return -1;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
memset(pcblist, 0, pcb_len);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
mib[6] = sizeof(*pcblist);
|
|
Packit |
fcad23 |
mib[7] = pcb_len / sizeof(*pcblist);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (sysctl(mib, sizeof(mib) / sizeof(*mib),
|
|
Packit |
fcad23 |
pcblist, &pcb_len, NULL, 0) == -1) {
|
|
Packit |
fcad23 |
snmp_log(LOG_ERR, "tcp-mib:data_access:_load: cant size mib %s\n", mibname);
|
|
Packit |
fcad23 |
return -1;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Unpick this into the constituent structures, and extract
|
|
Packit |
fcad23 |
* the 'inpcb' elements into a linked list (built in reverse)
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
for (i = 0; i < pcb_len / sizeof(*pcblist); i++) {
|
|
Packit |
fcad23 |
struct kinfo_pcb *pcb = pcblist+i;
|
|
Packit |
fcad23 |
state = StateMap[pcb->ki_tstate];
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (load_flags) {
|
|
Packit |
fcad23 |
if (state == TCPCONNECTIONSTATE_LISTEN) {
|
|
Packit |
fcad23 |
if (load_flags & NETSNMP_ACCESS_TCPCONN_LOAD_NOLISTEN) {
|
|
Packit |
fcad23 |
DEBUGMSGT(("verbose:access:tcpconn:container",
|
|
Packit |
fcad23 |
" skipping listen\n"));
|
|
Packit |
fcad23 |
continue;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
else if (load_flags & NETSNMP_ACCESS_TCPCONN_LOAD_ONLYLISTEN) {
|
|
Packit |
fcad23 |
DEBUGMSGT(("verbose:access:tcpconn:container",
|
|
Packit |
fcad23 |
" skipping non-listen\n"));
|
|
Packit |
fcad23 |
continue;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
entry = netsnmp_access_tcpconn_entry_create();
|
|
Packit |
fcad23 |
if(NULL == entry) {
|
|
Packit |
fcad23 |
rc = -3;
|
|
Packit |
fcad23 |
break;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
entry->tcpConnState = state;
|
|
Packit |
fcad23 |
entry->pid = 0;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (ver == 6) {
|
|
Packit |
fcad23 |
struct sockaddr_in6 src, dst;
|
|
Packit |
fcad23 |
memcpy(&src, &pcb->ki_s, sizeof(src));
|
|
Packit |
fcad23 |
memcpy(&dst, &pcb->ki_d, sizeof(dst));
|
|
Packit |
fcad23 |
entry->loc_addr_len = entry->rmt_addr_len = 16;
|
|
Packit |
fcad23 |
memcpy(entry->loc_addr, &src.sin6_addr, 16);
|
|
Packit |
fcad23 |
memcpy(entry->rmt_addr, &dst.sin6_addr, 16);
|
|
Packit |
fcad23 |
entry->loc_port = ntohs(src.sin6_port);
|
|
Packit |
fcad23 |
entry->rmt_port = ntohs(dst.sin6_port);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
else {
|
|
Packit |
fcad23 |
struct sockaddr_in src, dst;
|
|
Packit |
fcad23 |
memcpy(&src, &pcb->ki_s, sizeof(src));
|
|
Packit |
fcad23 |
memcpy(&dst, &pcb->ki_d, sizeof(dst));
|
|
Packit |
fcad23 |
entry->loc_addr_len = entry->rmt_addr_len = 4;
|
|
Packit |
fcad23 |
memcpy(entry->loc_addr, &src.sin_addr, 4);
|
|
Packit |
fcad23 |
memcpy(entry->rmt_addr, &dst.sin_addr, 4);
|
|
Packit |
fcad23 |
entry->loc_port = ntohs(src.sin_port);
|
|
Packit |
fcad23 |
entry->rmt_port = ntohs(dst.sin_port);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* add entry to container
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
entry->arbitrary_index = CONTAINER_SIZE(container) + 1;
|
|
Packit |
fcad23 |
CONTAINER_INSERT(container, entry);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if(rc<0)
|
|
Packit |
fcad23 |
return rc;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|