Blame agent/mibgroup/tcp-mib/data_access/tcpConn_netbsd.c

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
}