2 * Host Resources MIB - network device group implementation - hr_network.c
6 #include <net-snmp/net-snmp-config.h>
15 #include <netinet/mib_kern.h>
19 #include "mibII/interfaces.h"
20 #include "hr_network.h"
23 /*********************
25 * Kernel & interface information,
26 * and internal forward declarations
28 *********************/
30 void Init_HR_Network(void);
31 int Get_Next_HR_Network(void);
32 void Save_HR_Network_Info(void);
34 const char *describe_networkIF(int);
35 int network_status(int);
36 int network_errors(int);
37 int header_hrnet(struct variable *, oid *, size_t *, int,
38 size_t *, WriteMethod **);
40 #define HRN_MONOTONICALLY_INCREASING
42 /*********************
44 * Initialisation & common implementation functions
46 *********************/
48 #define HRNET_IFINDEX 1
50 struct variable4 hrnet_variables[] = {
51 {HRNET_IFINDEX, ASN_INTEGER, RONLY, var_hrnet, 2, {1, 1}}
53 oid hrnet_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 3, 4 };
59 init_device[HRDEV_NETWORK] = Init_HR_Network;
60 next_device[HRDEV_NETWORK] = Get_Next_HR_Network;
61 save_device[HRDEV_NETWORK] = Save_HR_Network_Info;
62 #ifdef HRN_MONOTONICALLY_INCREASING
63 dev_idx_inc[HRDEV_NETWORK] = 1;
66 device_descr[HRDEV_NETWORK] = describe_networkIF;
67 device_status[HRDEV_NETWORK] = network_status;
68 device_errors[HRDEV_NETWORK] = network_errors;
70 REGISTER_MIB("host/hr_network", hrnet_variables, variable4,
77 * vp IN - pointer to variable entry that points here
78 * name IN/OUT - IN/name requested, OUT/name found
79 * length IN/OUT - length of IN/OUT oid's
80 * exact IN - TRUE if an exact match was requested
81 * var_len OUT - length of variable or 0 if function returned
87 header_hrnet(struct variable *vp,
90 int exact, size_t * var_len, WriteMethod ** write_method)
92 #define HRNET_ENTRY_NAME_LENGTH 11
93 oid newname[MAX_OID_LEN];
98 DEBUGMSGTL(("host/hr_network", "var_hrnet: "));
99 DEBUGMSGOID(("host/hr_network", name, *length));
100 DEBUGMSG(("host/hr_network", " %d\n", exact));
102 memcpy((char *) newname, (char *) vp->name, vp->namelen * sizeof(oid));
104 * Find "next" net entry
109 net_idx = Get_Next_HR_Network();
112 newname[HRNET_ENTRY_NAME_LENGTH] = net_idx;
113 result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
114 if (exact && (result == 0)) {
118 if (!exact && (result < 0) &&
119 (LowIndex == -1 || net_idx < LowIndex)) {
121 #ifdef HRN_MONOTONICALLY_INCREASING
127 if (LowIndex == -1) {
128 DEBUGMSGTL(("host/hr_network", "... index out of range\n"));
129 return (MATCH_FAILED);
132 newname[HRNET_ENTRY_NAME_LENGTH] = LowIndex;
133 memcpy((char *) name, (char *) newname,
134 (vp->namelen + 1) * sizeof(oid));
135 *length = vp->namelen + 1;
137 *var_len = sizeof(long); /* default to 'long' results */
139 DEBUGMSGTL(("host/hr_network", "... get net stats "));
140 DEBUGMSGOID(("host/hr_network", name, *length));
141 DEBUGMSG(("host/hr_network", "\n"));
146 /*********************
148 * System specific implementation functions
150 *********************/
154 var_hrnet(struct variable * vp,
157 int exact, size_t * var_len, WriteMethod ** write_method)
161 net_idx = header_hrnet(vp, name, length, exact, var_len, write_method);
162 if (net_idx == MATCH_FAILED)
168 long_return = net_idx & ((1 << HRDEV_TYPE_SHIFT) - 1);
169 return (u_char *) & long_return;
171 DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrnet\n",
178 /*********************
180 * Internal implementation functions
182 *********************/
186 static short HRN_index;
189 static char HRN_name[MAX_PHYSADDR_LEN];
190 static nmapi_phystat HRN_ifnet;
191 #define M_Interface_Scan_Next(a, b, c, d) Interface_Scan_Next(a, b, c)
193 static char HRN_name[16];
194 static struct ifnet HRN_ifnet;
195 #define M_Interface_Scan_Next(a, b, c, d) Interface_Scan_Next(a, b, c, d)
199 static char HRN_savedName[MAX_PHYSADDR_LEN];
201 static char HRN_savedName[16];
203 static u_short HRN_savedFlags;
204 static int HRN_savedErrors;
208 Init_HR_Network(void)
211 Interface_Scan_Init();
216 Get_Next_HR_Network(void)
219 if (M_Interface_Scan_Next(&HRN_index, HRN_name, &HRN_ifnet, NULL))
220 return (HRDEV_NETWORK << HRDEV_TYPE_SHIFT) + HRN_index;
227 Save_HR_Network_Info(void)
229 strcpy(HRN_savedName, HRN_name);
231 HRN_savedFlags = HRN_ifnet.if_entry.ifOper;
232 HRN_savedErrors = HRN_ifnet.if_entry.ifInErrors +
233 HRN_ifnet.if_entry.ifOutErrors;
235 HRN_savedFlags = HRN_ifnet.if_flags;
236 HRN_savedErrors = HRN_ifnet.if_ierrors + HRN_ifnet.if_oerrors;
242 describe_networkIF(int idx)
244 static char string[100];
246 snprintf(string, sizeof(string)-1, "network interface %s", HRN_savedName);
247 string[ sizeof(string)-1 ] = 0;
253 network_status(int idx)
256 if (HRN_savedFlags == LINK_UP)
258 if (HRN_savedFlags & IFF_UP)
260 return 2; /* running */
266 network_errors(int idx)
268 return HRN_savedErrors;