1 /* -- DO NOT EDIT --
2 * Generated by smidump version 0.4.3-pre1:
3 * smidump -f scli IF-MIB
4 *
5 * Derived from IF-MIB:
6 * The MIB module to describe generic objects for network
7 * interface sub-layers. This MIB is an updated version of
8 * MIB-II's ifTable, and incorporates the extensions defined in
9 * RFC 1229.
10 *
11 * Revision 2000-06-14 00:00:
12 * Clarifications agreed upon by the Interfaces MIB WG, and
13 * published as RFC 2863.
14 *
15 * Revision 1996-02-28 21:55:
16 * Revisions made by the Interfaces MIB WG, and published in
17 * RFC 2233.
18 *
19 * Revision 1993-11-08 21:55:
20 * Initial revision, published as part of RFC 1573.
21 *
22 * $Id: if-mib.c 1779 2006-02-13 22:25:59Z schoenw $
23 */
24
25 #include "if-mib.h"
26
27 GNetSnmpEnum const if_mib_enums_ifAdminStatus[] = {
28 { IF_MIB_IFADMINSTATUS_UP, "up" },
29 { IF_MIB_IFADMINSTATUS_DOWN, "down" },
30 { IF_MIB_IFADMINSTATUS_TESTING, "testing" },
31 { 0, NULL }
32 };
33
34 GNetSnmpEnum const if_mib_enums_ifOperStatus[] = {
35 { IF_MIB_IFOPERSTATUS_UP, "up" },
36 { IF_MIB_IFOPERSTATUS_DOWN, "down" },
37 { IF_MIB_IFOPERSTATUS_TESTING, "testing" },
38 { IF_MIB_IFOPERSTATUS_UNKNOWN, "unknown" },
39 { IF_MIB_IFOPERSTATUS_DORMANT, "dormant" },
40 { IF_MIB_IFOPERSTATUS_NOTPRESENT, "notPresent" },
41 { IF_MIB_IFOPERSTATUS_LOWERLAYERDOWN, "lowerLayerDown" },
42 { 0, NULL }
43 };
44
45 GNetSnmpEnum const if_mib_enums_ifLinkUpDownTrapEnable[] = {
46 { IF_MIB_IFLINKUPDOWNTRAPENABLE_ENABLED, "enabled" },
47 { IF_MIB_IFLINKUPDOWNTRAPENABLE_DISABLED, "disabled" },
48 { 0, NULL }
49 };
50
51 GNetSnmpEnum const if_mib_enums_ifTestStatus[] = {
52 { IF_MIB_IFTESTSTATUS_NOTINUSE, "notInUse" },
53 { IF_MIB_IFTESTSTATUS_INUSE, "inUse" },
54 { 0, NULL }
55 };
56
57 GNetSnmpEnum const if_mib_enums_ifTestResult[] = {
58 { IF_MIB_IFTESTRESULT_NONE, "none" },
59 { IF_MIB_IFTESTRESULT_SUCCESS, "success" },
60 { IF_MIB_IFTESTRESULT_INPROGRESS, "inProgress" },
61 { IF_MIB_IFTESTRESULT_NOTSUPPORTED, "notSupported" },
62 { IF_MIB_IFTESTRESULT_UNABLETORUN, "unAbleToRun" },
63 { IF_MIB_IFTESTRESULT_ABORTED, "aborted" },
64 { IF_MIB_IFTESTRESULT_FAILED, "failed" },
65 { 0, NULL }
66 };
67
68 GNetSnmpEnum const if_mib_enums_ifRcvAddressType[] = {
69 { IF_MIB_IFRCVADDRESSTYPE_OTHER, "other" },
70 { IF_MIB_IFRCVADDRESSTYPE_VOLATILE, "volatile" },
71 { IF_MIB_IFRCVADDRESSTYPE_NONVOLATILE, "nonVolatile" },
72 { 0, NULL }
73 };
74
75
76 static guint16 ifDescr_constraints[] = {0U, 255U, 0, 0};
77 static guint16 ifName_constraints[] = {0U, 255U, 0, 0};
78 static guint16 ifAlias_constraints[] = {0U, 64U, 0, 0};
79 static gint32 ifTestId_constraints[] = {0L, 2147483647L, 0, 0};
80 static guint16 ifTestOwner_constraints[] = {0U, 255U, 0, 0};
81
82
83 static guint32 const interfaces_oid[] = {1, 3, 6, 1, 2, 1, 2};
84
85 static GNetSnmpAttribute interfaces_attr[] = {
86 { 1, GNET_SNMP_VARBIND_TYPE_INTEGER32,
87 IF_MIB_IFNUMBER, "ifNumber",
88 NULL,
89 G_STRUCT_OFFSET(if_mib_interfaces_t, ifNumber),
90 0,
91 0 },
92 { 0, 0, 0, NULL }
93 };
94
95 static guint32 const ifEntry_oid[] = {1, 3, 6, 1, 2, 1, 2, 2, 1};
96
97 static GNetSnmpAttribute ifEntry_attr[] = {
98 { 2, GNET_SNMP_VARBIND_TYPE_OCTETSTRING,
99 IF_MIB_IFDESCR, "ifDescr",
100 ifDescr_constraints,
101 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifDescr),
102 G_STRUCT_OFFSET(if_mib_ifEntry_t, _ifDescrLength),
103 0 },
104 { 3, GNET_SNMP_VARBIND_TYPE_INTEGER32,
105 IF_MIB_IFTYPE, "ifType",
106 NULL,
107 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifType),
108 0,
109 0 },
110 { 4, GNET_SNMP_VARBIND_TYPE_INTEGER32,
111 IF_MIB_IFMTU, "ifMtu",
112 NULL,
113 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifMtu),
114 0,
115 0 },
116 { 5, GNET_SNMP_VARBIND_TYPE_UNSIGNED32,
117 IF_MIB_IFSPEED, "ifSpeed",
118 NULL,
119 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifSpeed),
120 0,
121 0 },
122 { 6, GNET_SNMP_VARBIND_TYPE_OCTETSTRING,
123 IF_MIB_IFPHYSADDRESS, "ifPhysAddress",
124 NULL,
125 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifPhysAddress),
126 G_STRUCT_OFFSET(if_mib_ifEntry_t, _ifPhysAddressLength),
127 0 },
128 { 7, GNET_SNMP_VARBIND_TYPE_INTEGER32,
129 IF_MIB_IFADMINSTATUS, "ifAdminStatus",
130 NULL,
131 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifAdminStatus),
132 0,
133 GSNMP_ATTR_FLAG_WRITABLE },
134 { 8, GNET_SNMP_VARBIND_TYPE_INTEGER32,
135 IF_MIB_IFOPERSTATUS, "ifOperStatus",
136 NULL,
137 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifOperStatus),
138 0,
139 0 },
140 { 9, GNET_SNMP_VARBIND_TYPE_TIMETICKS,
141 IF_MIB_IFLASTCHANGE, "ifLastChange",
142 NULL,
143 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifLastChange),
144 0,
145 0 },
146 { 10, GNET_SNMP_VARBIND_TYPE_COUNTER32,
147 IF_MIB_IFINOCTETS, "ifInOctets",
148 NULL,
149 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifInOctets),
150 0,
151 0 },
152 { 11, GNET_SNMP_VARBIND_TYPE_COUNTER32,
153 IF_MIB_IFINUCASTPKTS, "ifInUcastPkts",
154 NULL,
155 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifInUcastPkts),
156 0,
157 0 },
158 { 12, GNET_SNMP_VARBIND_TYPE_COUNTER32,
159 IF_MIB_IFINNUCASTPKTS, "ifInNUcastPkts",
160 NULL,
161 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifInNUcastPkts),
162 0,
163 0 },
164 { 13, GNET_SNMP_VARBIND_TYPE_COUNTER32,
165 IF_MIB_IFINDISCARDS, "ifInDiscards",
166 NULL,
167 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifInDiscards),
168 0,
169 0 },
170 { 14, GNET_SNMP_VARBIND_TYPE_COUNTER32,
171 IF_MIB_IFINERRORS, "ifInErrors",
172 NULL,
173 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifInErrors),
174 0,
175 0 },
176 { 15, GNET_SNMP_VARBIND_TYPE_COUNTER32,
177 IF_MIB_IFINUNKNOWNPROTOS, "ifInUnknownProtos",
178 NULL,
179 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifInUnknownProtos),
180 0,
181 0 },
182 { 16, GNET_SNMP_VARBIND_TYPE_COUNTER32,
183 IF_MIB_IFOUTOCTETS, "ifOutOctets",
184 NULL,
185 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifOutOctets),
186 0,
187 0 },
188 { 17, GNET_SNMP_VARBIND_TYPE_COUNTER32,
189 IF_MIB_IFOUTUCASTPKTS, "ifOutUcastPkts",
190 NULL,
191 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifOutUcastPkts),
192 0,
193 0 },
194 { 18, GNET_SNMP_VARBIND_TYPE_COUNTER32,
195 IF_MIB_IFOUTNUCASTPKTS, "ifOutNUcastPkts",
196 NULL,
197 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifOutNUcastPkts),
198 0,
199 0 },
200 { 19, GNET_SNMP_VARBIND_TYPE_COUNTER32,
201 IF_MIB_IFOUTDISCARDS, "ifOutDiscards",
202 NULL,
203 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifOutDiscards),
204 0,
205 0 },
206 { 20, GNET_SNMP_VARBIND_TYPE_COUNTER32,
207 IF_MIB_IFOUTERRORS, "ifOutErrors",
208 NULL,
209 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifOutErrors),
210 0,
211 0 },
212 { 21, GNET_SNMP_VARBIND_TYPE_UNSIGNED32,
213 IF_MIB_IFOUTQLEN, "ifOutQLen",
214 NULL,
215 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifOutQLen),
216 0,
217 0 },
218 { 22, GNET_SNMP_VARBIND_TYPE_OBJECTID,
219 IF_MIB_IFSPECIFIC, "ifSpecific",
220 NULL,
221 G_STRUCT_OFFSET(if_mib_ifEntry_t, ifSpecific),
222 G_STRUCT_OFFSET(if_mib_ifEntry_t, _ifSpecificLength),
223 0 },
224 { 0, 0, 0, NULL }
225 };
226
227 static guint32 const ifMIBObjects_oid[] = {1, 3, 6, 1, 2, 1, 31, 1};
228
229 static GNetSnmpAttribute ifMIBObjects_attr[] = {
230 { 5, GNET_SNMP_VARBIND_TYPE_TIMETICKS,
231 IF_MIB_IFTABLELASTCHANGE, "ifTableLastChange",
232 NULL,
233 G_STRUCT_OFFSET(if_mib_ifMIBObjects_t, ifTableLastChange),
234 0,
235 0 },
236 { 6, GNET_SNMP_VARBIND_TYPE_TIMETICKS,
237 IF_MIB_IFSTACKLASTCHANGE, "ifStackLastChange",
238 NULL,
239 G_STRUCT_OFFSET(if_mib_ifMIBObjects_t, ifStackLastChange),
240 0,
241 0 },
242 { 0, 0, 0, NULL }
243 };
244
245 static guint32 const ifXEntry_oid[] = {1, 3, 6, 1, 2, 1, 31, 1, 1, 1};
246
247 static GNetSnmpAttribute ifXEntry_attr[] = {
248 { 1, GNET_SNMP_VARBIND_TYPE_OCTETSTRING,
249 IF_MIB_IFNAME, "ifName",
250 ifName_constraints,
251 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifName),
252 G_STRUCT_OFFSET(if_mib_ifXEntry_t, _ifNameLength),
253 0 },
254 { 2, GNET_SNMP_VARBIND_TYPE_COUNTER32,
255 IF_MIB_IFINMULTICASTPKTS, "ifInMulticastPkts",
256 NULL,
257 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifInMulticastPkts),
258 0,
259 0 },
260 { 3, GNET_SNMP_VARBIND_TYPE_COUNTER32,
261 IF_MIB_IFINBROADCASTPKTS, "ifInBroadcastPkts",
262 NULL,
263 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifInBroadcastPkts),
264 0,
265 0 },
266 { 4, GNET_SNMP_VARBIND_TYPE_COUNTER32,
267 IF_MIB_IFOUTMULTICASTPKTS, "ifOutMulticastPkts",
268 NULL,
269 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifOutMulticastPkts),
270 0,
271 0 },
272 { 5, GNET_SNMP_VARBIND_TYPE_COUNTER32,
273 IF_MIB_IFOUTBROADCASTPKTS, "ifOutBroadcastPkts",
274 NULL,
275 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifOutBroadcastPkts),
276 0,
277 0 },
278 { 6, GNET_SNMP_VARBIND_TYPE_COUNTER64,
279 IF_MIB_IFHCINOCTETS, "ifHCInOctets",
280 NULL,
281 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifHCInOctets),
282 0,
283 0 },
284 { 7, GNET_SNMP_VARBIND_TYPE_COUNTER64,
285 IF_MIB_IFHCINUCASTPKTS, "ifHCInUcastPkts",
286 NULL,
287 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifHCInUcastPkts),
288 0,
289 0 },
290 { 8, GNET_SNMP_VARBIND_TYPE_COUNTER64,
291 IF_MIB_IFHCINMULTICASTPKTS, "ifHCInMulticastPkts",
292 NULL,
293 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifHCInMulticastPkts),
294 0,
295 0 },
296 { 9, GNET_SNMP_VARBIND_TYPE_COUNTER64,
297 IF_MIB_IFHCINBROADCASTPKTS, "ifHCInBroadcastPkts",
298 NULL,
299 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifHCInBroadcastPkts),
300 0,
301 0 },
302 { 10, GNET_SNMP_VARBIND_TYPE_COUNTER64,
303 IF_MIB_IFHCOUTOCTETS, "ifHCOutOctets",
304 NULL,
305 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifHCOutOctets),
306 0,
307 0 },
308 { 11, GNET_SNMP_VARBIND_TYPE_COUNTER64,
309 IF_MIB_IFHCOUTUCASTPKTS, "ifHCOutUcastPkts",
310 NULL,
311 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifHCOutUcastPkts),
312 0,
313 0 },
314 { 12, GNET_SNMP_VARBIND_TYPE_COUNTER64,
315 IF_MIB_IFHCOUTMULTICASTPKTS, "ifHCOutMulticastPkts",
316 NULL,
317 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifHCOutMulticastPkts),
318 0,
319 0 },
320 { 13, GNET_SNMP_VARBIND_TYPE_COUNTER64,
321 IF_MIB_IFHCOUTBROADCASTPKTS, "ifHCOutBroadcastPkts",
322 NULL,
323 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifHCOutBroadcastPkts),
324 0,
325 0 },
326 { 14, GNET_SNMP_VARBIND_TYPE_INTEGER32,
327 IF_MIB_IFLINKUPDOWNTRAPENABLE, "ifLinkUpDownTrapEnable",
328 NULL,
329 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifLinkUpDownTrapEnable),
330 0,
331 GSNMP_ATTR_FLAG_WRITABLE },
332 { 15, GNET_SNMP_VARBIND_TYPE_UNSIGNED32,
333 IF_MIB_IFHIGHSPEED, "ifHighSpeed",
334 NULL,
335 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifHighSpeed),
336 0,
337 0 },
338 { 16, GNET_SNMP_VARBIND_TYPE_INTEGER32,
339 IF_MIB_IFPROMISCUOUSMODE, "ifPromiscuousMode",
340 NULL,
341 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifPromiscuousMode),
342 0,
343 GSNMP_ATTR_FLAG_WRITABLE },
344 { 17, GNET_SNMP_VARBIND_TYPE_INTEGER32,
345 IF_MIB_IFCONNECTORPRESENT, "ifConnectorPresent",
346 NULL,
347 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifConnectorPresent),
348 0,
349 0 },
350 { 18, GNET_SNMP_VARBIND_TYPE_OCTETSTRING,
351 IF_MIB_IFALIAS, "ifAlias",
352 ifAlias_constraints,
353 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifAlias),
354 G_STRUCT_OFFSET(if_mib_ifXEntry_t, _ifAliasLength),
355 GSNMP_ATTR_FLAG_WRITABLE },
356 { 19, GNET_SNMP_VARBIND_TYPE_TIMETICKS,
357 IF_MIB_IFCOUNTERDISCONTINUITYTIME, "ifCounterDiscontinuityTime",
358 NULL,
359 G_STRUCT_OFFSET(if_mib_ifXEntry_t, ifCounterDiscontinuityTime),
360 0,
361 0 },
362 { 0, 0, 0, NULL }
363 };
364
365 static guint32 const ifStackEntry_oid[] = {1, 3, 6, 1, 2, 1, 31, 1, 2, 1};
366
367 static GNetSnmpAttribute ifStackEntry_attr[] = {
368 { 3, GNET_SNMP_VARBIND_TYPE_INTEGER32,
369 IF_MIB_IFSTACKSTATUS, "ifStackStatus",
370 NULL,
371 G_STRUCT_OFFSET(if_mib_ifStackEntry_t, ifStackStatus),
372 0,
373 GSNMP_ATTR_FLAG_WRITABLE },
374 { 0, 0, 0, NULL }
375 };
376
377 static guint32 const ifTestEntry_oid[] = {1, 3, 6, 1, 2, 1, 31, 1, 3, 1};
378
379 static GNetSnmpAttribute ifTestEntry_attr[] = {
380 { 1, GNET_SNMP_VARBIND_TYPE_INTEGER32,
381 IF_MIB_IFTESTID, "ifTestId",
382 ifTestId_constraints,
383 G_STRUCT_OFFSET(if_mib_ifTestEntry_t, ifTestId),
384 0,
385 GSNMP_ATTR_FLAG_WRITABLE },
386 { 2, GNET_SNMP_VARBIND_TYPE_INTEGER32,
387 IF_MIB_IFTESTSTATUS, "ifTestStatus",
388 NULL,
389 G_STRUCT_OFFSET(if_mib_ifTestEntry_t, ifTestStatus),
390 0,
391 GSNMP_ATTR_FLAG_WRITABLE },
392 { 3, GNET_SNMP_VARBIND_TYPE_OBJECTID,
393 IF_MIB_IFTESTTYPE, "ifTestType",
394 NULL,
395 G_STRUCT_OFFSET(if_mib_ifTestEntry_t, ifTestType),
396 G_STRUCT_OFFSET(if_mib_ifTestEntry_t, _ifTestTypeLength),
397 GSNMP_ATTR_FLAG_WRITABLE },
398 { 4, GNET_SNMP_VARBIND_TYPE_INTEGER32,
399 IF_MIB_IFTESTRESULT, "ifTestResult",
400 NULL,
401 G_STRUCT_OFFSET(if_mib_ifTestEntry_t, ifTestResult),
402 0,
403 0 },
404 { 5, GNET_SNMP_VARBIND_TYPE_OBJECTID,
405 IF_MIB_IFTESTCODE, "ifTestCode",
406 NULL,
407 G_STRUCT_OFFSET(if_mib_ifTestEntry_t, ifTestCode),
408 G_STRUCT_OFFSET(if_mib_ifTestEntry_t, _ifTestCodeLength),
409 0 },
410 { 6, GNET_SNMP_VARBIND_TYPE_OCTETSTRING,
411 IF_MIB_IFTESTOWNER, "ifTestOwner",
412 ifTestOwner_constraints,
413 G_STRUCT_OFFSET(if_mib_ifTestEntry_t, ifTestOwner),
414 G_STRUCT_OFFSET(if_mib_ifTestEntry_t, _ifTestOwnerLength),
415 GSNMP_ATTR_FLAG_WRITABLE },
416 { 0, 0, 0, NULL }
417 };
418
419 static guint32 const ifRcvAddressEntry_oid[] = {1, 3, 6, 1, 2, 1, 31, 1, 4, 1};
420
421 static GNetSnmpAttribute ifRcvAddressEntry_attr[] = {
422 { 2, GNET_SNMP_VARBIND_TYPE_INTEGER32,
423 IF_MIB_IFRCVADDRESSSTATUS, "ifRcvAddressStatus",
424 NULL,
425 G_STRUCT_OFFSET(if_mib_ifRcvAddressEntry_t, ifRcvAddressStatus),
426 0,
427 GSNMP_ATTR_FLAG_WRITABLE },
428 { 3, GNET_SNMP_VARBIND_TYPE_INTEGER32,
429 IF_MIB_IFRCVADDRESSTYPE, "ifRcvAddressType",
430 NULL,
431 G_STRUCT_OFFSET(if_mib_ifRcvAddressEntry_t, ifRcvAddressType),
432 0,
433 GSNMP_ATTR_FLAG_WRITABLE },
434 { 0, 0, 0, NULL }
435 };
436
437
438 if_mib_interfaces_t *
if_mib_new_interfaces()439 if_mib_new_interfaces()
440 {
441 if_mib_interfaces_t *interfaces;
442
443 interfaces = (if_mib_interfaces_t *) g_malloc0(sizeof(if_mib_interfaces_t) + sizeof(gpointer));
444 return interfaces;
445 }
446
447 static inline if_mib_interfaces_t *
assign_interfaces(GList * vbl)448 assign_interfaces(GList *vbl)
449 {
450 if_mib_interfaces_t *interfaces;
451 char *p;
452
453 interfaces = if_mib_new_interfaces();
454 p = (char *) interfaces + sizeof(if_mib_interfaces_t);
455 * (GList **) p = vbl;
456
457 gnet_snmp_attr_assign(vbl, interfaces_oid, G_N_ELEMENTS(interfaces_oid),
458 interfaces_attr, interfaces);
459
460 return interfaces;
461 }
462
463 void
if_mib_get_interfaces(GNetSnmp * s,if_mib_interfaces_t ** interfaces,gint64 mask)464 if_mib_get_interfaces(GNetSnmp *s, if_mib_interfaces_t **interfaces, gint64 mask)
465 {
466 GList *in = NULL, *out = NULL;
467 static guint32 base[] = {1, 3, 6, 1, 2, 1, 2, 0};
468
469 *interfaces = NULL;
470
471 gnet_snmp_attr_get(s, &in, base, 8, 7, interfaces_attr, mask);
472
473 out = gnet_snmp_sync_getnext(s, in);
474 g_list_foreach(in, (GFunc) gnet_snmp_varbind_delete, NULL);
475 g_list_free(in);
476 if (out) {
477 if (s->error_status != GNET_SNMP_PDU_ERR_NOERROR) {
478 g_list_foreach(out, (GFunc) gnet_snmp_varbind_delete, NULL);
479 g_list_free(out);
480 return;
481 }
482 *interfaces = assign_interfaces(out);
483 }
484 }
485
486 void
if_mib_free_interfaces(if_mib_interfaces_t * interfaces)487 if_mib_free_interfaces(if_mib_interfaces_t *interfaces)
488 {
489 GList *vbl;
490 char *p;
491
492 if (interfaces) {
493 p = (char *) interfaces + sizeof(if_mib_interfaces_t);
494 vbl = * (GList **) p;
495 g_list_foreach(vbl, (GFunc) gnet_snmp_varbind_delete, NULL);
496 g_list_free(vbl);
497 g_free(interfaces);
498 }
499 }
500
501 if_mib_ifEntry_t *
if_mib_new_ifEntry()502 if_mib_new_ifEntry()
503 {
504 if_mib_ifEntry_t *ifEntry;
505
506 ifEntry = (if_mib_ifEntry_t *) g_malloc0(sizeof(if_mib_ifEntry_t) + sizeof(gpointer));
507 return ifEntry;
508 }
509
510 static inline int
unpack_ifEntry(GNetSnmpVarBind * vb,if_mib_ifEntry_t * ifEntry)511 unpack_ifEntry(GNetSnmpVarBind *vb, if_mib_ifEntry_t *ifEntry)
512 {
513 guint8 idx = 10;
514
515 if (vb->oid_len < idx) return -1;
516 ifEntry->ifIndex = vb->oid[idx++];
517 if ((ifEntry->ifIndex < 1)) {
518 return -1;
519 }
520 if (vb->oid_len > idx) return -1;
521 return 0;
522 }
523
524 static inline gint8
pack_ifEntry(guint32 * base,gint32 ifIndex)525 pack_ifEntry(guint32 *base, gint32 ifIndex)
526 {
527 guint8 idx = 10;
528
529 base[idx++] = ifIndex;
530 return idx;
531 }
532
533 static inline if_mib_ifEntry_t *
assign_ifEntry(GList * vbl)534 assign_ifEntry(GList *vbl)
535 {
536 if_mib_ifEntry_t *ifEntry;
537 char *p;
538
539 ifEntry = if_mib_new_ifEntry();
540 p = (char *) ifEntry + sizeof(if_mib_ifEntry_t);
541 * (GList **) p = vbl;
542
543 if (unpack_ifEntry((GNetSnmpVarBind *) vbl->data, ifEntry) < 0) {
544 g_warning("%s: invalid instance identifier", "ifEntry");
545 g_free(ifEntry);
546 return NULL;
547 }
548
549 gnet_snmp_attr_assign(vbl, ifEntry_oid, G_N_ELEMENTS(ifEntry_oid),
550 ifEntry_attr, ifEntry);
551
552 return ifEntry;
553 }
554
555 void
if_mib_get_ifTable(GNetSnmp * s,if_mib_ifEntry_t *** ifEntry,gint64 mask)556 if_mib_get_ifTable(GNetSnmp *s, if_mib_ifEntry_t ***ifEntry, gint64 mask)
557 {
558 GList *in = NULL, *out = NULL;
559 GList *row;
560 int i;
561 static guint32 base[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 0};
562
563 *ifEntry = NULL;
564
565 gnet_snmp_attr_get(s, &in, base, 10, 9, ifEntry_attr, mask);
566
567 out = gnet_snmp_sync_table(s, in);
568 /* gnet_snmp_varbind_list_free(in); */
569
570 if (out) {
571 *ifEntry = (if_mib_ifEntry_t **) g_malloc0((g_list_length(out) + 1) * sizeof(if_mib_ifEntry_t *));
572 for (row = out, i = 0; row; row = g_list_next(row), i++) {
573 (*ifEntry)[i] = assign_ifEntry(row->data);
574 }
575 }
576 }
577
578 void
if_mib_get_ifEntry(GNetSnmp * s,if_mib_ifEntry_t ** ifEntry,gint32 ifIndex,gint64 mask)579 if_mib_get_ifEntry(GNetSnmp *s, if_mib_ifEntry_t **ifEntry, gint32 ifIndex, gint64 mask)
580 {
581 GList *in = NULL, *out = NULL;
582 guint32 base[128];
583 gint8 len;
584
585 memcpy(base, ifEntry_oid, sizeof(ifEntry_oid));
586 len = pack_ifEntry(base, ifIndex);
587 if (len < 0) {
588 g_warning("%s: invalid index values", "ifEntry");
589 s->error_status = GNET_SNMP_PDU_ERR_INTERNAL;
590 return;
591 }
592
593 *ifEntry = NULL;
594
595 gnet_snmp_attr_get(s, &in, base, len, 9, ifEntry_attr, mask);
596
597 out = gnet_snmp_sync_get(s, in);
598 g_list_foreach(in, (GFunc) gnet_snmp_varbind_delete, NULL);
599 g_list_free(in);
600 if (out) {
601 if (s->error_status != GNET_SNMP_PDU_ERR_NOERROR) {
602 g_list_foreach(out, (GFunc) gnet_snmp_varbind_delete, NULL);
603 g_list_free(out);
604 return;
605 }
606 *ifEntry = assign_ifEntry(out);
607 }
608 }
609
610 void
if_mib_set_ifEntry(GNetSnmp * s,if_mib_ifEntry_t * ifEntry,gint64 mask)611 if_mib_set_ifEntry(GNetSnmp *s, if_mib_ifEntry_t *ifEntry, gint64 mask)
612 {
613 GList *in = NULL, *out = NULL;
614 guint32 base[128];
615 gint8 len;
616
617 memcpy(base, ifEntry_oid, sizeof(ifEntry_oid));
618 len = pack_ifEntry(base, ifEntry->ifIndex);
619 if (len < 0) {
620 g_warning("%s: invalid index values", "ifEntry");
621 s->error_status = GNET_SNMP_PDU_ERR_INTERNAL;
622 return;
623 }
624
625 gnet_snmp_attr_set(s, &in, base, len, 9, ifEntry_attr, mask, ifEntry);
626
627 out = gnet_snmp_sync_set(s, in);
628 g_list_foreach(in, (GFunc) gnet_snmp_varbind_delete, NULL);
629 g_list_free(in);
630 if (out) {
631 g_list_foreach(out, (GFunc) gnet_snmp_varbind_delete, NULL);
632 g_list_free(out);
633 }
634 }
635
636 void
if_mib_free_ifEntry(if_mib_ifEntry_t * ifEntry)637 if_mib_free_ifEntry(if_mib_ifEntry_t *ifEntry)
638 {
639 GList *vbl;
640 char *p;
641
642 if (ifEntry) {
643 p = (char *) ifEntry + sizeof(if_mib_ifEntry_t);
644 vbl = * (GList **) p;
645 g_list_foreach(vbl, (GFunc) gnet_snmp_varbind_delete, NULL);
646 g_list_free(vbl);
647 g_free(ifEntry);
648 }
649 }
650
651 void
if_mib_free_ifTable(if_mib_ifEntry_t ** ifEntry)652 if_mib_free_ifTable(if_mib_ifEntry_t **ifEntry)
653 {
654 int i;
655
656 if (ifEntry) {
657 for (i = 0; ifEntry[i]; i++) {
658 if_mib_free_ifEntry(ifEntry[i]);
659 }
660 g_free(ifEntry);
661 }
662 }
663
664 if_mib_ifMIBObjects_t *
if_mib_new_ifMIBObjects()665 if_mib_new_ifMIBObjects()
666 {
667 if_mib_ifMIBObjects_t *ifMIBObjects;
668
669 ifMIBObjects = (if_mib_ifMIBObjects_t *) g_malloc0(sizeof(if_mib_ifMIBObjects_t) + sizeof(gpointer));
670 return ifMIBObjects;
671 }
672
673 static inline if_mib_ifMIBObjects_t *
assign_ifMIBObjects(GList * vbl)674 assign_ifMIBObjects(GList *vbl)
675 {
676 if_mib_ifMIBObjects_t *ifMIBObjects;
677 char *p;
678
679 ifMIBObjects = if_mib_new_ifMIBObjects();
680 p = (char *) ifMIBObjects + sizeof(if_mib_ifMIBObjects_t);
681 * (GList **) p = vbl;
682
683 gnet_snmp_attr_assign(vbl, ifMIBObjects_oid, G_N_ELEMENTS(ifMIBObjects_oid),
684 ifMIBObjects_attr, ifMIBObjects);
685
686 return ifMIBObjects;
687 }
688
689 void
if_mib_get_ifMIBObjects(GNetSnmp * s,if_mib_ifMIBObjects_t ** ifMIBObjects,gint64 mask)690 if_mib_get_ifMIBObjects(GNetSnmp *s, if_mib_ifMIBObjects_t **ifMIBObjects, gint64 mask)
691 {
692 GList *in = NULL, *out = NULL;
693 static guint32 base[] = {1, 3, 6, 1, 2, 1, 31, 1, 0};
694
695 *ifMIBObjects = NULL;
696
697 gnet_snmp_attr_get(s, &in, base, 9, 8, ifMIBObjects_attr, mask);
698
699 out = gnet_snmp_sync_getnext(s, in);
700 g_list_foreach(in, (GFunc) gnet_snmp_varbind_delete, NULL);
701 g_list_free(in);
702 if (out) {
703 if (s->error_status != GNET_SNMP_PDU_ERR_NOERROR) {
704 g_list_foreach(out, (GFunc) gnet_snmp_varbind_delete, NULL);
705 g_list_free(out);
706 return;
707 }
708 *ifMIBObjects = assign_ifMIBObjects(out);
709 }
710 }
711
712 void
if_mib_free_ifMIBObjects(if_mib_ifMIBObjects_t * ifMIBObjects)713 if_mib_free_ifMIBObjects(if_mib_ifMIBObjects_t *ifMIBObjects)
714 {
715 GList *vbl;
716 char *p;
717
718 if (ifMIBObjects) {
719 p = (char *) ifMIBObjects + sizeof(if_mib_ifMIBObjects_t);
720 vbl = * (GList **) p;
721 g_list_foreach(vbl, (GFunc) gnet_snmp_varbind_delete, NULL);
722 g_list_free(vbl);
723 g_free(ifMIBObjects);
724 }
725 }
726
727 if_mib_ifXEntry_t *
if_mib_new_ifXEntry()728 if_mib_new_ifXEntry()
729 {
730 if_mib_ifXEntry_t *ifXEntry;
731
732 ifXEntry = (if_mib_ifXEntry_t *) g_malloc0(sizeof(if_mib_ifXEntry_t) + sizeof(gpointer));
733 return ifXEntry;
734 }
735
736 static inline int
unpack_ifXEntry(GNetSnmpVarBind * vb,if_mib_ifXEntry_t * ifXEntry)737 unpack_ifXEntry(GNetSnmpVarBind *vb, if_mib_ifXEntry_t *ifXEntry)
738 {
739 guint8 idx = 11;
740
741 if (vb->oid_len < idx) return -1;
742 ifXEntry->ifIndex = vb->oid[idx++];
743 if ((ifXEntry->ifIndex < 1)) {
744 return -1;
745 }
746 if (vb->oid_len > idx) return -1;
747 return 0;
748 }
749
750 static inline gint8
pack_ifXEntry(guint32 * base,gint32 ifIndex)751 pack_ifXEntry(guint32 *base, gint32 ifIndex)
752 {
753 guint8 idx = 11;
754
755 base[idx++] = ifIndex;
756 return idx;
757 }
758
759 static inline if_mib_ifXEntry_t *
assign_ifXEntry(GList * vbl)760 assign_ifXEntry(GList *vbl)
761 {
762 if_mib_ifXEntry_t *ifXEntry;
763 char *p;
764
765 ifXEntry = if_mib_new_ifXEntry();
766 p = (char *) ifXEntry + sizeof(if_mib_ifXEntry_t);
767 * (GList **) p = vbl;
768
769 if (unpack_ifXEntry((GNetSnmpVarBind *) vbl->data, ifXEntry) < 0) {
770 g_warning("%s: invalid instance identifier", "ifXEntry");
771 g_free(ifXEntry);
772 return NULL;
773 }
774
775 gnet_snmp_attr_assign(vbl, ifXEntry_oid, G_N_ELEMENTS(ifXEntry_oid),
776 ifXEntry_attr, ifXEntry);
777
778 return ifXEntry;
779 }
780
781 void
if_mib_get_ifXTable(GNetSnmp * s,if_mib_ifXEntry_t *** ifXEntry,gint64 mask)782 if_mib_get_ifXTable(GNetSnmp *s, if_mib_ifXEntry_t ***ifXEntry, gint64 mask)
783 {
784 GList *in = NULL, *out = NULL;
785 GList *row;
786 int i;
787 static guint32 base[] = {1, 3, 6, 1, 2, 1, 31, 1, 1, 1, 0};
788
789 *ifXEntry = NULL;
790
791 gnet_snmp_attr_get(s, &in, base, 11, 10, ifXEntry_attr, mask);
792
793 out = gnet_snmp_sync_table(s, in);
794 /* gnet_snmp_varbind_list_free(in); */
795
796 if (out) {
797 *ifXEntry = (if_mib_ifXEntry_t **) g_malloc0((g_list_length(out) + 1) * sizeof(if_mib_ifXEntry_t *));
798 for (row = out, i = 0; row; row = g_list_next(row), i++) {
799 (*ifXEntry)[i] = assign_ifXEntry(row->data);
800 }
801 }
802 }
803
804 void
if_mib_get_ifXEntry(GNetSnmp * s,if_mib_ifXEntry_t ** ifXEntry,gint32 ifIndex,gint64 mask)805 if_mib_get_ifXEntry(GNetSnmp *s, if_mib_ifXEntry_t **ifXEntry, gint32 ifIndex, gint64 mask)
806 {
807 GList *in = NULL, *out = NULL;
808 guint32 base[128];
809 gint8 len;
810
811 memcpy(base, ifXEntry_oid, sizeof(ifXEntry_oid));
812 len = pack_ifXEntry(base, ifIndex);
813 if (len < 0) {
814 g_warning("%s: invalid index values", "ifXEntry");
815 s->error_status = GNET_SNMP_PDU_ERR_INTERNAL;
816 return;
817 }
818
819 *ifXEntry = NULL;
820
821 gnet_snmp_attr_get(s, &in, base, len, 10, ifXEntry_attr, mask);
822
823 out = gnet_snmp_sync_get(s, in);
824 g_list_foreach(in, (GFunc) gnet_snmp_varbind_delete, NULL);
825 g_list_free(in);
826 if (out) {
827 if (s->error_status != GNET_SNMP_PDU_ERR_NOERROR) {
828 g_list_foreach(out, (GFunc) gnet_snmp_varbind_delete, NULL);
829 g_list_free(out);
830 return;
831 }
832 *ifXEntry = assign_ifXEntry(out);
833 }
834 }
835
836 void
if_mib_set_ifXEntry(GNetSnmp * s,if_mib_ifXEntry_t * ifXEntry,gint64 mask)837 if_mib_set_ifXEntry(GNetSnmp *s, if_mib_ifXEntry_t *ifXEntry, gint64 mask)
838 {
839 GList *in = NULL, *out = NULL;
840 guint32 base[128];
841 gint8 len;
842
843 memcpy(base, ifXEntry_oid, sizeof(ifXEntry_oid));
844 len = pack_ifXEntry(base, ifXEntry->ifIndex);
845 if (len < 0) {
846 g_warning("%s: invalid index values", "ifXEntry");
847 s->error_status = GNET_SNMP_PDU_ERR_INTERNAL;
848 return;
849 }
850
851 gnet_snmp_attr_set(s, &in, base, len, 10, ifXEntry_attr, mask, ifXEntry);
852
853 out = gnet_snmp_sync_set(s, in);
854 g_list_foreach(in, (GFunc) gnet_snmp_varbind_delete, NULL);
855 g_list_free(in);
856 if (out) {
857 g_list_foreach(out, (GFunc) gnet_snmp_varbind_delete, NULL);
858 g_list_free(out);
859 }
860 }
861
862 void
if_mib_free_ifXEntry(if_mib_ifXEntry_t * ifXEntry)863 if_mib_free_ifXEntry(if_mib_ifXEntry_t *ifXEntry)
864 {
865 GList *vbl;
866 char *p;
867
868 if (ifXEntry) {
869 p = (char *) ifXEntry + sizeof(if_mib_ifXEntry_t);
870 vbl = * (GList **) p;
871 g_list_foreach(vbl, (GFunc) gnet_snmp_varbind_delete, NULL);
872 g_list_free(vbl);
873 g_free(ifXEntry);
874 }
875 }
876
877 void
if_mib_free_ifXTable(if_mib_ifXEntry_t ** ifXEntry)878 if_mib_free_ifXTable(if_mib_ifXEntry_t **ifXEntry)
879 {
880 int i;
881
882 if (ifXEntry) {
883 for (i = 0; ifXEntry[i]; i++) {
884 if_mib_free_ifXEntry(ifXEntry[i]);
885 }
886 g_free(ifXEntry);
887 }
888 }
889
890 if_mib_ifStackEntry_t *
if_mib_new_ifStackEntry()891 if_mib_new_ifStackEntry()
892 {
893 if_mib_ifStackEntry_t *ifStackEntry;
894
895 ifStackEntry = (if_mib_ifStackEntry_t *) g_malloc0(sizeof(if_mib_ifStackEntry_t) + sizeof(gpointer));
896 return ifStackEntry;
897 }
898
899 static inline int
unpack_ifStackEntry(GNetSnmpVarBind * vb,if_mib_ifStackEntry_t * ifStackEntry)900 unpack_ifStackEntry(GNetSnmpVarBind *vb, if_mib_ifStackEntry_t *ifStackEntry)
901 {
902 guint8 idx = 11;
903
904 if (vb->oid_len < idx) return -1;
905 ifStackEntry->ifStackHigherLayer = vb->oid[idx++];
906 if ((ifStackEntry->ifStackHigherLayer < 0)) {
907 return -1;
908 }
909 if (vb->oid_len < idx) return -1;
910 ifStackEntry->ifStackLowerLayer = vb->oid[idx++];
911 if ((ifStackEntry->ifStackLowerLayer < 0)) {
912 return -1;
913 }
914 if (vb->oid_len > idx) return -1;
915 return 0;
916 }
917
918 static inline gint8
pack_ifStackEntry(guint32 * base,gint32 ifStackHigherLayer,gint32 ifStackLowerLayer)919 pack_ifStackEntry(guint32 *base, gint32 ifStackHigherLayer, gint32 ifStackLowerLayer)
920 {
921 guint8 idx = 11;
922
923 base[idx++] = ifStackHigherLayer;
924 base[idx++] = ifStackLowerLayer;
925 return idx;
926 }
927
928 static inline if_mib_ifStackEntry_t *
assign_ifStackEntry(GList * vbl)929 assign_ifStackEntry(GList *vbl)
930 {
931 if_mib_ifStackEntry_t *ifStackEntry;
932 char *p;
933
934 ifStackEntry = if_mib_new_ifStackEntry();
935 p = (char *) ifStackEntry + sizeof(if_mib_ifStackEntry_t);
936 * (GList **) p = vbl;
937
938 if (unpack_ifStackEntry((GNetSnmpVarBind *) vbl->data, ifStackEntry) < 0) {
939 g_warning("%s: invalid instance identifier", "ifStackEntry");
940 g_free(ifStackEntry);
941 return NULL;
942 }
943
944 gnet_snmp_attr_assign(vbl, ifStackEntry_oid, G_N_ELEMENTS(ifStackEntry_oid),
945 ifStackEntry_attr, ifStackEntry);
946
947 return ifStackEntry;
948 }
949
950 void
if_mib_get_ifStackTable(GNetSnmp * s,if_mib_ifStackEntry_t *** ifStackEntry,gint64 mask)951 if_mib_get_ifStackTable(GNetSnmp *s, if_mib_ifStackEntry_t ***ifStackEntry, gint64 mask)
952 {
953 GList *in = NULL, *out = NULL;
954 GList *row;
955 int i;
956 static guint32 base[] = {1, 3, 6, 1, 2, 1, 31, 1, 2, 1, 0};
957
958 *ifStackEntry = NULL;
959
960 gnet_snmp_attr_get(s, &in, base, 11, 10, ifStackEntry_attr, mask);
961
962 out = gnet_snmp_sync_table(s, in);
963 /* gnet_snmp_varbind_list_free(in); */
964
965 if (out) {
966 *ifStackEntry = (if_mib_ifStackEntry_t **) g_malloc0((g_list_length(out) + 1) * sizeof(if_mib_ifStackEntry_t *));
967 for (row = out, i = 0; row; row = g_list_next(row), i++) {
968 (*ifStackEntry)[i] = assign_ifStackEntry(row->data);
969 }
970 }
971 }
972
973 void
if_mib_get_ifStackEntry(GNetSnmp * s,if_mib_ifStackEntry_t ** ifStackEntry,gint32 ifStackHigherLayer,gint32 ifStackLowerLayer,gint64 mask)974 if_mib_get_ifStackEntry(GNetSnmp *s, if_mib_ifStackEntry_t **ifStackEntry, gint32 ifStackHigherLayer, gint32 ifStackLowerLayer, gint64 mask)
975 {
976 GList *in = NULL, *out = NULL;
977 guint32 base[128];
978 gint8 len;
979
980 memcpy(base, ifStackEntry_oid, sizeof(ifStackEntry_oid));
981 len = pack_ifStackEntry(base, ifStackHigherLayer, ifStackLowerLayer);
982 if (len < 0) {
983 g_warning("%s: invalid index values", "ifStackEntry");
984 s->error_status = GNET_SNMP_PDU_ERR_INTERNAL;
985 return;
986 }
987
988 *ifStackEntry = NULL;
989
990 gnet_snmp_attr_get(s, &in, base, len, 10, ifStackEntry_attr, mask);
991
992 out = gnet_snmp_sync_get(s, in);
993 g_list_foreach(in, (GFunc) gnet_snmp_varbind_delete, NULL);
994 g_list_free(in);
995 if (out) {
996 if (s->error_status != GNET_SNMP_PDU_ERR_NOERROR) {
997 g_list_foreach(out, (GFunc) gnet_snmp_varbind_delete, NULL);
998 g_list_free(out);
999 return;
1000 }
1001 *ifStackEntry = assign_ifStackEntry(out);
1002 }
1003 }
1004
1005 void
if_mib_set_ifStackEntry(GNetSnmp * s,if_mib_ifStackEntry_t * ifStackEntry,gint64 mask)1006 if_mib_set_ifStackEntry(GNetSnmp *s, if_mib_ifStackEntry_t *ifStackEntry, gint64 mask)
1007 {
1008 GList *in = NULL, *out = NULL;
1009 guint32 base[128];
1010 gint8 len;
1011
1012 memcpy(base, ifStackEntry_oid, sizeof(ifStackEntry_oid));
1013 len = pack_ifStackEntry(base, ifStackEntry->ifStackHigherLayer, ifStackEntry->ifStackLowerLayer);
1014 if (len < 0) {
1015 g_warning("%s: invalid index values", "ifStackEntry");
1016 s->error_status = GNET_SNMP_PDU_ERR_INTERNAL;
1017 return;
1018 }
1019
1020 gnet_snmp_attr_set(s, &in, base, len, 10, ifStackEntry_attr, mask, ifStackEntry);
1021
1022 out = gnet_snmp_sync_set(s, in);
1023 g_list_foreach(in, (GFunc) gnet_snmp_varbind_delete, NULL);
1024 g_list_free(in);
1025 if (out) {
1026 g_list_foreach(out, (GFunc) gnet_snmp_varbind_delete, NULL);
1027 g_list_free(out);
1028 }
1029 }
1030
1031 void
if_mib_free_ifStackEntry(if_mib_ifStackEntry_t * ifStackEntry)1032 if_mib_free_ifStackEntry(if_mib_ifStackEntry_t *ifStackEntry)
1033 {
1034 GList *vbl;
1035 char *p;
1036
1037 if (ifStackEntry) {
1038 p = (char *) ifStackEntry + sizeof(if_mib_ifStackEntry_t);
1039 vbl = * (GList **) p;
1040 g_list_foreach(vbl, (GFunc) gnet_snmp_varbind_delete, NULL);
1041 g_list_free(vbl);
1042 g_free(ifStackEntry);
1043 }
1044 }
1045
1046 void
if_mib_free_ifStackTable(if_mib_ifStackEntry_t ** ifStackEntry)1047 if_mib_free_ifStackTable(if_mib_ifStackEntry_t **ifStackEntry)
1048 {
1049 int i;
1050
1051 if (ifStackEntry) {
1052 for (i = 0; ifStackEntry[i]; i++) {
1053 if_mib_free_ifStackEntry(ifStackEntry[i]);
1054 }
1055 g_free(ifStackEntry);
1056 }
1057 }
1058
1059 if_mib_ifTestEntry_t *
if_mib_new_ifTestEntry()1060 if_mib_new_ifTestEntry()
1061 {
1062 if_mib_ifTestEntry_t *ifTestEntry;
1063
1064 ifTestEntry = (if_mib_ifTestEntry_t *) g_malloc0(sizeof(if_mib_ifTestEntry_t) + sizeof(gpointer));
1065 return ifTestEntry;
1066 }
1067
1068 static inline int
unpack_ifTestEntry(GNetSnmpVarBind * vb,if_mib_ifTestEntry_t * ifTestEntry)1069 unpack_ifTestEntry(GNetSnmpVarBind *vb, if_mib_ifTestEntry_t *ifTestEntry)
1070 {
1071 guint8 idx = 11;
1072
1073 if (vb->oid_len < idx) return -1;
1074 ifTestEntry->ifIndex = vb->oid[idx++];
1075 if ((ifTestEntry->ifIndex < 1)) {
1076 return -1;
1077 }
1078 if (vb->oid_len > idx) return -1;
1079 return 0;
1080 }
1081
1082 static inline gint8
pack_ifTestEntry(guint32 * base,gint32 ifIndex)1083 pack_ifTestEntry(guint32 *base, gint32 ifIndex)
1084 {
1085 guint8 idx = 11;
1086
1087 base[idx++] = ifIndex;
1088 return idx;
1089 }
1090
1091 static inline if_mib_ifTestEntry_t *
assign_ifTestEntry(GList * vbl)1092 assign_ifTestEntry(GList *vbl)
1093 {
1094 if_mib_ifTestEntry_t *ifTestEntry;
1095 char *p;
1096
1097 ifTestEntry = if_mib_new_ifTestEntry();
1098 p = (char *) ifTestEntry + sizeof(if_mib_ifTestEntry_t);
1099 * (GList **) p = vbl;
1100
1101 if (unpack_ifTestEntry((GNetSnmpVarBind *) vbl->data, ifTestEntry) < 0) {
1102 g_warning("%s: invalid instance identifier", "ifTestEntry");
1103 g_free(ifTestEntry);
1104 return NULL;
1105 }
1106
1107 gnet_snmp_attr_assign(vbl, ifTestEntry_oid, G_N_ELEMENTS(ifTestEntry_oid),
1108 ifTestEntry_attr, ifTestEntry);
1109
1110 return ifTestEntry;
1111 }
1112
1113 void
if_mib_get_ifTestTable(GNetSnmp * s,if_mib_ifTestEntry_t *** ifTestEntry,gint64 mask)1114 if_mib_get_ifTestTable(GNetSnmp *s, if_mib_ifTestEntry_t ***ifTestEntry, gint64 mask)
1115 {
1116 GList *in = NULL, *out = NULL;
1117 GList *row;
1118 int i;
1119 static guint32 base[] = {1, 3, 6, 1, 2, 1, 31, 1, 3, 1, 0};
1120
1121 *ifTestEntry = NULL;
1122
1123 gnet_snmp_attr_get(s, &in, base, 11, 10, ifTestEntry_attr, mask);
1124
1125 out = gnet_snmp_sync_table(s, in);
1126 /* gnet_snmp_varbind_list_free(in); */
1127
1128 if (out) {
1129 *ifTestEntry = (if_mib_ifTestEntry_t **) g_malloc0((g_list_length(out) + 1) * sizeof(if_mib_ifTestEntry_t *));
1130 for (row = out, i = 0; row; row = g_list_next(row), i++) {
1131 (*ifTestEntry)[i] = assign_ifTestEntry(row->data);
1132 }
1133 }
1134 }
1135
1136 void
if_mib_get_ifTestEntry(GNetSnmp * s,if_mib_ifTestEntry_t ** ifTestEntry,gint32 ifIndex,gint64 mask)1137 if_mib_get_ifTestEntry(GNetSnmp *s, if_mib_ifTestEntry_t **ifTestEntry, gint32 ifIndex, gint64 mask)
1138 {
1139 GList *in = NULL, *out = NULL;
1140 guint32 base[128];
1141 gint8 len;
1142
1143 memcpy(base, ifTestEntry_oid, sizeof(ifTestEntry_oid));
1144 len = pack_ifTestEntry(base, ifIndex);
1145 if (len < 0) {
1146 g_warning("%s: invalid index values", "ifTestEntry");
1147 s->error_status = GNET_SNMP_PDU_ERR_INTERNAL;
1148 return;
1149 }
1150
1151 *ifTestEntry = NULL;
1152
1153 gnet_snmp_attr_get(s, &in, base, len, 10, ifTestEntry_attr, mask);
1154
1155 out = gnet_snmp_sync_get(s, in);
1156 g_list_foreach(in, (GFunc) gnet_snmp_varbind_delete, NULL);
1157 g_list_free(in);
1158 if (out) {
1159 if (s->error_status != GNET_SNMP_PDU_ERR_NOERROR) {
1160 g_list_foreach(out, (GFunc) gnet_snmp_varbind_delete, NULL);
1161 g_list_free(out);
1162 return;
1163 }
1164 *ifTestEntry = assign_ifTestEntry(out);
1165 }
1166 }
1167
1168 void
if_mib_set_ifTestEntry(GNetSnmp * s,if_mib_ifTestEntry_t * ifTestEntry,gint64 mask)1169 if_mib_set_ifTestEntry(GNetSnmp *s, if_mib_ifTestEntry_t *ifTestEntry, gint64 mask)
1170 {
1171 GList *in = NULL, *out = NULL;
1172 guint32 base[128];
1173 gint8 len;
1174
1175 memcpy(base, ifTestEntry_oid, sizeof(ifTestEntry_oid));
1176 len = pack_ifTestEntry(base, ifTestEntry->ifIndex);
1177 if (len < 0) {
1178 g_warning("%s: invalid index values", "ifTestEntry");
1179 s->error_status = GNET_SNMP_PDU_ERR_INTERNAL;
1180 return;
1181 }
1182
1183 gnet_snmp_attr_set(s, &in, base, len, 10, ifTestEntry_attr, mask, ifTestEntry);
1184
1185 out = gnet_snmp_sync_set(s, in);
1186 g_list_foreach(in, (GFunc) gnet_snmp_varbind_delete, NULL);
1187 g_list_free(in);
1188 if (out) {
1189 g_list_foreach(out, (GFunc) gnet_snmp_varbind_delete, NULL);
1190 g_list_free(out);
1191 }
1192 }
1193
1194 void
if_mib_free_ifTestEntry(if_mib_ifTestEntry_t * ifTestEntry)1195 if_mib_free_ifTestEntry(if_mib_ifTestEntry_t *ifTestEntry)
1196 {
1197 GList *vbl;
1198 char *p;
1199
1200 if (ifTestEntry) {
1201 p = (char *) ifTestEntry + sizeof(if_mib_ifTestEntry_t);
1202 vbl = * (GList **) p;
1203 g_list_foreach(vbl, (GFunc) gnet_snmp_varbind_delete, NULL);
1204 g_list_free(vbl);
1205 g_free(ifTestEntry);
1206 }
1207 }
1208
1209 void
if_mib_free_ifTestTable(if_mib_ifTestEntry_t ** ifTestEntry)1210 if_mib_free_ifTestTable(if_mib_ifTestEntry_t **ifTestEntry)
1211 {
1212 int i;
1213
1214 if (ifTestEntry) {
1215 for (i = 0; ifTestEntry[i]; i++) {
1216 if_mib_free_ifTestEntry(ifTestEntry[i]);
1217 }
1218 g_free(ifTestEntry);
1219 }
1220 }
1221
1222 if_mib_ifRcvAddressEntry_t *
if_mib_new_ifRcvAddressEntry()1223 if_mib_new_ifRcvAddressEntry()
1224 {
1225 if_mib_ifRcvAddressEntry_t *ifRcvAddressEntry;
1226
1227 ifRcvAddressEntry = (if_mib_ifRcvAddressEntry_t *) g_malloc0(sizeof(if_mib_ifRcvAddressEntry_t) + sizeof(gpointer));
1228 return ifRcvAddressEntry;
1229 }
1230
1231 static inline int
unpack_ifRcvAddressEntry(GNetSnmpVarBind * vb,if_mib_ifRcvAddressEntry_t * ifRcvAddressEntry)1232 unpack_ifRcvAddressEntry(GNetSnmpVarBind *vb, if_mib_ifRcvAddressEntry_t *ifRcvAddressEntry)
1233 {
1234 guint8 idx = 11;
1235 guint16 i, len;
1236
1237 if (vb->oid_len < idx) return -1;
1238 ifRcvAddressEntry->ifIndex = vb->oid[idx++];
1239 if ((ifRcvAddressEntry->ifIndex < 1)) {
1240 return -1;
1241 }
1242 if (vb->oid_len < idx) return -1;
1243 len = vb->oid[idx++];
1244 if (len > 117) return -1;
1245 if (vb->oid_len < idx + len) return -1;
1246 for (i = 0; i < len; i++) {
1247 ifRcvAddressEntry->ifRcvAddressAddress[i] = vb->oid[idx++];
1248 }
1249 ifRcvAddressEntry->_ifRcvAddressAddressLength = len;
1250 if (vb->oid_len > idx) return -1;
1251 return 0;
1252 }
1253
1254 static inline gint8
pack_ifRcvAddressEntry(guint32 * base,gint32 ifIndex,guchar * ifRcvAddressAddress,guint16 _ifRcvAddressAddressLength)1255 pack_ifRcvAddressEntry(guint32 *base, gint32 ifIndex, guchar *ifRcvAddressAddress, guint16 _ifRcvAddressAddressLength)
1256 {
1257 guint8 idx = 11;
1258 guint16 i, len;
1259
1260 base[idx++] = ifIndex;
1261 len = _ifRcvAddressAddressLength;
1262 base[idx++] = len;
1263 if (len > 117) return -1;
1264 for (i = 0; i < len; i++) {
1265 base[idx++] = ifRcvAddressAddress[i];
1266 if (idx >= 128) return -1;
1267 }
1268 return idx;
1269 }
1270
1271 static inline if_mib_ifRcvAddressEntry_t *
assign_ifRcvAddressEntry(GList * vbl)1272 assign_ifRcvAddressEntry(GList *vbl)
1273 {
1274 if_mib_ifRcvAddressEntry_t *ifRcvAddressEntry;
1275 char *p;
1276
1277 ifRcvAddressEntry = if_mib_new_ifRcvAddressEntry();
1278 p = (char *) ifRcvAddressEntry + sizeof(if_mib_ifRcvAddressEntry_t);
1279 * (GList **) p = vbl;
1280
1281 if (unpack_ifRcvAddressEntry((GNetSnmpVarBind *) vbl->data, ifRcvAddressEntry) < 0) {
1282 g_warning("%s: invalid instance identifier", "ifRcvAddressEntry");
1283 g_free(ifRcvAddressEntry);
1284 return NULL;
1285 }
1286
1287 gnet_snmp_attr_assign(vbl, ifRcvAddressEntry_oid, G_N_ELEMENTS(ifRcvAddressEntry_oid),
1288 ifRcvAddressEntry_attr, ifRcvAddressEntry);
1289
1290 return ifRcvAddressEntry;
1291 }
1292
1293 void
if_mib_get_ifRcvAddressTable(GNetSnmp * s,if_mib_ifRcvAddressEntry_t *** ifRcvAddressEntry,gint64 mask)1294 if_mib_get_ifRcvAddressTable(GNetSnmp *s, if_mib_ifRcvAddressEntry_t ***ifRcvAddressEntry, gint64 mask)
1295 {
1296 GList *in = NULL, *out = NULL;
1297 GList *row;
1298 int i;
1299 static guint32 base[] = {1, 3, 6, 1, 2, 1, 31, 1, 4, 1, 0};
1300
1301 *ifRcvAddressEntry = NULL;
1302
1303 gnet_snmp_attr_get(s, &in, base, 11, 10, ifRcvAddressEntry_attr, mask);
1304
1305 out = gnet_snmp_sync_table(s, in);
1306 /* gnet_snmp_varbind_list_free(in); */
1307
1308 if (out) {
1309 *ifRcvAddressEntry = (if_mib_ifRcvAddressEntry_t **) g_malloc0((g_list_length(out) + 1) * sizeof(if_mib_ifRcvAddressEntry_t *));
1310 for (row = out, i = 0; row; row = g_list_next(row), i++) {
1311 (*ifRcvAddressEntry)[i] = assign_ifRcvAddressEntry(row->data);
1312 }
1313 }
1314 }
1315
1316 void
if_mib_get_ifRcvAddressEntry(GNetSnmp * s,if_mib_ifRcvAddressEntry_t ** ifRcvAddressEntry,gint32 ifIndex,guchar * ifRcvAddressAddress,guint16 _ifRcvAddressAddressLength,gint64 mask)1317 if_mib_get_ifRcvAddressEntry(GNetSnmp *s, if_mib_ifRcvAddressEntry_t **ifRcvAddressEntry, gint32 ifIndex, guchar *ifRcvAddressAddress, guint16 _ifRcvAddressAddressLength, gint64 mask)
1318 {
1319 GList *in = NULL, *out = NULL;
1320 guint32 base[128];
1321 gint8 len;
1322
1323 memcpy(base, ifRcvAddressEntry_oid, sizeof(ifRcvAddressEntry_oid));
1324 len = pack_ifRcvAddressEntry(base, ifIndex, ifRcvAddressAddress, _ifRcvAddressAddressLength);
1325 if (len < 0) {
1326 g_warning("%s: invalid index values", "ifRcvAddressEntry");
1327 s->error_status = GNET_SNMP_PDU_ERR_INTERNAL;
1328 return;
1329 }
1330
1331 *ifRcvAddressEntry = NULL;
1332
1333 gnet_snmp_attr_get(s, &in, base, len, 10, ifRcvAddressEntry_attr, mask);
1334
1335 out = gnet_snmp_sync_get(s, in);
1336 g_list_foreach(in, (GFunc) gnet_snmp_varbind_delete, NULL);
1337 g_list_free(in);
1338 if (out) {
1339 if (s->error_status != GNET_SNMP_PDU_ERR_NOERROR) {
1340 g_list_foreach(out, (GFunc) gnet_snmp_varbind_delete, NULL);
1341 g_list_free(out);
1342 return;
1343 }
1344 *ifRcvAddressEntry = assign_ifRcvAddressEntry(out);
1345 }
1346 }
1347
1348 void
if_mib_set_ifRcvAddressEntry(GNetSnmp * s,if_mib_ifRcvAddressEntry_t * ifRcvAddressEntry,gint64 mask)1349 if_mib_set_ifRcvAddressEntry(GNetSnmp *s, if_mib_ifRcvAddressEntry_t *ifRcvAddressEntry, gint64 mask)
1350 {
1351 GList *in = NULL, *out = NULL;
1352 guint32 base[128];
1353 gint8 len;
1354
1355 memcpy(base, ifRcvAddressEntry_oid, sizeof(ifRcvAddressEntry_oid));
1356 len = pack_ifRcvAddressEntry(base, ifRcvAddressEntry->ifIndex, ifRcvAddressEntry->ifRcvAddressAddress, ifRcvAddressEntry->_ifRcvAddressAddressLength);
1357 if (len < 0) {
1358 g_warning("%s: invalid index values", "ifRcvAddressEntry");
1359 s->error_status = GNET_SNMP_PDU_ERR_INTERNAL;
1360 return;
1361 }
1362
1363 gnet_snmp_attr_set(s, &in, base, len, 10, ifRcvAddressEntry_attr, mask, ifRcvAddressEntry);
1364
1365 out = gnet_snmp_sync_set(s, in);
1366 g_list_foreach(in, (GFunc) gnet_snmp_varbind_delete, NULL);
1367 g_list_free(in);
1368 if (out) {
1369 g_list_foreach(out, (GFunc) gnet_snmp_varbind_delete, NULL);
1370 g_list_free(out);
1371 }
1372 }
1373
1374 void
if_mib_free_ifRcvAddressEntry(if_mib_ifRcvAddressEntry_t * ifRcvAddressEntry)1375 if_mib_free_ifRcvAddressEntry(if_mib_ifRcvAddressEntry_t *ifRcvAddressEntry)
1376 {
1377 GList *vbl;
1378 char *p;
1379
1380 if (ifRcvAddressEntry) {
1381 p = (char *) ifRcvAddressEntry + sizeof(if_mib_ifRcvAddressEntry_t);
1382 vbl = * (GList **) p;
1383 g_list_foreach(vbl, (GFunc) gnet_snmp_varbind_delete, NULL);
1384 g_list_free(vbl);
1385 g_free(ifRcvAddressEntry);
1386 }
1387 }
1388
1389 void
if_mib_free_ifRcvAddressTable(if_mib_ifRcvAddressEntry_t ** ifRcvAddressEntry)1390 if_mib_free_ifRcvAddressTable(if_mib_ifRcvAddressEntry_t **ifRcvAddressEntry)
1391 {
1392 int i;
1393
1394 if (ifRcvAddressEntry) {
1395 for (i = 0; ifRcvAddressEntry[i]; i++) {
1396 if_mib_free_ifRcvAddressEntry(ifRcvAddressEntry[i]);
1397 }
1398 g_free(ifRcvAddressEntry);
1399 }
1400 }
1401
1402
1403