📄 hr_network.c
字号:
/* * Host Resources MIB - network device group implementation - hr_network.c * */#include <net-snmp/net-snmp-config.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 1struct 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 };voidinit_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 * */intheader_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 * *********************/#ifndef solaris2static short HRN_index;#endif#ifdef hpux11static 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];static struct ifnet HRN_ifnet;#define M_Interface_Scan_Next(a, b, c, d) Interface_Scan_Next(a, b, c, d)#endif#ifdef hpux11static char HRN_savedName[MAX_PHYSADDR_LEN];#elsestatic char HRN_savedName[16];#endifstatic u_short HRN_savedFlags;static int HRN_savedErrors;voidInit_HR_Network(void){#ifndef solaris2 Interface_Scan_Init();#endif}intGet_Next_HR_Network(void){#ifndef solaris2 if (M_Interface_Scan_Next(&HRN_index, HRN_name, &HRN_ifnet, NULL)) return (HRDEV_NETWORK << HRDEV_TYPE_SHIFT) + HRN_index; else#endif return -1;}voidSave_HR_Network_Info(void){ strcpy(HRN_savedName, HRN_name);#ifdef hpux11 HRN_savedFlags = HRN_ifnet.if_entry.ifOper; HRN_savedErrors = HRN_ifnet.if_entry.ifInErrors + HRN_ifnet.if_entry.ifOutErrors;#else /* hpux11 */ HRN_savedFlags = HRN_ifnet.if_flags; HRN_savedErrors = HRN_ifnet.if_ierrors + HRN_ifnet.if_oerrors;#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;}intnetwork_status(int idx){#ifdef hpux11 if (HRN_savedFlags == LINK_UP)#else if (HRN_savedFlags & IFF_UP)#endif return 2; /* running */ else return 5; /* down */}intnetwork_errors(int idx){ return HRN_savedErrors;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -