summaryrefslogtreecommitdiff
path: root/agent/mibgroup/host/hr_network.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/host/hr_network.c')
-rw-r--r--agent/mibgroup/host/hr_network.c288
1 files changed, 288 insertions, 0 deletions
diff --git a/agent/mibgroup/host/hr_network.c b/agent/mibgroup/host/hr_network.c
new file mode 100644
index 0000000..6d267e6
--- /dev/null
+++ b/agent/mibgroup/host/hr_network.c
@@ -0,0 +1,288 @@
+/*
+ * Host Resources MIB - network device group implementation - hr_network.c
+ *
+ */
+
+#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/interface.h>
+#if HAVE_STRING_H
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
+#ifdef hpux11
+#include <sys/mib.h>
+#include <netinet/mib_kern.h>
+#endif
+
+#include "host_res.h"
+#include "mibII/interfaces.h"
+#include "hr_network.h"
+
+
+ /*********************
+ *
+ * Kernel & interface information,
+ * and internal forward declarations
+ *
+ *********************/
+
+void Init_HR_Network(void);
+int Get_Next_HR_Network(void);
+void Save_HR_Network_Info(void);
+
+const char *describe_networkIF(int);
+int network_status(int);
+int network_errors(int);
+int header_hrnet(struct variable *, oid *, size_t *, int,
+ size_t *, WriteMethod **);
+
+#define HRN_MONOTONICALLY_INCREASING
+
+ /*********************
+ *
+ * Initialisation & common implementation functions
+ *
+ *********************/
+
+#define HRNET_IFINDEX 1
+
+struct variable4 hrnet_variables[] = {
+ {HRNET_IFINDEX, ASN_INTEGER, RONLY, var_hrnet, 2, {1, 1}}
+};
+oid hrnet_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 3, 4 };
+
+
+void
+init_hr_network(void)
+{
+ init_device[HRDEV_NETWORK] = Init_HR_Network;
+ next_device[HRDEV_NETWORK] = Get_Next_HR_Network;
+ save_device[HRDEV_NETWORK] = Save_HR_Network_Info;
+#ifdef HRN_MONOTONICALLY_INCREASING
+ dev_idx_inc[HRDEV_NETWORK] = 1;
+#endif
+
+ device_descr[HRDEV_NETWORK] = describe_networkIF;
+ device_status[HRDEV_NETWORK] = network_status;
+ device_errors[HRDEV_NETWORK] = network_errors;
+
+ REGISTER_MIB("host/hr_network", hrnet_variables, variable4,
+ hrnet_variables_oid);
+}
+
+/*
+ * header_hrnet(...
+ * Arguments:
+ * vp IN - pointer to variable entry that points here
+ * name IN/OUT - IN/name requested, OUT/name found
+ * length IN/OUT - length of IN/OUT oid's
+ * exact IN - TRUE if an exact match was requested
+ * var_len OUT - length of variable or 0 if function returned
+ * write_method
+ *
+ */
+
+int
+header_hrnet(struct variable *vp,
+ oid * name,
+ size_t * length,
+ int exact, size_t * var_len, WriteMethod ** write_method)
+{
+#define HRNET_ENTRY_NAME_LENGTH 11
+ oid newname[MAX_OID_LEN];
+ int net_idx;
+ int result;
+ int LowIndex = -1;
+
+ DEBUGMSGTL(("host/hr_network", "var_hrnet: "));
+ DEBUGMSGOID(("host/hr_network", name, *length));
+ DEBUGMSG(("host/hr_network", " %d\n", exact));
+
+ memcpy((char *) newname, (char *) vp->name, vp->namelen * sizeof(oid));
+ /*
+ * Find "next" net entry
+ */
+
+ Init_HR_Network();
+ for (;;) {
+ net_idx = Get_Next_HR_Network();
+ if (net_idx == -1)
+ break;
+ newname[HRNET_ENTRY_NAME_LENGTH] = net_idx;
+ result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
+ if (exact && (result == 0)) {
+ LowIndex = net_idx;
+ break;
+ }
+ if (!exact && (result < 0) &&
+ (LowIndex == -1 || net_idx < LowIndex)) {
+ LowIndex = net_idx;
+#ifdef HRN_MONOTONICALLY_INCREASING
+ break;
+#endif
+ }
+ }
+
+ if (LowIndex == -1) {
+ DEBUGMSGTL(("host/hr_network", "... index out of range\n"));
+ return (MATCH_FAILED);
+ }
+
+ newname[HRNET_ENTRY_NAME_LENGTH] = LowIndex;
+ memcpy((char *) name, (char *) newname,
+ (vp->namelen + 1) * sizeof(oid));
+ *length = vp->namelen + 1;
+ *write_method = 0;
+ *var_len = sizeof(long); /* default to 'long' results */
+
+ DEBUGMSGTL(("host/hr_network", "... get net stats "));
+ DEBUGMSGOID(("host/hr_network", name, *length));
+ DEBUGMSG(("host/hr_network", "\n"));
+ return LowIndex;
+}
+
+
+ /*********************
+ *
+ * System specific implementation functions
+ *
+ *********************/
+
+
+u_char *
+var_hrnet(struct variable * vp,
+ oid * name,
+ size_t * length,
+ int exact, size_t * var_len, WriteMethod ** write_method)
+{
+ int net_idx;
+
+ net_idx = header_hrnet(vp, name, length, exact, var_len, write_method);
+ if (net_idx == MATCH_FAILED)
+ return NULL;
+
+
+ switch (vp->magic) {
+ case HRNET_IFINDEX:
+ long_return = net_idx & ((1 << HRDEV_TYPE_SHIFT) - 1);
+ return (u_char *) & long_return;
+ default:
+ DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrnet\n",
+ vp->magic));
+ }
+ return NULL;
+}
+
+
+ /*********************
+ *
+ * Internal implementation functions
+ *
+ *********************/
+
+
+#if defined( USING_IF_MIB_IFTABLE_IFTABLE_DATA_ACCESS_MODULE )
+static char HRN_name[16];
+static netsnmp_interface_entry *HRN_ifnet;
+#define M_Interface_Scan_Next(a, b, c, d) Interface_Scan_Next(a, b, c, d)
+#elif defined(hpux11)
+static char HRN_name[MAX_PHYSADDR_LEN];
+static nmapi_phystat HRN_ifnet;
+#define M_Interface_Scan_Next(a, b, c, d) Interface_Scan_Next(a, b, c)
+#else /* hpux11 */
+static char HRN_name[16];
+#ifndef WIN32
+static struct ifnet HRN_ifnet;
+#endif /* WIN32 */
+#define M_Interface_Scan_Next(a, b, c, d) Interface_Scan_Next(a, b, c, d)
+#endif
+
+#ifdef hpux11
+static char HRN_savedName[MAX_PHYSADDR_LEN];
+#else
+static char HRN_savedName[16];
+#endif
+static u_short HRN_savedFlags;
+static int HRN_savedErrors;
+
+
+void
+Init_HR_Network(void)
+{
+#if !defined( solaris2 )
+ Interface_Scan_Init();
+#endif
+}
+
+int
+Get_Next_HR_Network(void)
+{
+short HRN_index;
+#if !defined( solaris2) && ! defined( WIN32 )
+ if (M_Interface_Scan_Next(&HRN_index, HRN_name, &HRN_ifnet, NULL) == 0)
+ HRN_index = -1;
+#else
+ HRN_index = -1;
+#endif
+ if (-1 == HRN_index)
+ return HRN_index;
+
+ return (HRDEV_NETWORK << HRDEV_TYPE_SHIFT) + HRN_index;
+}
+
+void
+Save_HR_Network_Info(void)
+{
+ strcpy(HRN_savedName, HRN_name);
+#if defined( USING_IF_MIB_IFTABLE_IFTABLE_DATA_ACCESS_MODULE )
+ HRN_savedFlags = HRN_ifnet->os_flags;
+ HRN_savedErrors = HRN_ifnet->stats.ierrors + HRN_ifnet->stats.oerrors;
+#elif defined( hpux11 )
+ HRN_savedFlags = HRN_ifnet.if_entry.ifOper;
+ HRN_savedErrors = HRN_ifnet.if_entry.ifInErrors +
+ HRN_ifnet.if_entry.ifOutErrors;
+#else /* hpux11 */
+#ifndef WIN32
+ HRN_savedFlags = HRN_ifnet.if_flags;
+ HRN_savedErrors = HRN_ifnet.if_ierrors + HRN_ifnet.if_oerrors;
+#endif /* WIN32 */
+#endif /* hpux11 */
+}
+
+
+const char *
+describe_networkIF(int idx)
+{
+ static char string[1024];
+
+ snprintf(string, sizeof(string)-1, "network interface %s", HRN_savedName);
+ string[ sizeof(string)-1 ] = 0;
+ return string;
+}
+
+
+int
+network_status(int idx)
+{
+#ifndef WIN32
+#ifdef hpux11
+ if (HRN_savedFlags == LINK_UP)
+#else
+ if (HRN_savedFlags & IFF_UP)
+#endif
+ return 2; /* running */
+ else
+ return 5; /* down */
+#endif /* WIN32 */
+
+}
+
+int
+network_errors(int idx)
+{
+ return HRN_savedErrors;
+}