summaryrefslogtreecommitdiff
path: root/agent/mibgroup/if-mib/ifTable/ifTable.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/if-mib/ifTable/ifTable.c')
-rw-r--r--agent/mibgroup/if-mib/ifTable/ifTable.c2363
1 files changed, 2363 insertions, 0 deletions
diff --git a/agent/mibgroup/if-mib/ifTable/ifTable.c b/agent/mibgroup/if-mib/ifTable/ifTable.c
new file mode 100644
index 0000000..d9b7252
--- /dev/null
+++ b/agent/mibgroup/if-mib/ifTable/ifTable.c
@@ -0,0 +1,2363 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * version : 1.48 $ of : mfd-top.m2c,v $
+ *
+ * $Id$
+ */
+/** \page MFD helper for ifTable
+ *
+ * \section intro Introduction
+ * Introductory text.
+ *
+ */
+/*
+ * standard Net-SNMP includes
+ */
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-features.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+#ifndef NETSNMP_NO_WRITE_SUPPORT
+netsnmp_feature_require(interface_access_entry_set_admin_status)
+#endif /* NETSNMP_NO_WRITE_SUPPORT */
+
+/*
+ * include our parent header
+ */
+#include "ifTable.h"
+#include "ifTable_defs.h"
+
+#include <net-snmp/agent/mib_modules.h>
+
+#include "ifTable_interface.h"
+
+#ifdef USING_IP_MIB_IPV4INTERFACETABLE_IPV4INTERFACETABLE_MODULE
+# include "ip-mib/ipv4InterfaceTable/ipv4InterfaceTable.h"
+#endif
+#ifdef USING_IP_MIB_IPV6INTERFACETABLE_IPV6INTERFACETABLE_MODULE
+# include "ip-mib/ipv6InterfaceTable/ipv6InterfaceTable.h"
+#endif
+#ifdef USING_IF_MIB_IFXTABLE_IFXTABLE_MODULE
+# include "if-mib/ifXTable/ifXTable.h"
+#endif
+
+const oid ifTable_oid[] = { IFTABLE_OID };
+const int ifTable_oid_size = OID_LENGTH(ifTable_oid);
+
+ifTable_registration ifTable_user_context;
+static ifTable_registration *ifTable_user_context_p;
+
+void initialize_table_ifTable(void);
+void shutdown_table_ifTable(void);
+
+static int
+_if_number_handler(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests);
+
+
+/**
+ * Initializes the ifTable module
+ */
+void
+init_ifTable(void)
+{
+ static int ifTable_did_init = 0;
+
+ DEBUGMSGTL(("verbose:ifTable:init_ifTable", "called\n"));
+
+ /*
+ * TODO:300:o: Perform ifTable one-time module initialization.
+ */
+ if (++ifTable_did_init != 1) {
+ DEBUGMSGTL(("ifTable:init_ifTable", "ignoring duplicate call\n"));
+ return;
+ }
+
+ /*
+ * here we initialize all the tables we're planning on supporting
+ */
+ if (should_init("ifTable")) {
+
+#ifdef USING_IP_MIB_IPV4INTERFACETABLE_IPV4INTERFACETABLE_MODULE
+ if (should_init("ipv4InterfaceTable"))
+ initialize_table_ipv4InterfaceTable();
+#endif
+
+#ifdef USING_IP_MIB_IPV6INTERFACETABLE_IPV6INTERFACETABLE_MODULE
+ if (should_init("ipv6InterfaceTable"))
+ initialize_table_ipv6InterfaceTable();
+#endif
+
+ initialize_table_ifTable();
+
+#ifdef USING_IF_MIB_IFXTABLE_IFXTABLE_MODULE
+ if (should_init("ifXTable"))
+ initialize_table_ifXTable();
+#endif
+ }
+} /* init_ifTable */
+
+/**
+ * Shut-down the ifTable module (agent is exiting)
+ */
+void
+shutdown_ifTable(void)
+{
+ if (should_init("ifTable"))
+ shutdown_table_ifTable();
+
+}
+
+/**
+ * Initialize the table ifTable
+ * (Define its contents and how it's structured)
+ */
+void
+initialize_table_ifTable(void)
+{
+ u_long flags;
+
+ DEBUGMSGTL(("verbose:ifTable:initialize_table_ifTable", "called\n"));
+
+ /*
+ * TODO:301:o: Perform ifTable one-time table initialization.
+ */
+
+ /*
+ * TODO:302:o: |->Initialize ifTable user context
+ * if you'd like to pass in a pointer to some data for this
+ * table, allocate or set it up here.
+ */
+ /*
+ * a netsnmp_data_list is a simple way to store void pointers. A simple
+ * string token is used to add, find or remove pointers.
+ */
+ ifTable_user_context_p = netsnmp_create_data_list("ifTable", NULL, NULL);
+
+ /*
+ * No support for any flags yet, but in the future you would
+ * set any flags here.
+ */
+ flags = 0;
+
+ /*
+ * call interface initialization code
+ */
+ _ifTable_initialize_interface(ifTable_user_context_p, flags);
+
+ /*
+ * register scalar for ifNumber
+ */
+ {
+ const oid reg_oid[] = { IFTABLE_NUMBER };
+ netsnmp_handler_registration *myreg;
+
+ myreg =
+ netsnmp_create_handler_registration("if number",
+ _if_number_handler,
+ reg_oid,
+ OID_LENGTH(reg_oid),
+ HANDLER_CAN_RONLY);
+ netsnmp_register_scalar(myreg);
+ }
+
+} /* initialize_table_ifTable */
+
+/**
+ * Shutdown the table ifTable
+ */
+void
+shutdown_table_ifTable(void)
+{
+ /*
+ * call interface shutdown code
+ */
+ _ifTable_shutdown_interface(ifTable_user_context_p);
+ netsnmp_free_all_list_data(ifTable_user_context_p);
+ ifTable_user_context_p = NULL;
+}
+
+/**
+ * extra context initialization (eg default values)
+ *
+ * @param rowreq_ctx : row request context
+ * @param user_init_ctx : void pointer for user (parameter to rowreq_ctx_allocate)
+ *
+ * @retval MFD_SUCCESS : no errors
+ * @retval MFD_ERROR : error (context allocate will fail)
+ */
+int
+ifTable_rowreq_ctx_init(ifTable_rowreq_ctx * rowreq_ctx,
+ void *user_init_ctx)
+{
+ DEBUGMSGTL(("verbose:ifTable:ifTable_rowreq_ctx_init", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:210:o: |-> Perform extra ifTable rowreq initialization. (eg DEFVALS)
+ */
+ if (NULL == user_init_ctx)
+ rowreq_ctx->data.ifentry =
+ netsnmp_access_interface_entry_create(NULL, 0);
+ else
+ rowreq_ctx->data.ifentry =
+ (netsnmp_interface_entry *) user_init_ctx;
+
+ return MFD_SUCCESS;
+} /* ifTable_rowreq_ctx_init */
+
+/**
+ * extra context cleanup
+ * @param rowreq_ctx
+ */
+void
+ifTable_rowreq_ctx_cleanup(ifTable_rowreq_ctx * rowreq_ctx)
+{
+ DEBUGMSGTL(("verbose:ifTable:ifTable_rowreq_ctx_cleanup", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:211:o: |-> Perform extra ifTable rowreq cleanup.
+ */
+ if (NULL != rowreq_ctx->data.ifentry) {
+ netsnmp_access_interface_entry_free(rowreq_ctx->data.ifentry);
+ rowreq_ctx->data.ifentry = NULL;
+ }
+} /* ifTable_rowreq_ctx_cleanup */
+
+/**
+ * pre-request callback
+ * @param user_context
+ *
+ *
+ * @retval MFD_SUCCESS : success.
+ * @retval MFD_ERROR : other error
+ */
+int
+ifTable_pre_request(ifTable_registration * user_context)
+{
+ DEBUGMSGTL(("verbose:ifTable:ifTable_pre_request", "called\n"));
+
+ /*
+ * TODO:510:o: Perform ifTable pre-request actions.
+ */
+
+ return MFD_SUCCESS;
+} /* ifTable_pre_request */
+
+/**
+ * post-request callback
+ *
+ * Note:
+ * New rows have been inserted into the container, and
+ * deleted rows have been removed from the container and
+ * released.
+ *
+ * @param user_context
+ * @param rc : MFD_SUCCESS if all requests succeeded
+ *
+ * @retval MFD_SUCCESS : success.
+ * @retval MFD_ERROR : other error (ignored)
+ */
+int
+ifTable_post_request(ifTable_registration * user_context, int rc)
+{
+ DEBUGMSGTL(("verbose:ifTable:ifTable_post_request", "called\n"));
+
+ /*
+ * TODO:511:o: Perform ifTable post-request actions.
+ */
+
+ /*
+ * check to set if any rows were changed.
+ */
+ if (ifTable_dirty_get()) {
+ /*
+ * check if request was successful. If so, this would be
+ * a good place to save data to its persistent store.
+ */
+ if (MFD_SUCCESS == rc) {
+ /*
+ * notify library to save changed rows
+ */
+ snmp_store_needed(netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID,
+ NETSNMP_DS_LIB_APPTYPE));
+ }
+
+ ifTable_dirty_set(0); /* clear table dirty flag */
+ }
+
+ return MFD_SUCCESS;
+} /* ifTable_post_request */
+
+
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table ifTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * IF-MIB::ifTable is subid 2 of interfaces.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.2.2, length: 8
+ */
+
+/*
+ * ---------------------------------------------------------------------
+ * * TODO:200:r: Implement ifTable data context functions.
+ */
+
+
+/**
+ * set mib index(es)
+ *
+ * @param tbl_idx mib index structure
+ * @param ifIndex_val
+ *
+ * @retval MFD_SUCCESS : success.
+ * @retval MFD_ERROR : other error.
+ *
+ * @remark
+ * This convenience function is useful for setting all the MIB index
+ * components with a single function call. It is assume that the C values
+ * have already been mapped from their native/rawformat to the MIB format.
+ */
+int
+ifTable_indexes_set_tbl_idx(ifTable_mib_index * tbl_idx, long ifIndex_val)
+{
+ DEBUGMSGTL(("verbose:ifTable:ifTable_indexes_set_tbl_idx",
+ "called\n"));
+
+ /*
+ * ifIndex(1)/InterfaceIndex/ASN_INTEGER/long(long)//l/A/w/e/R/d/H
+ */
+ tbl_idx->ifIndex = ifIndex_val;
+
+
+ return MFD_SUCCESS;
+} /* ifTable_indexes_set_tbl_idx */
+
+/**
+ * @internal
+ * set row context indexes
+ *
+ * @param reqreq_ctx the row context that needs updated indexes
+ * @param ifIndex_val
+ *
+ * @retval MFD_SUCCESS : success.
+ * @retval MFD_ERROR : other error.
+ *
+ * @remark
+ * This function sets the mib indexs, then updates the oid indexs
+ * from the mib index.
+ */
+int
+ifTable_indexes_set(ifTable_rowreq_ctx * rowreq_ctx, long ifIndex_val)
+{
+ DEBUGMSGTL(("verbose:ifTable:ifTable_indexes_set", "called\n"));
+
+ if (MFD_SUCCESS !=
+ ifTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx, ifIndex_val))
+ return MFD_ERROR;
+
+ /*
+ * convert mib index to oid index
+ */
+ rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
+ if (0 != ifTable_index_to_oid(&rowreq_ctx->oid_idx,
+ &rowreq_ctx->tbl_idx)) {
+ return MFD_ERROR;
+ }
+
+ return MFD_SUCCESS;
+} /* ifTable_indexes_set */
+
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifDescr
+ * ifDescr is subid 2 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.2
+ * Description:
+A textual string containing information about the
+ interface. This string should include the name of the
+ manufacturer, the product name and the version of the
+ interface hardware/software.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 1 hashint 1
+ * settable 0
+ * hint: 255a
+ *
+ * Ranges: 0 - 255;
+ *
+ * Its syntax is DisplayString (based on perltype OCTETSTR)
+ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+ * This data type requires a length. (Max 255)
+ */
+/**
+ * Extract the current value of the ifDescr data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifDescr_val_ptr_ptr
+ * Pointer to storage for a char variable
+ * @param ifDescr_val_ptr_len_ptr
+ * Pointer to a size_t. On entry, it will contain the size (in bytes)
+ * pointed to by ifDescr.
+ * On exit, this value should contain the data size (in bytes).
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+*
+ * @note If you need more than (*ifDescr_val_ptr_len_ptr) bytes of memory,
+ * allocate it using malloc() and update ifDescr_val_ptr_ptr.
+ * <b>DO NOT</b> free the previous pointer.
+ * The MFD helper will release the memory you allocate.
+ *
+ * @remark If you call this function yourself, you are responsible
+ * for checking if the pointer changed, and freeing any
+ * previously allocated memory. (Not necessary if you pass
+ * in a pointer to static memory, obviously.)
+ */
+int
+ifDescr_get(ifTable_rowreq_ctx * rowreq_ctx, char **ifDescr_val_ptr_ptr,
+ size_t * ifDescr_val_ptr_len_ptr)
+{
+ char *tmp_descr = NULL;
+ u_char tmp_len = 0;
+
+ /** we should have a non-NULL pointer and enough storage */
+ netsnmp_assert((NULL != ifDescr_val_ptr_ptr)
+ && (NULL != *ifDescr_val_ptr_ptr));
+ netsnmp_assert(NULL != ifDescr_val_ptr_len_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifDescr_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * if ifDescr is NULL, use the ifName
+ */
+ if (NULL == rowreq_ctx->data.ifDescr) {
+#ifdef USING_IF_MIB_IFXTABLE_IFXTABLE_MODULE
+ tmp_descr = rowreq_ctx->data.ifName;
+#else
+ tmp_descr = NULL;
+#endif
+ } else
+ tmp_descr = rowreq_ctx->data.ifDescr;
+
+ if (NULL != tmp_descr)
+ tmp_len = strlen(tmp_descr);
+ else
+ tmp_len = 0;
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifDescr data.
+ * copy (* ifDescr_val_ptr_ptr ) data and (* ifDescr_val_ptr_len_ptr ) from rowreq_ctx->data
+ */
+ /*
+ * make sure there is enough space for ifDescr data
+ */
+ if ((NULL == (*ifDescr_val_ptr_ptr)) ||
+ ((*ifDescr_val_ptr_len_ptr) < tmp_len)) {
+ /*
+ * allocate space for ifDescr data
+ */
+ (*ifDescr_val_ptr_ptr) =
+ (char*)malloc(tmp_len * sizeof(rowreq_ctx->data.ifDescr[0]));
+ if (NULL == (*ifDescr_val_ptr_ptr)) {
+ snmp_log(LOG_ERR, "could not allocate memory\n");
+ return MFD_ERROR;
+ }
+ }
+ (*ifDescr_val_ptr_len_ptr) =
+ tmp_len * sizeof(rowreq_ctx->data.ifDescr[0]);
+ memcpy((*ifDescr_val_ptr_ptr), tmp_descr, (*ifDescr_val_ptr_len_ptr));
+
+ return MFD_SUCCESS;
+} /* ifDescr_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifType
+ * ifType is subid 3 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.3
+ * Description:
+The type of interface. Additional values for ifType are
+ assigned by the Internet Assigned Numbers Authority (IANA),
+ through updating the syntax of the IANAifType textual
+ convention.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 1 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ * Enum range: 149/256. Values: other(1), regular1822(2), hdh1822(3), ddnX25(4), rfc877x25(5), ethernetCsmacd(6), iso88023Csmacd(7), iso88024TokenBus(8), iso88025TokenRing(9), iso88026Man(10), starLan(11), proteon10Mbit(12), proteon80Mbit(13), hyperchannel(14), fddi(15), lapb(16), sdlc(17), ds1(18), e1(19), basicISDN(20), primaryISDN(21), propPointToPointSerial(22), ppp(23), softwareLoopback(24), eon(25), ethernet3Mbit(26), nsip(27), slip(28), ultra(29), ds3(30), sip(31), frameRelay(32), rs232(33), para(34), arcnet(35), arcnetPlus(36), atm(37), miox25(38), sonet(39), x25ple(40), iso88022llc(41), localTalk(42), smdsDxi(43), frameRelayService(44), v35(45), hssi(46), hippi(47), modem(48), aal5(49), sonetPath(50), sonetVT(51), smdsIcip(52), propVirtual(53), propMultiplexor(54), ieee80212(55), fibreChannel(56), hippiInterface(57), frameRelayInterconnect(58), aflane8023(59), aflane8025(60), cctEmul(61), fastEther(62), isdn(63), v11(64), v36(65), g703at64k(66), g703at2mb(67), qllc(68), fastEtherFX(69), channel(70), ieee80211(71), ibm370parChan(72), escon(73), dlsw(74), isdns(75), isdnu(76), lapd(77), ipSwitch(78), rsrb(79), atmLogical(80), ds0(81), ds0Bundle(82), bsc(83), async(84), cnr(85), iso88025Dtr(86), eplrs(87), arap(88), propCnls(89), hostPad(90), termPad(91), frameRelayMPI(92), x213(93), adsl(94), radsl(95), sdsl(96), vdsl(97), iso88025CRFPInt(98), myrinet(99), voiceEM(100), voiceFXO(101), voiceFXS(102), voiceEncap(103), voiceOverIp(104), atmDxi(105), atmFuni(106), atmIma(107), pppMultilinkBundle(108), ipOverCdlc(109), ipOverClaw(110), stackToStack(111), virtualIpAddress(112), mpc(113), ipOverAtm(114), iso88025Fiber(115), tdlc(116), gigabitEthernet(117), hdlc(118), lapf(119), v37(120), x25mlp(121), x25huntGroup(122), trasnpHdlc(123), interleave(124), fast(125), ip(126), docsCableMaclayer(127), docsCableDownstream(128), docsCableUpstream(129), a12MppSwitch(130), tunnel(131), coffee(132), ces(133), atmSubInterface(134), l2vlan(135), l3ipvlan(136), l3ipxvlan(137), digitalPowerline(138), mediaMailOverIp(139), dtm(140), dcn(141), ipForward(142), msdsl(143), ieee1394(144), if_gsn(145), dvbRccMacLayer(146), dvbRccDownstream(147), dvbRccUpstream(148), atmVirtual(149), mplsTunnel(150), srp(151), voiceOverAtm(152), voiceOverFrameRelay(153), idsl(154), compositeLink(155), ss7SigLink(156), propWirelessP2P(157), frForward(158), rfc1483(159), usb(160), ieee8023adLag(161), bgppolicyaccounting(162), frf16MfrBundle(163), h323Gatekeeper(164), h323Proxy(165), mpls(166), mfSigLink(167), hdsl2(168), shdsl(169), ds1FDL(170), pos(171), dvbAsiIn(172), dvbAsiOut(173), plc(174), nfas(175), tr008(176), gr303RDT(177), gr303IDT(178), isup(179), propDocsWirelessMaclayer(180), propDocsWirelessDownstream(181), propDocsWirelessUpstream(182), hiperlan2(183), propBWAp2Mp(184), sonetOverheadChannel(185), digitalWrapperOverheadChannel(186), aal2(187), radioMAC(188), atmRadio(189), imt(190), mvl(191), reachDSL(192), frDlciEndPt(193), atmVciEndPt(194), opticalChannel(195), opticalTransport(196), propAtm(197), voiceOverCable(198), infiniband(199), teLink(200), q2931(201), virtualTg(202), sipTg(203), sipSig(204), docsCableUpstreamChannel(205), econet(206), pon155(207), pon622(208), bridge(209), linegroup(210), voiceEMFGD(211), voiceFGDEANA(212), voiceDID(213), mpegTransport(214), sixToFour(215), gtp(216), pdnEtherLoop1(217), pdnEtherLoop2(218), opticalChannelGroup(219), homepna(220), gfp(221), ciscoISLvlan(222), actelisMetaLOOP(223), fcipLink(224)
+ *
+ * Its syntax is IANAifType (based on perltype INTEGER)
+ * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
+ */
+/**
+ * Extract the current value of the ifType data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifType_val_ptr
+ * Pointer to storage for a long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifType_get(ifTable_rowreq_ctx * rowreq_ctx, u_long * ifType_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifType_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifType_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifType data.
+ * copy (* ifType_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifType_val_ptr) = rowreq_ctx->data.ifType;
+
+ return MFD_SUCCESS;
+} /* ifType_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifMtu
+ * ifMtu is subid 4 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.4
+ * Description:
+The size of the largest packet which can be sent/received
+ on the interface, specified in octets. For interfaces that
+ are used for transmitting network datagrams, this is the
+ size of the largest network datagram that can be sent on the
+ interface.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is INTEGER32 (based on perltype INTEGER32)
+ * The net-snmp type is ASN_INTEGER. The C type decl is long (long)
+ */
+/**
+ * Extract the current value of the ifMtu data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifMtu_val_ptr
+ * Pointer to storage for a long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifMtu_get(ifTable_rowreq_ctx * rowreq_ctx, long *ifMtu_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifMtu_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifMtu_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifMtu data.
+ * copy (* ifMtu_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifMtu_val_ptr) = rowreq_ctx->data.ifMtu;
+
+ return MFD_SUCCESS;
+} /* ifMtu_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifSpeed
+ * ifSpeed is subid 5 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.5
+ * Description:
+An estimate of the interface's current bandwidth in bits
+ per second. For interfaces which do not vary in bandwidth
+ or for those where no accurate estimation can be made, this
+ object should contain the nominal bandwidth. If the
+ bandwidth of the interface is greater than the maximum value
+ reportable by this object then this object should report its
+ maximum value (4,294,967,295) and ifHighSpeed must be used
+ to report the interace's speed. For a sub-layer which has
+ no concept of bandwidth, this object should be zero.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is GAUGE (based on perltype GAUGE)
+ * The net-snmp type is ASN_GAUGE. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifSpeed data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifSpeed_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifSpeed_get(ifTable_rowreq_ctx * rowreq_ctx, u_long * ifSpeed_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifSpeed_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifSpeed_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifSpeed data.
+ * copy (* ifSpeed_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifSpeed_val_ptr) = rowreq_ctx->data.ifSpeed;
+
+ return MFD_SUCCESS;
+} /* ifSpeed_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifPhysAddress
+ * ifPhysAddress is subid 6 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.6
+ * Description:
+The interface's address at its protocol sub-layer. For
+ example, for an 802.x interface, this object normally
+ contains a MAC address. The interface's media-specific MIB
+ must define the bit and byte ordering and the format of the
+ value of this object. For interfaces which do not have such
+ an address (e.g., a serial line), this object should contain
+ an octet string of zero length.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 1
+ * settable 0
+ * hint: 1x:
+ *
+ *
+ * Its syntax is PhysAddress (based on perltype OCTETSTR)
+ * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
+ * This data type requires a length. (Max 255)
+ */
+/**
+ * Extract the current value of the ifPhysAddress data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifPhysAddress_val_ptr_ptr
+ * Pointer to storage for a char variable
+ * @param ifPhysAddress_val_ptr_len_ptr
+ * Pointer to a size_t. On entry, it will contain the size (in bytes)
+ * pointed to by ifPhysAddress.
+ * On exit, this value should contain the data size (in bytes).
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+*
+ * @note If you need more than (*ifPhysAddress_val_ptr_len_ptr) bytes of memory,
+ * allocate it using malloc() and update ifPhysAddress_val_ptr_ptr.
+ * <b>DO NOT</b> free the previous pointer.
+ * The MFD helper will release the memory you allocate.
+ *
+ * @remark If you call this function yourself, you are responsible
+ * for checking if the pointer changed, and freeing any
+ * previously allocated memory. (Not necessary if you pass
+ * in a pointer to static memory, obviously.)
+ */
+int
+ifPhysAddress_get(ifTable_rowreq_ctx * rowreq_ctx,
+ char **ifPhysAddress_val_ptr_ptr,
+ size_t * ifPhysAddress_val_ptr_len_ptr)
+{
+ /** we should have a non-NULL pointer and enough storage */
+ netsnmp_assert((NULL != ifPhysAddress_val_ptr_ptr)
+ && (NULL != *ifPhysAddress_val_ptr_ptr));
+ netsnmp_assert(NULL != ifPhysAddress_val_ptr_len_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifPhysAddress_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ if ((rowreq_ctx->data.ifPhysAddress[0] == 0) &&
+ (rowreq_ctx->data.ifPhysAddress[1] == 0) &&
+ (rowreq_ctx->data.ifPhysAddress[2] == 0) &&
+ (rowreq_ctx->data.ifPhysAddress[3] == 0) &&
+ (rowreq_ctx->data.ifPhysAddress[4] == 0) &&
+ (rowreq_ctx->data.ifPhysAddress[5] == 0)) {
+ /*
+ * all 0s = empty string
+ */
+ (*ifPhysAddress_val_ptr_len_ptr) = 0;
+ return MFD_SUCCESS;
+ }
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifPhysAddress data.
+ * copy (* ifPhysAddress_val_ptr_ptr ) data and (* ifPhysAddress_val_ptr_len_ptr ) from rowreq_ctx->data
+ */
+ /*
+ * make sure there is enough space for ifPhysAddress data
+ */
+ if ((NULL == (*ifPhysAddress_val_ptr_ptr)) ||
+ ((*ifPhysAddress_val_ptr_len_ptr) <
+ (rowreq_ctx->data.ifPhysAddress_len *
+ sizeof(rowreq_ctx->data.ifPhysAddress[0])))) {
+ /*
+ * allocate space for ifPhysAddress data
+ */
+ (*ifPhysAddress_val_ptr_ptr) =
+ (char*)malloc(rowreq_ctx->data.ifPhysAddress_len *
+ sizeof(rowreq_ctx->data.ifPhysAddress[0]));
+ if (NULL == (*ifPhysAddress_val_ptr_ptr)) {
+ snmp_log(LOG_ERR, "could not allocate memory\n");
+ return MFD_ERROR;
+ }
+ }
+ (*ifPhysAddress_val_ptr_len_ptr) =
+ rowreq_ctx->data.ifPhysAddress_len *
+ sizeof(rowreq_ctx->data.ifPhysAddress[0]);
+ memcpy((*ifPhysAddress_val_ptr_ptr), rowreq_ctx->data.ifPhysAddress,
+ (*ifPhysAddress_val_ptr_len_ptr));
+
+ return MFD_SUCCESS;
+} /* ifPhysAddress_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifAdminStatus
+ * ifAdminStatus is subid 7 of ifEntry.
+ * Its status is Current, and its access level is ReadWrite.
+ * OID: .1.3.6.1.2.1.2.2.1.7
+ * Description:
+The desired state of the interface. The testing(3) state
+ indicates that no operational packets can be passed. When a
+ managed system initializes, all interfaces start with
+ ifAdminStatus in the down(2) state. As a result of either
+ explicit management action or per configuration information
+ retained by the managed system, ifAdminStatus is then
+ changed to either the up(1) or testing(3) states (or remains
+ in the down(2) state).
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 1 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 1
+ *
+ * Enum range: 2/8. Values: up(1), down(2), testing(3)
+ *
+ * Its syntax is INTEGER (based on perltype INTEGER)
+ * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
+ */
+/**
+ * Extract the current value of the ifAdminStatus data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifAdminStatus_val_ptr
+ * Pointer to storage for a long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifAdminStatus_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifAdminStatus_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifAdminStatus_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifAdminStatus_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifAdminStatus data.
+ * copy (* ifAdminStatus_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifAdminStatus_val_ptr) = rowreq_ctx->data.ifAdminStatus;
+
+ return MFD_SUCCESS;
+} /* ifAdminStatus_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifOperStatus
+ * ifOperStatus is subid 8 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.8
+ * Description:
+The current operational state of the interface. The
+ testing(3) state indicates that no operational packets can
+ be passed. If ifAdminStatus is down(2) then ifOperStatus
+ should be down(2). If ifAdminStatus is changed to up(1)
+ then ifOperStatus should change to up(1) if the interface is
+ ready to transmit and receive network traffic; it should
+ change to dormant(5) if the interface is waiting for
+ external actions (such as a serial line waiting for an
+ incoming connection); it should remain in the down(2) state
+ if and only if there is a fault that prevents it from going
+ to the up(1) state; it should remain in the notPresent(6)
+ state if the interface has missing (typically, hardware)
+ components.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 1 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ * Enum range: 5/8. Values: up(1), down(2), testing(3), unknown(4), dormant(5), notPresent(6), lowerLayerDown(7)
+ *
+ * Its syntax is INTEGER (based on perltype INTEGER)
+ * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
+ */
+/**
+ * Extract the current value of the ifOperStatus data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifOperStatus_val_ptr
+ * Pointer to storage for a long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifOperStatus_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifOperStatus_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifOperStatus_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifOperStatus_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifOperStatus data.
+ * copy (* ifOperStatus_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifOperStatus_val_ptr) = rowreq_ctx->data.ifOperStatus;
+
+ return MFD_SUCCESS;
+} /* ifOperStatus_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifLastChange
+ * ifLastChange is subid 9 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.9
+ * Description:
+The value of sysUpTime at the time the interface entered
+ its current operational state. If the current state was
+ entered prior to the last re-initialization of the local
+ network management subsystem, then this object contains a
+ zero value.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is TICKS (based on perltype TICKS)
+ * The net-snmp type is ASN_TIMETICKS. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifLastChange data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifLastChange_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifLastChange_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifLastChange_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifLastChange_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifLastChange_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifLastChange data.
+ * copy (* ifLastChange_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifLastChange_val_ptr) = rowreq_ctx->data.ifLastChange;
+
+ return MFD_SUCCESS;
+} /* ifLastChange_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifInOctets
+ * ifInOctets is subid 10 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.10
+ * Description:
+The total number of octets received on the interface,
+ including framing characters.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is COUNTER (based on perltype COUNTER)
+ * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifInOctets data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifInOctets_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifInOctets_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifInOctets_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifInOctets_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifInOctets_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifInOctets data.
+ * copy (* ifInOctets_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifInOctets_val_ptr) = rowreq_ctx->data.ifInOctets;
+
+ return MFD_SUCCESS;
+} /* ifInOctets_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifInUcastPkts
+ * ifInUcastPkts is subid 11 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.11
+ * Description:
+The number of packets, delivered by this sub-layer to a
+ higher (sub-)layer, which were not addressed to a multicast
+ or broadcast address at this sub-layer.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is COUNTER (based on perltype COUNTER)
+ * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifInUcastPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifInUcastPkts_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifInUcastPkts_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifInUcastPkts_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifInUcastPkts_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifInUcastPkts_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifInUcastPkts data.
+ * copy (* ifInUcastPkts_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifInUcastPkts_val_ptr) = rowreq_ctx->data.ifInUcastPkts;
+
+ return MFD_SUCCESS;
+} /* ifInUcastPkts_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifInNUcastPkts
+ * ifInNUcastPkts is subid 12 of ifEntry.
+ * Its status is Deprecated, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.12
+ * Description:
+The number of packets, delivered by this sub-layer to a
+ higher (sub-)layer, which were addressed to a multicast or
+ broadcast address at this sub-layer.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+
+ This object is deprecated in favour of ifInMulticastPkts and
+ ifInBroadcastPkts.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is COUNTER (based on perltype COUNTER)
+ * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifInNUcastPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifInNUcastPkts_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifInNUcastPkts_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifInNUcastPkts_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifInNUcastPkts_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifInNUcastPkts_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifInNUcastPkts data.
+ * copy (* ifInNUcastPkts_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifInNUcastPkts_val_ptr) = rowreq_ctx->data.ifInNUcastPkts;
+
+ return MFD_SUCCESS;
+} /* ifInNUcastPkts_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifInDiscards
+ * ifInDiscards is subid 13 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.13
+ * Description:
+The number of inbound packets which were chosen to be
+ discarded even though no errors had been detected to prevent
+
+ their being deliverable to a higher-layer protocol. One
+ possible reason for discarding such a packet could be to
+ free up buffer space.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is COUNTER (based on perltype COUNTER)
+ * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifInDiscards data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifInDiscards_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifInDiscards_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifInDiscards_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifInDiscards_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifInDiscards_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifInDiscards data.
+ * copy (* ifInDiscards_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifInDiscards_val_ptr) = rowreq_ctx->data.ifInDiscards;
+
+ return MFD_SUCCESS;
+} /* ifInDiscards_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifInErrors
+ * ifInErrors is subid 14 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.14
+ * Description:
+For packet-oriented interfaces, the number of inbound
+ packets that contained errors preventing them from being
+ deliverable to a higher-layer protocol. For character-
+ oriented or fixed-length interfaces, the number of inbound
+ transmission units that contained errors preventing them
+ from being deliverable to a higher-layer protocol.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is COUNTER (based on perltype COUNTER)
+ * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifInErrors data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifInErrors_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifInErrors_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifInErrors_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifInErrors_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifInErrors_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifInErrors data.
+ * copy (* ifInErrors_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifInErrors_val_ptr) = rowreq_ctx->data.ifInErrors;
+
+ return MFD_SUCCESS;
+} /* ifInErrors_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifInUnknownProtos
+ * ifInUnknownProtos is subid 15 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.15
+ * Description:
+For packet-oriented interfaces, the number of packets
+ received via the interface which were discarded because of
+ an unknown or unsupported protocol. For character-oriented
+ or fixed-length interfaces that support protocol
+ multiplexing the number of transmission units received via
+ the interface which were discarded because of an unknown or
+ unsupported protocol. For any interface that does not
+ support protocol multiplexing, this counter will always be
+ 0.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is COUNTER (based on perltype COUNTER)
+ * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifInUnknownProtos data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifInUnknownProtos_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifInUnknownProtos_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifInUnknownProtos_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifInUnknownProtos_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifInUnknownProtos_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifInUnknownProtos data.
+ * copy (* ifInUnknownProtos_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifInUnknownProtos_val_ptr) = rowreq_ctx->data.ifInUnknownProtos;
+
+ return MFD_SUCCESS;
+} /* ifInUnknownProtos_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifOutOctets
+ * ifOutOctets is subid 16 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.16
+ * Description:
+The total number of octets transmitted out of the
+ interface, including framing characters.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is COUNTER (based on perltype COUNTER)
+ * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifOutOctets data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifOutOctets_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifOutOctets_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifOutOctets_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifOutOctets_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifOutOctets_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifOutOctets data.
+ * copy (* ifOutOctets_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifOutOctets_val_ptr) = rowreq_ctx->data.ifOutOctets;
+
+ return MFD_SUCCESS;
+} /* ifOutOctets_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifOutUcastPkts
+ * ifOutUcastPkts is subid 17 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.17
+ * Description:
+The total number of packets that higher-level protocols
+ requested be transmitted, and which were not addressed to a
+ multicast or broadcast address at this sub-layer, including
+ those that were discarded or not sent.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is COUNTER (based on perltype COUNTER)
+ * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifOutUcastPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifOutUcastPkts_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifOutUcastPkts_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifOutUcastPkts_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifOutUcastPkts_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifOutUcastPkts_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifOutUcastPkts data.
+ * copy (* ifOutUcastPkts_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifOutUcastPkts_val_ptr) = rowreq_ctx->data.ifOutUcastPkts;
+
+ return MFD_SUCCESS;
+} /* ifOutUcastPkts_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifOutNUcastPkts
+ * ifOutNUcastPkts is subid 18 of ifEntry.
+ * Its status is Deprecated, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.18
+ * Description:
+The total number of packets that higher-level protocols
+ requested be transmitted, and which were addressed to a
+ multicast or broadcast address at this sub-layer, including
+ those that were discarded or not sent.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+
+ This object is deprecated in favour of ifOutMulticastPkts
+ and ifOutBroadcastPkts.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is COUNTER (based on perltype COUNTER)
+ * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifOutNUcastPkts data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifOutNUcastPkts_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifOutNUcastPkts_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifOutNUcastPkts_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifOutNUcastPkts_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifOutNUcastPkts_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifOutNUcastPkts data.
+ * copy (* ifOutNUcastPkts_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifOutNUcastPkts_val_ptr) = rowreq_ctx->data.ifOutNUcastPkts;
+
+ return MFD_SUCCESS;
+} /* ifOutNUcastPkts_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifOutDiscards
+ * ifOutDiscards is subid 19 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.19
+ * Description:
+The number of outbound packets which were chosen to be
+ discarded even though no errors had been detected to prevent
+ their being transmitted. One possible reason for discarding
+ such a packet could be to free up buffer space.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is COUNTER (based on perltype COUNTER)
+ * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifOutDiscards data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifOutDiscards_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifOutDiscards_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifOutDiscards_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifOutDiscards_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifOutDiscards_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifOutDiscards data.
+ * copy (* ifOutDiscards_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifOutDiscards_val_ptr) = rowreq_ctx->data.ifOutDiscards;
+
+ return MFD_SUCCESS;
+} /* ifOutDiscards_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifOutErrors
+ * ifOutErrors is subid 20 of ifEntry.
+ * Its status is Current, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.20
+ * Description:
+For packet-oriented interfaces, the number of outbound
+ packets that could not be transmitted because of errors.
+ For character-oriented or fixed-length interfaces, the
+ number of outbound transmission units that could not be
+ transmitted because of errors.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is COUNTER (based on perltype COUNTER)
+ * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifOutErrors data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifOutErrors_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifOutErrors_get(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long * ifOutErrors_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifOutErrors_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifOutErrors_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifOutErrors data.
+ * copy (* ifOutErrors_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifOutErrors_val_ptr) = rowreq_ctx->data.ifOutErrors;
+
+ return MFD_SUCCESS;
+} /* ifOutErrors_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifOutQLen
+ * ifOutQLen is subid 21 of ifEntry.
+ * Its status is Deprecated, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.21
+ * Description:
+The length of the output packet queue (in packets).
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is GAUGE (based on perltype GAUGE)
+ * The net-snmp type is ASN_GAUGE. The C type decl is u_long (u_long)
+ */
+/**
+ * Extract the current value of the ifOutQLen data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifOutQLen_val_ptr
+ * Pointer to storage for a u_long variable
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+ */
+int
+ifOutQLen_get(ifTable_rowreq_ctx * rowreq_ctx, u_long * ifOutQLen_val_ptr)
+{
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != ifOutQLen_val_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifOutQLen_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifOutQLen data.
+ * copy (* ifOutQLen_val_ptr ) from rowreq_ctx->data
+ */
+ (*ifOutQLen_val_ptr) = rowreq_ctx->data.ifOutQLen;
+
+ return MFD_SUCCESS;
+} /* ifOutQLen_get */
+
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifSpecific
+ * ifSpecific is subid 22 of ifEntry.
+ * Its status is Deprecated, and its access level is ReadOnly.
+ * OID: .1.3.6.1.2.1.2.2.1.22
+ * Description:
+A reference to MIB definitions specific to the particular
+ media being used to realize the interface. It is
+
+ recommended that this value point to an instance of a MIB
+ object in the media-specific MIB, i.e., that this object
+ have the semantics associated with the InstancePointer
+ textual convention defined in RFC 2579. In fact, it is
+ recommended that the media-specific MIB specify what value
+ ifSpecific should/can take for values of ifType. If no MIB
+ definitions specific to the particular media are available,
+ the value should be set to the OBJECT IDENTIFIER { 0 0 }.
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 0 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 0
+ *
+ *
+ * Its syntax is OBJECTID (based on perltype OBJECTID)
+ * The net-snmp type is ASN_OBJECT_ID. The C type decl is oid (oid)
+ * This data type requires a length. (Max 255)
+ */
+/**
+ * Extract the current value of the ifSpecific data.
+ *
+ * Set a value using the data context for the row.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifSpecific_val_ptr_ptr
+ * Pointer to storage for a oid variable
+ * @param ifSpecific_val_ptr_len_ptr
+ * Pointer to a size_t. On entry, it will contain the size (in bytes)
+ * pointed to by ifSpecific.
+ * On exit, this value should contain the data size (in bytes).
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_SKIP : skip this node (no value for now)
+ * @retval MFD_ERROR : Any other error
+*
+ * @note If you need more than (*ifSpecific_val_ptr_len_ptr) bytes of memory,
+ * allocate it using malloc() and update ifSpecific_val_ptr_ptr.
+ * <b>DO NOT</b> free the previous pointer.
+ * The MFD helper will release the memory you allocate.
+ *
+ * @remark If you call this function yourself, you are responsible
+ * for checking if the pointer changed, and freeing any
+ * previously allocated memory. (Not necessary if you pass
+ * in a pointer to static memory, obviously.)
+ */
+int
+ifSpecific_get(ifTable_rowreq_ctx * rowreq_ctx,
+ oid ** ifSpecific_val_ptr_ptr,
+ size_t * ifSpecific_val_ptr_len_ptr)
+{
+ /** we should have a non-NULL pointer and enough storage */
+ netsnmp_assert((NULL != ifSpecific_val_ptr_ptr)
+ && (NULL != *ifSpecific_val_ptr_ptr));
+ netsnmp_assert(NULL != ifSpecific_val_ptr_len_ptr);
+
+
+ DEBUGMSGTL(("verbose:ifTable:ifSpecific_get", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:231:o: |-> Extract the current value of the ifSpecific data.
+ * copy (* ifSpecific_val_ptr_ptr ) data and (* ifSpecific_val_ptr_len_ptr ) from rowreq_ctx->data
+ */
+#ifdef IFTABLE_HAS_IFSPECIFIC
+ /*
+ * make sure there is enough space for ifSpecific data
+ */
+ if ((NULL == (*ifSpecific_val_ptr_ptr)) ||
+ ((*ifSpecific_val_ptr_len_ptr) <
+ (rowreq_ctx->data.ifSpecific_len *
+ sizeof(rowreq_ctx->data.ifSpecific[0])))) {
+ /*
+ * allocate space for ifSpecific data
+ */
+ (*ifSpecific_val_ptr_ptr) =
+ malloc(rowreq_ctx->data.ifSpecific_len *
+ sizeof(rowreq_ctx->data.ifSpecific[0]));
+ if (NULL == (*ifSpecific_val_ptr_ptr)) {
+ snmp_log(LOG_ERR, "could not allocate memory\n");
+ return MFD_ERROR;
+ }
+ }
+ (*ifSpecific_val_ptr_len_ptr) =
+ rowreq_ctx->data.ifSpecific_len *
+ sizeof(rowreq_ctx->data.ifSpecific[0]);
+ memcpy((*ifSpecific_val_ptr_ptr), rowreq_ctx->data.ifSpecific,
+ (*ifSpecific_val_ptr_len_ptr));
+#else
+ /*
+ * hard coded
+ */
+ netsnmp_assert((*ifSpecific_val_ptr_len_ptr) > (size_t)nullOidLen);
+ (*ifSpecific_val_ptr_len_ptr) = (size_t)nullOidLen;
+ memcpy(*ifSpecific_val_ptr_ptr, &nullOid, (size_t)nullOidLen);
+#endif
+
+ return MFD_SUCCESS;
+} /* ifSpecific_get */
+
+
+
+/** @} */
+
+#ifndef NETSNMP_NO_WRITE_SUPPORT
+
+/**********************************************************************
+ **********************************************************************
+ ***
+ *** Table ifTable
+ ***
+ **********************************************************************
+ **********************************************************************/
+/*
+ * IF-MIB::ifTable is subid 2 of interfaces.
+ * Its status is Current.
+ * OID: .1.3.6.1.2.1.2.2, length: 8
+ */
+ /*
+ * NOTE: if you update this chart, please update the versions in
+ * local/mib2c-conf.d/parent-set.m2i
+ * agent/mibgroup/helpers/baby_steps.c
+ * while you're at it.
+ */
+ /*
+ ***********************************************************************
+ * Baby Steps Flow Chart (2004.06.05) *
+ * *
+ * +--------------+ +================+ U = unconditional path *
+ * |optional state| ||required state|| S = path for success *
+ * +--------------+ +================+ E = path for error *
+ ***********************************************************************
+ *
+ * +--------------+
+ * | pre |
+ * | request |
+ * +--------------+
+ * | U
+ * +==============+
+ * +----------------|| object ||
+ * | E || lookup ||
+ * | +==============+
+ * | | S
+ * | +==============+
+ * | E || check ||
+ * |<---------------|| values ||
+ * | +==============+
+ * | | S
+ * | +==============+
+ * | +<-------|| undo ||
+ * | | E || setup ||
+ * | | +==============+
+ * | | | S
+ * | | +==============+
+ * | | || set ||-------------------------->+
+ * | | || value || E |
+ * | | +==============+ |
+ * | | | S |
+ * | | +--------------+ |
+ * | | | check |-------------------------->|
+ * | | | consistency | E |
+ * | | +--------------+ |
+ * | | | S |
+ * | | +==============+ +==============+ |
+ * | | || commit ||-------->|| undo || |
+ * | | || || E || commit || |
+ * | | +==============+ +==============+ |
+ * | | | S U |<--------+
+ * | | +--------------+ +==============+
+ * | | | irreversible | || undo ||
+ * | | | commit | || set ||
+ * | | +--------------+ +==============+
+ * | | | U U |
+ * | +-------------->|<------------------------+
+ * | +==============+
+ * | || undo ||
+ * | || cleanup ||
+ * | +==============+
+ * +---------------------->| U
+ * +--------------+
+ * | post |
+ * | request |
+ * +--------------+
+ *
+ */
+
+/**
+ * Setup up context with information needed to undo a set request.
+ *
+ * Undo storage is in (* ifSpecific_val_ptr_ptr )*
+ * This function will be called before the individual node undo setup
+ * functions are called. If you need to do any undo setup that is not
+ * related to a specific column, you can do it here.
+ *
+ * Note that the undo context has been allocated with
+ * ifTable_allocate_data(), but may need extra
+ * initialization similar to what you may have done in
+ * ifTable_rowreq_ctx_init().
+ * Note that an individual node's undo_setup function will only be called
+ * if that node is being set to a new value.
+ *
+ * If there is any setup specific to a particular column (e.g. allocating
+ * memory for a string), you should do that setup in the node's undo_setup
+ * function, so it won't be done unless it is necessary.
+ *
+ * @param rowreq_ctx
+ * Pointer to the table context (ifTable_rowreq_ctx)
+ *
+ * @retval MFD_SUCCESS : success
+ * Undo storage is in (* ifSpecific_val_ptr_ptr )*
+ * @retval MFD_ERROR : error. set will fail.
+ */
+int
+ifTable_undo_setup(ifTable_rowreq_ctx * rowreq_ctx)
+{
+ int rc = MFD_SUCCESS;
+
+ DEBUGMSGTL(("verbose:ifTable:ifTable_undo_setup", "called\n"));
+
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:451:M: |-> Setup ifTable undo.
+ * set up ifTable undo information, in preparation for a set.
+ * Undo storage is in (* ifSpecific_val_ptr_ptr )*
+ */
+
+ return rc;
+} /* ifTable_undo_setup */
+
+/**
+ * Undo a set request.
+ *
+ * This function will be called before the individual node undo
+ * functions are called. If you need to do any undo that is not
+ * related to a specific column, you can do it here.
+ *
+ * Note that an individual node's undo function will only be called
+ * if that node is being set to a new value.
+ *
+ * If there is anything specific to a particular column (e.g. releasing
+ * memory for a string), you should do that setup in the node's undo
+ * function, so it won't be done unless it is necessary.
+ *
+ * @param rowreq_ctx
+ * Pointer to the table context (ifTable_rowreq_ctx)
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : error. set will fail.
+ */
+int
+ifTable_undo(ifTable_rowreq_ctx * rowreq_ctx)
+{
+ int rc = MFD_SUCCESS;
+
+ DEBUGMSGTL(("verbose:ifTable:ifTable_undo", "called\n"));
+
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:451:M: |-> ifTable undo.
+ * ifTable undo information, in response to a failed set.
+ * Undo storage is in (* ifSpecific_val_ptr_ptr )*
+ */
+
+ return rc;
+} /* ifTable_undo_setup */
+
+/**
+ * Cleanup up context undo information.
+ *
+ * This function will be called after set/commit processing. If you
+ * allocated any resources in undo_setup, this is the place to release
+ * those resources.
+ *
+ * This function is called regardless of the success or failure of the set
+ * request. If you need to perform different steps for cleanup depending
+ * on success or failure, you can add a flag to the rowreq_ctx.
+ *
+ * @param rowreq_ctx
+ * Pointer to the table context (ifTable_rowreq_ctx)
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : error
+ */
+int
+ifTable_undo_cleanup(ifTable_rowreq_ctx * rowreq_ctx)
+{
+ int rc = MFD_SUCCESS;
+
+ DEBUGMSGTL(("verbose:ifTable:ifTable_undo_cleanup", "called\n"));
+
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:452:M: |-> Cleanup ifTable undo.
+ * Undo storage is in (* ifSpecific_val_ptr_ptr )*
+ */
+
+ return rc;
+} /* ifTable_undo_cleanup */
+
+/**
+ * commit new values.
+ *
+ * At this point, you should have done everything you can to ensure that
+ * this commit will not fail.
+ *
+ * Should you need different behavior depending on which columns were
+ * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
+ * set. The definitions for the COLUMN_*_FLAG bits can be found in
+ * ifTable.h.
+ * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
+ *
+ * @param rowreq_ctx Pointer to the users context.
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : error
+ */
+int
+ifTable_commit(ifTable_rowreq_ctx * rowreq_ctx)
+{
+ int rc = MFD_SUCCESS;
+ int save_flags;
+
+ DEBUGMSGTL(("verbose:ifTable:ifTable_commit", "called\n"));
+
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * save flags, then clear until we actually do something
+ */
+ save_flags = rowreq_ctx->column_set_flags;
+ rowreq_ctx->column_set_flags = 0;
+
+ /*
+ * commit ifTable data
+ * 1) check the column's flag in save_flags to see if it was set.
+ * 2) clear the flag when you handle that column
+ * 3) set the column's flag in column_set_flags if it needs undo
+ * processing in case of a failure.
+ */
+ if (save_flags & COLUMN_IFADMINSTATUS_FLAG) {
+ save_flags &= ~COLUMN_IFADMINSTATUS_FLAG; /* clear ifAdminStatus */
+ /*
+ * TODO:482:o: |-> commit column ifAdminStatus.
+ */
+ rc = netsnmp_access_interface_entry_set_admin_status(rowreq_ctx->
+ data.ifentry,
+ rowreq_ctx->
+ data.
+ ifAdminStatus);
+ if (0 != rc) {
+ snmp_log(LOG_ERR,
+ "ifTable column ifAdminStatus commit failed\n");
+ } else {
+ /*
+ * set flag, in case we need to undo ifAdminStatus
+ */
+ rowreq_ctx->column_set_flags |= COLUMN_IFADMINSTATUS_FLAG;
+ }
+ }
+
+ /*
+ * if we successfully commited this row, set the dirty flag.
+ */
+ if (MFD_SUCCESS == rc) {
+ rowreq_ctx->rowreq_flags |= MFD_ROW_DIRTY;
+ }
+
+ if (save_flags) {
+ snmp_log(LOG_ERR, "unhandled columns (0x%x) in commit\n",
+ save_flags);
+ return MFD_ERROR;
+ }
+
+ return rc;
+} /* ifTable_commit */
+
+/**
+ * undo commit new values.
+ *
+ * Should you need different behavior depending on which columns were
+ * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
+ * set. The definitions for the COLUMN_*_FLAG bits can be found in
+ * ifTable.h.
+ * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
+ *
+ * @param rowreq_ctx
+ * Pointer to the users context.
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : error
+ */
+int
+ifTable_undo_commit(ifTable_rowreq_ctx * rowreq_ctx)
+{
+ int rc = MFD_SUCCESS;
+
+ DEBUGMSGTL(("verbose:ifTable:ifTable_undo_commit", "called\n"));
+
+ /** we should have a non-NULL pointer */
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:485:M: |-> Undo ifTable commit.
+ * check the column's flag in rowreq_ctx->column_set_flags to see
+ * if it was set during commit, then undo it.
+ *
+ * eg: if (rowreq_ctx->column_set_flags & COLUMN__FLAG) {}
+ */
+ /*
+ * no undo cleanup, undo entry simply freed
+ */
+
+
+ /*
+ * if we successfully un-commited this row, clear the dirty flag.
+ */
+ if (MFD_SUCCESS == rc) {
+ rowreq_ctx->rowreq_flags &= ~MFD_ROW_DIRTY;
+ }
+
+ return rc;
+} /* ifTable_undo_commit */
+
+/*
+ * TODO:440:M: Implement ifTable node value checks.
+ * TODO:450:M: Implement ifTable undo functions.
+ * TODO:460:M: Implement ifTable set functions.
+ * TODO:480:M: Implement ifTable commit functions.
+ */
+/*---------------------------------------------------------------------
+ * IF-MIB::ifEntry.ifAdminStatus
+ * ifAdminStatus is subid 7 of ifEntry.
+ * Its status is Current, and its access level is ReadWrite.
+ * OID: .1.3.6.1.2.1.2.2.1.7
+ * Description:
+The desired state of the interface. The testing(3) state
+ indicates that no operational packets can be passed. When a
+ managed system initializes, all interfaces start with
+ ifAdminStatus in the down(2) state. As a result of either
+ explicit management action or per configuration information
+ retained by the managed system, ifAdminStatus is then
+ changed to either the up(1) or testing(3) states (or remains
+ in the down(2) state).
+ *
+ * Attributes:
+ * accessible 1 isscalar 0 enums 1 hasdefval 0
+ * readable 1 iscolumn 1 ranges 0 hashint 0
+ * settable 1
+ *
+ * Enum range: 2/8. Values: up(1), down(2), testing(3)
+ *
+ * Its syntax is INTEGER (based on perltype INTEGER)
+ * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
+ */
+/**
+ * Check that the proposed new value is potentially valid.
+ *
+ * @param rowreq_ctx
+ * Pointer to the row request context.
+ * @param ifAdminStatus_val
+ * A long containing the new value.
+ *
+ * @retval MFD_SUCCESS : incoming value is legal
+ * @retval MFD_NOT_VALID_NOW : incoming value is not valid now
+ * @retval MFD_NOT_VALID_EVER : incoming value is never valid
+ *
+ * This is the place to check for requirements that are not
+ * expressed in the mib syntax (for example, a requirement that
+ * is detailed in the description for an object).
+ *
+ * You should check that the requested change between the undo value and the
+ * new value is legal (ie, the transistion from one value to another
+ * is legal).
+ *
+ *@note
+ * This check is only to determine if the new value
+ * is \b potentially valid. This is the first check of many, and
+ * is one of the simplest ones.
+ *
+ *@note
+ * this is not the place to do any checks for values
+ * which depend on some other value in the mib. Those
+ * types of checks should be done in the
+ * ifTable_check_dependencies() function.
+ *
+ * The following checks have already been done for you:
+ * The syntax is ASN_INTEGER
+ * The value is one of up(1), down(2), testing(3)
+ *
+ * If there a no other checks you need to do, simply return MFD_SUCCESS.
+ *
+ */
+int
+ifAdminStatus_check_value(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long ifAdminStatus_val)
+{
+ DEBUGMSGTL(("verbose:ifTable:ifAdminStatus_check_value", "called\n"));
+
+ /** should never get a NULL pointer */
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:441:o: |-> Check for valid ifAdminStatus value.
+ */
+ /*
+ * we don't support test
+ */
+ if (ifAdminStatus_val == IFADMINSTATUS_TESTING)
+ return MFD_ERROR;
+
+ return MFD_SUCCESS; /* ifAdminStatus value not illegal */
+} /* ifAdminStatus_check_value */
+
+/**
+ * Save old value information
+ *
+ * @param rowreq_ctx
+ * Pointer to the table context (ifTable_rowreq_ctx)
+ *
+ * @retval MFD_SUCCESS : success
+ * @retval MFD_ERROR : error. set will fail.
+ *
+ * This function will be called after the table level undo setup function
+ * ifTable_undo_setup has been called.
+ *
+ *@note
+ * this function will only be called if a new value is set for this column.
+ *
+ * If there is any setup specific to a particular column (e.g. allocating
+ * memory for a string), you should do that setup in this function, so it
+ * won't be done unless it is necessary.
+ */
+int
+ifAdminStatus_undo_setup(ifTable_rowreq_ctx * rowreq_ctx)
+{
+ DEBUGMSGTL(("verbose:ifTable:ifAdminStatus_undo_setup", "called\n"));
+
+ /** should never get a NULL pointer */
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:455:o: |-> Setup ifAdminStatus undo.
+ */
+ /*
+ * copy ifAdminStatus data
+ * set rowreq_ctx->undo->ifAdminStatus from rowreq_ctx->data.ifAdminStatus
+ */
+ rowreq_ctx->undo->ifAdminStatus = rowreq_ctx->data.ifAdminStatus;
+
+ return MFD_SUCCESS;
+} /* ifAdminStatus_undo_setup */
+
+/**
+ * Set the new value.
+ *
+ * @param rowreq_ctx
+ * Pointer to the users context. You should know how to
+ * manipulate the value from this object.
+ * @param ifAdminStatus_val
+ * A long containing the new value.
+ */
+int
+ifAdminStatus_set(ifTable_rowreq_ctx * rowreq_ctx,
+ u_long ifAdminStatus_val)
+{
+
+ DEBUGMSGTL(("verbose:ifTable:ifAdminStatus_set", "called\n"));
+
+ /** should never get a NULL pointer */
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:461:M: |-> Set ifAdminStatus value.
+ * set ifAdminStatus value in rowreq_ctx->data
+ */
+ rowreq_ctx->data.ifAdminStatus = ifAdminStatus_val;
+
+ return MFD_SUCCESS;
+} /* ifAdminStatus_set */
+
+/**
+ * undo the previous set.
+ *
+ * @param rowreq_ctx
+ * Pointer to the users context.
+ */
+int
+ifAdminStatus_undo(ifTable_rowreq_ctx * rowreq_ctx)
+{
+
+ DEBUGMSGTL(("verbose:ifTable:ifAdminStatus_undo", "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:456:o: |-> Clean up ifAdminStatus undo.
+ */
+ /*
+ * copy ifAdminStatus data
+ * set rowreq_ctx->data.ifAdminStatus from rowreq_ctx->undo->ifAdminStatus
+ */
+ rowreq_ctx->data.ifAdminStatus = rowreq_ctx->undo->ifAdminStatus;
+
+
+ return MFD_SUCCESS;
+} /* ifAdminStatus_undo */
+
+/**
+ * check dependencies
+ *
+ * This is useful for for tables which have dependencies between columns
+ * (or rows, or tables). For example, two columns allocating a percentage
+ * of something add up 100%.
+ *
+ * Should you need different behavior depending on which columns were
+ * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
+ * set. The definitions for the COLUMN_*_FLAG bits can be found in
+ * ifTable.h.
+ * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
+ *
+ * @param rowreq_ctx
+ *
+ * @retval MFD_SUCCESS all the changes to the row are legal
+ * @retval MFD_ERROR one or more changes are not legal
+ *
+ * (see README-table-ifTable if you don't have dependencies)
+ */
+int
+ifTable_check_dependencies(ifTable_rowreq_ctx * rowreq_ctx)
+{
+ int rc = MFD_SUCCESS;
+
+ DEBUGMSGTL(("internal:ifTable:ifTable_check_dependencies",
+ "called\n"));
+
+ netsnmp_assert(NULL != rowreq_ctx);
+
+ /*
+ * TODO:470:o: Check ifTable row dependencies.
+ * check that all new value are legal and consistent with each other
+ */
+ return rc;
+} /* ifTable_check_dependencies */
+
+
+#endif /* !NETSNMP_NO_WRITE_SUPPORT */
+
+static int
+_if_number_handler(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ if (MODE_GET == reqinfo->mode) {
+ int val = ifTable_container_size();
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *) &val, sizeof(val));
+ } else
+ netsnmp_assert("bad mode in RO handler");
+
+ if (handler->next && handler->next->access_method)
+ return netsnmp_call_next_handler(handler, reginfo, reqinfo,
+ requests);
+
+ return SNMP_ERR_NOERROR;
+}
+
+/** @} */
+/** @{ */