📄 tcpconn_linux.c
字号:
/* * tcpConnTable MIB architecture support * * $Id: tcpConn_linux.c 15654 2006-12-08 14:30:56Z rstory $ */#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"static intlinux_states[12] = { 1, 5, 3, 4, 6, 7, 11, 1, 8, 9, 2, 10 };static int _load4(netsnmp_container *container, u_int flags);#if defined (NETSNMP_ENABLE_IPV6)static int _load6(netsnmp_container *container, u_int flags);#endif/* * initialize arch specific storage * * @retval 0: success * @retval <0: error */intnetsnmp_arch_tcpconn_entry_init(netsnmp_tcpconn_entry *entry){ /* * init */ return 0;}/* * cleanup arch specific storage */voidnetsnmp_arch_tcpconn_entry_cleanup(netsnmp_tcpconn_entry *entry){ /* * cleanup */}/* * copy arch specific storage */intnetsnmp_arch_tcpconn_entry_copy(netsnmp_tcpconn_entry *lhs, netsnmp_tcpconn_entry *rhs){ return 0;}/* * delete an entry */intnetsnmp_arch_tcpconn_delete(netsnmp_tcpconn_entry *entry){ if (NULL == entry) return -1; /** xxx-rks:9 tcpConn delete not implemented */ return -1;}/** * * @retval 0 no errors * @retval !0 errors */intnetsnmp_arch_tcpconn_container_load(netsnmp_container *container, u_int load_flags ){ int rc = 0; DEBUGMSGTL(("access:tcpconn:container", "tcpconn_container_arch_load (flags %p)\n", load_flags)); if (NULL == container) { snmp_log(LOG_ERR, "no container specified/found for access_tcpconn\n"); return -1; } rc = _load4(container, load_flags);#if defined (NETSNMP_ENABLE_IPV6) if((0 != rc) || (load_flags & NETSNMP_ACCESS_TCPCONN_LOAD_IPV4_ONLY)) return rc; /* * load ipv6. ipv6 module might not be loaded, * so ignore -2 err (file not found) */ rc = _load6(container, load_flags); if (-2 == rc) rc = 0;#endif return rc;}/** * * @retval 0 no errors * @retval !0 errors */static int_load4(netsnmp_container *container, u_int load_flags){ int rc = 0; FILE *in; char line[160]; netsnmp_assert(NULL != container);#define PROCFILE "/proc/net/tcp" if (!(in = fopen(PROCFILE, "r"))) { snmp_log(LOG_ERR,"could not open " PROCFILE "\n"); return -2; } fgets(line, sizeof(line), in); /* skip header */ /* * sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode * 0: 00000000:8000 00000000:0000 0A 00000000:00000000 00:00000000 00000000 29 0 1028 1 df7b1b80 300 0 0 2 -1 */ while (fgets(line, sizeof(line), in)) { netsnmp_tcpconn_entry *entry; int state, rc, local_port, remote_port, tmp_state; size_t buf_len, offset; u_char local_addr[10], remote_addr[10]; u_char *tmp_ptr; if (5 != (rc = sscanf(line, "%*d: %8[0-9A-Z]:%x %8[0-9A-Z]:%x %x", local_addr, &local_port, remote_addr, &remote_port, &tmp_state))) { DEBUGMSGT(("access:tcpconn:container", "error parsing line (%d != 5)\n", rc)); DEBUGMSGT(("access:tcpconn:container"," line '%s'\n", line)); continue; } DEBUGMSGT(("verbose:access:tcpconn:container"," line '%s'\n", line)); /* * check if we care about listen state */ state = (tmp_state & 0xf) < 12 ? linux_states[tmp_state & 0xf] : 2; if (load_flags) { if (TCPCONNECTIONSTATE_LISTEN == state) { if (load_flags & NETSNMP_ACCESS_TCPCONN_LOAD_NOLISTEN) { DEBUGMSGT(("verbose:access:tcpconn:container", " skipping listen\n")); continue; } } else if (load_flags & NETSNMP_ACCESS_TCPCONN_LOAD_ONLYLISTEN) { DEBUGMSGT(("verbose:access:tcpconn:container", " skipping non-listen\n")); continue; } } /* */ entry = netsnmp_access_tcpconn_entry_create(); if(NULL == entry) { rc = -3; break; } /** oddly enough, these appear to already be in network order */ entry->loc_port = (unsigned short) local_port; entry->rmt_port = (unsigned short) remote_port; entry->tcpConnState = state; /** the addr string may need work */ buf_len = strlen(local_addr); if ((8 != buf_len) || (-1 == netsnmp_addrstr_hton(local_addr, 8))) { DEBUGMSGT(("verbose:access:tcpconn:container", " error processing local address\n")); netsnmp_access_tcpconn_entry_free(entry); continue; } offset = 0; tmp_ptr = entry->loc_addr; rc = netsnmp_hex_to_binary(&tmp_ptr, &buf_len, &offset, 0, local_addr, NULL); entry->loc_addr_len = offset; if ( 4 != entry->loc_addr_len ) { DEBUGMSGT(("access:tcpconn:container", "error parsing local addr (%d != 4)\n", entry->loc_addr_len)); DEBUGMSGT(("access:tcpconn:container"," line '%s'\n", line)); netsnmp_access_tcpconn_entry_free(entry); continue; } /** the addr string may need work */ buf_len = strlen((char*)remote_addr); if ((8 != buf_len) || (-1 == netsnmp_addrstr_hton(remote_addr, 8))) { DEBUGMSGT(("verbose:access:tcpconn:container", " error processing remote address\n")); netsnmp_access_tcpconn_entry_free(entry); continue; } offset = 0; tmp_ptr = entry->rmt_addr; rc = netsnmp_hex_to_binary(&tmp_ptr, &buf_len, &offset, 0, remote_addr, NULL); entry->rmt_addr_len = offset; if ( 4 != entry->rmt_addr_len ) { DEBUGMSGT(("access:tcpconn:container", "error parsing remote addr (%d != 4)\n", entry->rmt_addr_len)); DEBUGMSGT(("access:tcpconn:container"," line '%s'\n", line)); netsnmp_access_tcpconn_entry_free(entry); continue; } /* * add entry to container */ entry->arbitrary_index = CONTAINER_SIZE(container) + 1; CONTAINER_INSERT(container, entry); } fclose(in); if(rc<0) return rc; return 0;}#if defined (NETSNMP_ENABLE_IPV6)/** * * @retval 0 no errors * @retval !0 errors */static int_load6(netsnmp_container *container, u_int load_flags){ int rc = 0; FILE *in; char line[180]; static int log_open_err = 1; netsnmp_assert(NULL != container);#undef PROCFILE#define PROCFILE "/proc/net/tcp6" if (!(in = fopen(PROCFILE, "r"))) { snmp_log(LOG_ERR,"could not open " PROCFILE "\n"); if (1 == log_open_err) { snmp_log(LOG_ERR,"could not open " PROCFILE "\n"); log_open_err = 0; } return -2; } /* * if we turned off logging of open errors, turn it back on now that * we have been able to open the file. */ if (0 == log_open_err) log_open_err = 1; fgets(line, sizeof(line), in); /* skip header */ /* * Note: PPC (big endian) * * sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode * 0: 00000000000000000000000000000001:1466 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 500 0 326699 1 efb81580 3000 0 0 2 -1 */ while (fgets(line, sizeof(line), in)) { netsnmp_tcpconn_entry *entry; int state, rc, local_port, remote_port, tmp_state; size_t buf_len, offset; u_char local_addr[48], remote_addr[48]; u_char *tmp_ptr; if (5 != (rc = sscanf(line, "%*d: %47[0-9A-Z]:%x %47[0-9A-Z]:%x %x", local_addr, &local_port, remote_addr, &remote_port, &tmp_state))) { DEBUGMSGT(("access:tcpconn:container", "error parsing line (%d != 5)\n", rc)); DEBUGMSGT(("access:tcpconn:container"," line '%s'\n", line)); continue; } DEBUGMSGT(("verbose:access:tcpconn:container"," line '%s'\n", line)); /* * check if we care about listen state */ state = (tmp_state & 0xf) < 12 ? linux_states[tmp_state & 0xf] : 2; if (load_flags) { if (TCPCONNECTIONSTATE_LISTEN == state) { if (load_flags & NETSNMP_ACCESS_TCPCONN_LOAD_NOLISTEN) { DEBUGMSGT(("verbose:access:tcpconn:container", " skipping listen\n")); continue; } } else if (load_flags & NETSNMP_ACCESS_TCPCONN_LOAD_ONLYLISTEN) { DEBUGMSGT(("verbose:access:tcpconn:container", " skipping non-listen\n")); continue; } } /* */ entry = netsnmp_access_tcpconn_entry_create(); if(NULL == entry) { rc = -3; break; } /** oddly enough, these appear to already be in network order */ entry->loc_port = (unsigned short) local_port; entry->rmt_port = (unsigned short) remote_port; entry->tcpConnState = state; /** the addr string may need work */ buf_len = strlen((char*)local_addr); if ((32 != buf_len) || (-1 == netsnmp_addrstr_hton(local_addr, 32))) { DEBUGMSGT(("verbose:access:tcpconn:container", " error processing local address\n")); netsnmp_access_tcpconn_entry_free(entry); continue; } offset = 0; tmp_ptr = entry->loc_addr; rc = netsnmp_hex_to_binary(&tmp_ptr, &buf_len, &offset, 0, local_addr, NULL); entry->loc_addr_len = offset; if (( 16 != entry->loc_addr_len ) && ( 20 != entry->loc_addr_len )) { DEBUGMSGT(("access:tcpconn:container", "error parsing local addr (%d != 16|20)\n", entry->loc_addr_len)); DEBUGMSGT(("access:tcpconn:container"," line '%s'\n", line)); netsnmp_access_tcpconn_entry_free(entry); continue; } buf_len = strlen((char*)remote_addr); if ((32 != buf_len) || (-1 == netsnmp_addrstr_hton(remote_addr, 32))) { DEBUGMSGT(("verbose:access:tcpconn:container", " error processing remote address\n")); netsnmp_access_tcpconn_entry_free(entry); continue; } offset = 0; tmp_ptr = entry->rmt_addr; rc = netsnmp_hex_to_binary(&tmp_ptr, &buf_len, &offset, 0, remote_addr, NULL); entry->rmt_addr_len = offset; if (( 16 != entry->rmt_addr_len ) && ( 20 != entry->rmt_addr_len )) { DEBUGMSGT(("access:tcpconn:container", "error parsing remote addr (%d != 16|20)\n", entry->rmt_addr_len)); DEBUGMSGT(("access:tcpconn:container"," line '%s'\n", line)); netsnmp_access_tcpconn_entry_free(entry); continue; } /* * add entry to container */ entry->arbitrary_index = CONTAINER_SIZE(container) + 1; CONTAINER_INSERT(container, entry); } fclose(in); if(rc<0) return rc; return 0;}#endif /* NETSNMP_ENABLE_IPV6 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -