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