diff options
Diffstat (limited to 'agent/mibgroup/tcp-mib/data_access/tcpConn_common.c')
-rw-r--r-- | agent/mibgroup/tcp-mib/data_access/tcpConn_common.c | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/agent/mibgroup/tcp-mib/data_access/tcpConn_common.c b/agent/mibgroup/tcp-mib/data_access/tcpConn_common.c new file mode 100644 index 0000000..5d4e8c0 --- /dev/null +++ b/agent/mibgroup/tcp-mib/data_access/tcpConn_common.c @@ -0,0 +1,267 @@ +/* + * TcpConn MIB architecture support + * + * $Id: tcpConn_common.c 16724 2007-10-14 22:10:09Z magfr $ + */ +#include <net-snmp/net-snmp-config.h> +#include <net-snmp/net-snmp-includes.h> + +#include <net-snmp/agent/net-snmp-agent-includes.h> +#include <net-snmp/data_access/tcpConn.h> + +#include "tcp-mib/tcpConnectionTable/tcpConnectionTable_constants.h" +#include "tcp-mib/data_access/tcpConn_private.h" + +/**---------------------------------------------------------------------*/ +/* + * local static prototypes + */ +static void _access_tcpconn_entry_release(netsnmp_tcpconn_entry * entry, + void *unused); + +/**---------------------------------------------------------------------*/ +/* + * external per-architecture functions prototypes + * + * These shouldn't be called by the general public, so they aren't in + * the header file. + */ +extern int +netsnmp_arch_tcpconn_container_load(netsnmp_container* container, + u_int load_flags); +extern int +netsnmp_arch_tcpconn_entry_init(netsnmp_tcpconn_entry *entry); +extern int +netsnmp_arch_tcpconn_entry_copy(netsnmp_tcpconn_entry *lhs, + netsnmp_tcpconn_entry *rhs); +extern void +netsnmp_arch_tcpconn_entry_cleanup(netsnmp_tcpconn_entry *entry); + + + +/**---------------------------------------------------------------------*/ +/* + * container functions + */ +/** + */ +netsnmp_container * +netsnmp_access_tcpconn_container_init(u_int flags) +{ + netsnmp_container *container1; + + DEBUGMSGTL(("access:tcpconn:container", "init\n")); + + /* + * create the container + */ + container1 = netsnmp_container_find("access:tcpconn:table_container"); + if (NULL == container1) { + snmp_log(LOG_ERR, "tcpconn primary container not found\n"); + return NULL; + } + container1->container_name = strdup("tcpConnTable"); + + return container1; +} + +/** + * @retval NULL error + * @retval !NULL pointer to container + */ +netsnmp_container* +netsnmp_access_tcpconn_container_load(netsnmp_container* container, u_int load_flags) +{ + int rc; + + DEBUGMSGTL(("access:tcpconn:container", "load\n")); + + if (NULL == container) + container = netsnmp_access_tcpconn_container_init(load_flags); + if (NULL == container) { + snmp_log(LOG_ERR, "no container specified/found for access_tcpconn\n"); + return NULL; + } + + rc = netsnmp_arch_tcpconn_container_load(container, load_flags); + if (0 != rc) { + netsnmp_access_tcpconn_container_free(container, + NETSNMP_ACCESS_TCPCONN_FREE_NOFLAGS); + container = NULL; + } + + return container; +} + +void +netsnmp_access_tcpconn_container_free(netsnmp_container *container, u_int free_flags) +{ + DEBUGMSGTL(("access:tcpconn:container", "free\n")); + + if (NULL == container) { + snmp_log(LOG_ERR, "invalid container for netsnmp_access_tcpconn_free\n"); + return; + } + + if(! (free_flags & NETSNMP_ACCESS_TCPCONN_FREE_DONT_CLEAR)) { + /* + * free all items. + */ + CONTAINER_CLEAR(container, + (netsnmp_container_obj_func*)_access_tcpconn_entry_release, + NULL); + } + + if(! (free_flags & NETSNMP_ACCESS_TCPCONN_FREE_KEEP_CONTAINER)) + CONTAINER_FREE(container); +} + +/**---------------------------------------------------------------------*/ +/* + * tcpconn_entry functions + */ +/** + */ +/** + */ +netsnmp_tcpconn_entry * +netsnmp_access_tcpconn_entry_create(void) +{ + netsnmp_tcpconn_entry *entry = + SNMP_MALLOC_TYPEDEF(netsnmp_tcpconn_entry); + int rc = 0; + + DEBUGMSGTL(("verbose:access:tcpconn:entry", "create\n")); + + entry->oid_index.len = 1; + entry->oid_index.oids = &entry->arbitrary_index; + + /* + * init arch data + */ + rc = netsnmp_arch_tcpconn_entry_init(entry); + if (SNMP_ERR_NOERROR != rc) { + DEBUGMSGT(("access:tcpconn:create","error %d in arch init\n", rc)); + netsnmp_access_tcpconn_entry_free(entry); + } + + return entry; +} + +/** + */ +void +netsnmp_access_tcpconn_entry_free(netsnmp_tcpconn_entry * entry) +{ + if (NULL == entry) + return; + + DEBUGMSGTL(("verbose:access:tcpconn:entry", "free\n")); + + if (NULL != entry->arch_data) + netsnmp_arch_tcpconn_entry_cleanup(entry); + + free(entry); +} + +/** + * update underlying data store (kernel) for entry + * + * @retval 0 : success + * @retval -1 : error + */ +int +netsnmp_access_tcpconn_entry_set(netsnmp_tcpconn_entry * entry) +{ + int rc = SNMP_ERR_NOERROR; + + if (NULL == entry) { + netsnmp_assert(NULL != entry); + return -1; + } + + DEBUGMSGTL(("access:tcpconn:entry", "set\n")); + + + /* + * only option is delete + */ + if (! (entry->flags & NETSNMP_ACCESS_TCPCONN_DELETE)) + return -1; + + rc = netsnmp_arch_tcpconn_delete(entry); + + return rc; +} + +/** + * update an old tcpconn_entry from a new one + * + * @note: only mib related items are compared. Internal objects + * such as oid_index, ns_ia_index and flags are not compared. + * + * @retval -1 : error + * @retval >=0 : number of fileds updated + */ +int +netsnmp_access_tcpconn_entry_update(netsnmp_tcpconn_entry *lhs, + netsnmp_tcpconn_entry *rhs) +{ + int rc, changed = 0; + + DEBUGMSGTL(("access:tcpconn:entry", "update\n")); + + if (lhs->tcpConnState != rhs->tcpConnState) { + ++changed; + lhs->tcpConnState = rhs->tcpConnState; + } + + if (lhs->pid != rhs->pid) { + ++changed; + lhs->pid = rhs->pid; + } + + /* + * copy arch stuff. we don't care if it changed + */ + rc = netsnmp_arch_tcpconn_entry_copy(lhs,rhs); + if (0 != rc) { + snmp_log(LOG_ERR,"arch tcpconn copy failed\n"); + return -1; + } + + return changed; +} + +/**---------------------------------------------------------------------*/ +/* + * Utility routines + */ + +/** + */ +void +_access_tcpconn_entry_release(netsnmp_tcpconn_entry * entry, void *context) +{ + netsnmp_access_tcpconn_entry_free(entry); +} + + +#ifdef NETSNMP_TCPCONN_TEST + +int +main(int argc, char** argv) +{ + netsnmp_container *container; + + netsnmp_config("debugTokens access:tcp,verbose:access:tcp,tcp,verbose:tcp"); + + netsnmp_container_init_list(); + + dodebug = 1; + + container = netsnmp_access_tcpconn_container_load(NULL, 0); + + netsnmp_access_tcpconn_container_free(container, 0); +} +#endif |