ifTable.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:75k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * Note: this file originally auto-generated by mib2c using
  3.  *       version : 1.32 $ of : mfd-top.m2c,v $ 
  4.  *
  5.  * $Id: ifTable.c,v 1.17.2.1 2004/12/10 19:44:55 rstory Exp $
  6.  */
  7. /** mainpage MFD helper for ifTable
  8.  *
  9.  * section intro Introduction
  10.  * Introductory text.
  11.  *
  12.  */
  13. /*
  14.  * standard Net-SNMP includes 
  15.  */
  16. #include <net-snmp/net-snmp-config.h>
  17. #include <net-snmp/net-snmp-includes.h>
  18. #include <net-snmp/agent/net-snmp-agent-includes.h>
  19. /*
  20.  * include our parent header 
  21.  */
  22. #include "ifTable.h"
  23. #include <net-snmp/agent/mib_modules.h>
  24. #include "ifTable_interface.h"
  25. oid             ifTable_oid[] = { IFTABLE_OID };
  26. int             ifTable_oid_size = OID_LENGTH(ifTable_oid);
  27. void            initialize_table_ifTable(void);
  28. /**
  29.  * Initializes the ifTable module
  30.  */
  31. void
  32. init_ifTable(void)
  33. {
  34.     DEBUGMSGTL(("verbose:ifTable:init_ifTable", "calledn"));
  35.     /*
  36.      * TODO:300:o: Perform ifTable one-time module initialization.
  37.      */
  38.     /*
  39.      * here we initialize all the tables we're planning on supporting
  40.      */
  41.     if (should_init("ifTable"))
  42.         initialize_table_ifTable();
  43. }                               /* init_ifTable */
  44. /**
  45.  * Initialize the table ifTable 
  46.  *    (Define its contents and how it's structured)
  47.  */
  48. void
  49. initialize_table_ifTable(void)
  50. {
  51.     ifTable_registration_ptr user_context;
  52.     u_long          flags;
  53.     DEBUGMSGTL(("verbose:ifTable:initialize_table_ifTable", "calledn"));
  54.     /*
  55.      * TODO:301:o: Perform ifTable one-time table initialization.
  56.      */
  57.     /*
  58.      * TODO:302:o: |->Initialize ifTable user context
  59.      * if you'd like to pass in a pointer to some data for this
  60.      * table, allocate or set it up here.
  61.      */
  62.     /*
  63.      * a netsnmp_data_list is a simple way to store void pointers. A simple
  64.      * string token is used to add, find or remove pointers.
  65.      */
  66.     user_context = netsnmp_create_data_list("ifTable", NULL, NULL);
  67.     /*
  68.      * No support for any flags yet, but in the future you would
  69.      * set any flags here.
  70.      */
  71.     flags = 0;
  72.     /*
  73.      * call interface initialization code
  74.      */
  75.     _ifTable_initialize_interface(user_context, flags);
  76. }                               /* initialize_table_ifTable */
  77. /**
  78.  * extra context initialization
  79.  *
  80.  * @param rowreq_ctx    : row request context
  81.  * @param user_init_ctx : void pointer for user (parameter to rowreq_ctx_allocate)
  82.  *
  83.  * @retval MFD_SUCCESS  : no errors
  84.  * @retval MFD_ERROR    : error (context allocate will fail)
  85.  */
  86. int
  87. ifTable_rowreq_ctx_init(ifTable_rowreq_ctx * rowreq_ctx,
  88.                         void *user_init_ctx)
  89. {
  90.     DEBUGMSGTL(("verbose:ifTable:ifTable_rowreq_ctx_init", "calledn"));
  91.     netsnmp_assert(NULL != rowreq_ctx);
  92.     /*
  93.      * TODO:210:o: |-> Perform extra ifTable rowreq initialization.
  94.      */
  95.     if (NULL == user_init_ctx)
  96.         rowreq_ctx->data.ifentry =
  97.             netsnmp_access_interface_entry_create(NULL,0);
  98.     else
  99.         rowreq_ctx->data.ifentry =
  100.             (netsnmp_interface_entry *) user_init_ctx;
  101.     return MFD_SUCCESS;
  102. }                               /* ifTable_rowreq_ctx_init */
  103. /**
  104.  * extra context cleanup
  105.  *
  106.  */
  107. void
  108. ifTable_rowreq_ctx_cleanup(ifTable_rowreq_ctx * rowreq_ctx)
  109. {
  110.     DEBUGMSGTL(("verbose:ifTable:ifTable_rowreq_ctx_cleanup", "calledn"));
  111.     netsnmp_assert(NULL != rowreq_ctx);
  112.     /*
  113.      * TODO:211:o: |-> Perform extra ifTable rowreq cleanup.
  114.      */
  115.     if (NULL != rowreq_ctx->data.ifentry) {
  116.         netsnmp_access_interface_entry_free(rowreq_ctx->data.ifentry);
  117.         rowreq_ctx->data.ifentry = NULL;
  118.     }
  119. }                               /* ifTable_rowreq_ctx_cleanup */
  120. /**
  121.  * pre-request callback
  122.  *
  123.  *
  124.  * @retval MFD_SUCCESS              : success.
  125.  * @retval MFD_ERROR                : other error
  126.  */
  127. int
  128. ifTable_pre_request(ifTable_registration_ptr user_context)
  129. {
  130.     DEBUGMSGTL(("verbose:ifTable:ifTable_pre_request", "calledn"));
  131.     /*
  132.      * TODO:510:o: Perform ifTable pre-request actions.
  133.      */
  134.     return MFD_SUCCESS;
  135. }                               /* ifTable_pre_request */
  136. /**
  137.  * post-request callback
  138.  *
  139.  *
  140.  * @retval MFD_SUCCESS : success.
  141.  * @retval MFD_ERROR   : other error (ignored)
  142.  */
  143. int
  144. ifTable_post_request(ifTable_registration_ptr user_context)
  145. {
  146.     DEBUGMSGTL(("verbose:ifTable:ifTable_post_request", "calledn"));
  147.     /*
  148.      * TODO:511:o: Perform ifTable pos-request actions.
  149.      */
  150.     return MFD_SUCCESS;
  151. }                               /* ifTable_post_request */
  152. /**********************************************************************
  153.  **********************************************************************
  154.  ***
  155.  *** Table ifTable
  156.  ***
  157.  **********************************************************************
  158.  **********************************************************************/
  159. /*
  160.  * ifTable is subid 2 of interfaces.
  161.  * Its status is Current.
  162.  * OID: .1.3.6.1.2.1.2.2, length: 8
  163.  */
  164. /**
  165.  * set mib index(es)
  166.  *
  167.  * @param tbl_idx mib index structure
  168.  *
  169.  * @retval MFD_SUCCESS     : success.
  170.  * @retval MFD_ERROR       : other error.
  171.  *
  172.  * @remark
  173.  *  This convenience function is useful for setting all the MIB index
  174.  *  components with a single function call. It is assume that the C values
  175.  *  have already been mapped from their native/rawformat to the MIB format.
  176.  */
  177. int
  178. ifTable_indexes_set_tbl_idx(ifTable_mib_index * tbl_idx, long ifIndex_val)
  179. {
  180.     DEBUGMSGTL(("verbose:ifTable:ifTable_indexes_set_tbl_idx",
  181.                 "calledn"));
  182.     /*
  183.      * ifIndex(1)/InterfaceIndex/ASN_INTEGER/long(long)//l/A/w/e/R/d/H 
  184.      */
  185.     tbl_idx->ifIndex = ifIndex_val;
  186.     return MFD_SUCCESS;
  187. }                               /* ifTable_indexes_set_tbl_idx */
  188. /**
  189.  * @internal
  190.  * set row context indexes
  191.  *
  192.  * @param reqreq_ctx the row context that needs updated indexes
  193.  *
  194.  * @retval MFD_SUCCESS     : success.
  195.  * @retval MFD_ERROR       : other error.
  196.  *
  197.  * @remark
  198.  *  This function sets the mib indexs, then updates the oid indexs
  199.  *  from the mib index.
  200.  */
  201. int
  202. ifTable_indexes_set(ifTable_rowreq_ctx * rowreq_ctx, long ifIndex_val)
  203. {
  204.     DEBUGMSGTL(("verbose:ifTable:ifTable_indexes_set", "calledn"));
  205.     if (MFD_SUCCESS !=
  206.         ifTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx, ifIndex_val))
  207.         return MFD_ERROR;
  208.     /*
  209.      * convert mib index to oid index
  210.      */
  211.     rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
  212.     if (0 != ifTable_index_to_oid(&rowreq_ctx->oid_idx,
  213.                                   &rowreq_ctx->tbl_idx)) {
  214.         return MFD_ERROR;
  215.     }
  216.     return MFD_SUCCESS;
  217. }                               /* ifTable_indexes_set */
  218. /*---------------------------------------------------------------------
  219.  * IF-MIB::ifEntry.ifDescr
  220.  * ifDescr is subid 2 of ifEntry.
  221.  * Its status is Current, and its access level is ReadOnly.
  222.  * OID: .1.3.6.1.2.1.2.2.1.2
  223.  * Description:
  224. A textual string containing information about the
  225.             interface.  This string should include the name of the
  226.             manufacturer, the product name and the version of the
  227.             interface hardware/software.
  228.  *
  229.  * Attributes:
  230.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  231.  *   readable   1     iscolumn 1     ranges 1      hashint   1
  232.  *   settable   0
  233.  *   hint: 255a
  234.  *
  235.  * Ranges:  0 - 255;
  236.  *
  237.  * Its syntax is DisplayString (based on perltype OCTETSTR)
  238.  * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
  239.  * This data type requires a length.  (Max 255)
  240.  */
  241. /**
  242.  * Extract the current value of the ifDescr data.
  243.  *
  244.  * Set a value using the data context for the row.
  245.  *
  246.  * @param rowreq_ctx
  247.  *        Pointer to the row request context.
  248.  * @param ifDescr_val_ptr_ptr
  249.  *        Pointer to storage for a char variable
  250.  * @param ifDescr_val_ptr_len_ptr
  251.  *        Pointer to a size_t. On entry, it will contain the size (in bytes)
  252.  *        pointed to by ifDescr.
  253.  *        On exit, this value should contain the data size (in bytes).
  254.  *
  255.  * @retval MFD_SUCCESS         : success
  256.  * @retval MFD_SKIP            : skip this node (no value for now)
  257.  * @retval MFD_ERROR           : Any other error
  258. *
  259.  * @note If you need more than (*ifDescr_val_ptr_len_ptr) bytes of memory,
  260.  *       allocate it using malloc() and update ifDescr_val_ptr_ptr.
  261.  *       <b>DO NOT</b> free the previous pointer.
  262.  *       The MFD helper will release the memory you allocate.
  263.  *
  264.  * @remark If you call this function yourself, you are responsible
  265.  *         for checking if the pointer changed, and freeing any
  266.  *         previously allocated memory. (Not necessary if you pass
  267.  *         in a pointer to static memory, obviously.)
  268.  */
  269. int
  270. ifDescr_get(ifTable_rowreq_ctx * rowreq_ctx, char **ifDescr_val_ptr_ptr,
  271.             size_t *ifDescr_val_ptr_len_ptr)
  272. {
  273.     char           *tmp_descr = NULL;
  274.     u_char          tmp_len = 0;
  275.    /** we should have a non-NULL pointer and enough storage */
  276.     netsnmp_assert((NULL != ifDescr_val_ptr_ptr)
  277.                    && (NULL != *ifDescr_val_ptr_ptr));
  278.     netsnmp_assert(NULL != ifDescr_val_ptr_len_ptr);
  279.     DEBUGMSGTL(("verbose:ifTable:ifDescr_get", "calledn"));
  280.     netsnmp_assert(NULL != rowreq_ctx);
  281.     /*
  282.      * if ifDescr is NULL, use the ifName
  283.      */
  284.     if (NULL == rowreq_ctx->data.ifDescr) {
  285. #ifdef USING_IF_MIB_IFXTABLE_IFXTABLE_MODULE
  286.         tmp_descr = rowreq_ctx->data.ifName;
  287. #else
  288.         tmp_descr = NULL;
  289. #endif
  290.     } else
  291.         tmp_descr = rowreq_ctx->data.ifDescr;
  292.     if (NULL != tmp_descr)
  293.         tmp_len = strlen(tmp_descr);
  294.     else
  295.         tmp_len = 0;
  296.     /*
  297.      * TODO:231:o: |-> Extract the current value of the ifDescr data.
  298.      * set (* ifDescr_val_ptr_ptr ) and (* ifDescr_val_ptr_len_ptr ) from rowreq_ctx->data
  299.      */
  300.     /*
  301.      * make sure there is enough space for ifDescr data
  302.      */
  303.     if ((NULL == (*ifDescr_val_ptr_ptr))
  304.         || ((*ifDescr_val_ptr_len_ptr) < tmp_len)) {
  305.         /*
  306.          * allocate space for ifDescr data
  307.          */
  308.         (*ifDescr_val_ptr_ptr) =
  309.             malloc(tmp_len * sizeof((*ifDescr_val_ptr_ptr)[0]));
  310.         if (NULL == (*ifDescr_val_ptr_ptr)) {
  311.             snmp_log(LOG_ERR, "could not allocate memoryn");
  312.             return MFD_ERROR;
  313.         }
  314.     }
  315.     (*ifDescr_val_ptr_len_ptr) = tmp_len;
  316.     memcpy((*ifDescr_val_ptr_ptr), tmp_descr,
  317.            (*ifDescr_val_ptr_len_ptr) * sizeof((*ifDescr_val_ptr_ptr)[0]));
  318.     return MFD_SUCCESS;
  319. }                               /* ifDescr_get */
  320. /*---------------------------------------------------------------------
  321.  * IF-MIB::ifEntry.ifType
  322.  * ifType is subid 3 of ifEntry.
  323.  * Its status is Current, and its access level is ReadOnly.
  324.  * OID: .1.3.6.1.2.1.2.2.1.3
  325.  * Description:
  326. The type of interface.  Additional values for ifType are
  327.             assigned by the Internet Assigned Numbers Authority (IANA),
  328.             through updating the syntax of the IANAifType textual
  329.             convention.
  330.  *
  331.  * Attributes:
  332.  *   accessible 1     isscalar 0     enums  1      hasdefval 0
  333.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  334.  *   settable   0
  335.  *
  336.  * 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)
  337.  *
  338.  * Its syntax is IANAifType (based on perltype INTEGER)
  339.  * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
  340.  */
  341. /**
  342.  * Extract the current value of the ifType data.
  343.  *
  344.  * Set a value using the data context for the row.
  345.  *
  346.  * @param rowreq_ctx
  347.  *        Pointer to the row request context.
  348.  * @param ifType_val_ptr
  349.  *        Pointer to storage for a long variable
  350.  *
  351.  * @retval MFD_SUCCESS         : success
  352.  * @retval MFD_SKIP            : skip this node (no value for now)
  353.  * @retval MFD_ERROR           : Any other error
  354.  */
  355. int
  356. ifType_get(ifTable_rowreq_ctx * rowreq_ctx, u_long * ifType_val_ptr)
  357. {
  358.    /** we should have a non-NULL pointer */
  359.     netsnmp_assert(NULL != ifType_val_ptr);
  360.     DEBUGMSGTL(("verbose:ifTable:ifType_get", "calledn"));
  361.     netsnmp_assert(NULL != rowreq_ctx);
  362.     /*
  363.      * TODO:231:o: |-> Extract the current value of the ifType data.
  364.      * set (* ifType_val_ptr ) from rowreq_ctx->data
  365.      */
  366.     (*ifType_val_ptr) = rowreq_ctx->data.ifType;
  367.     return MFD_SUCCESS;
  368. }                               /* ifType_get */
  369. /*---------------------------------------------------------------------
  370.  * IF-MIB::ifEntry.ifMtu
  371.  * ifMtu is subid 4 of ifEntry.
  372.  * Its status is Current, and its access level is ReadOnly.
  373.  * OID: .1.3.6.1.2.1.2.2.1.4
  374.  * Description:
  375. The size of the largest packet which can be sent/received
  376.             on the interface, specified in octets.  For interfaces that
  377.             are used for transmitting network datagrams, this is the
  378.             size of the largest network datagram that can be sent on the
  379.             interface.
  380.  *
  381.  * Attributes:
  382.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  383.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  384.  *   settable   0
  385.  *
  386.  *
  387.  * Its syntax is INTEGER32 (based on perltype INTEGER32)
  388.  * The net-snmp type is ASN_INTEGER. The C type decl is long (long)
  389.  */
  390. /**
  391.  * Extract the current value of the ifMtu data.
  392.  *
  393.  * Set a value using the data context for the row.
  394.  *
  395.  * @param rowreq_ctx
  396.  *        Pointer to the row request context.
  397.  * @param ifMtu_val_ptr
  398.  *        Pointer to storage for a long variable
  399.  *
  400.  * @retval MFD_SUCCESS         : success
  401.  * @retval MFD_SKIP            : skip this node (no value for now)
  402.  * @retval MFD_ERROR           : Any other error
  403.  */
  404. int
  405. ifMtu_get(ifTable_rowreq_ctx * rowreq_ctx, long *ifMtu_val_ptr)
  406. {
  407.    /** we should have a non-NULL pointer */
  408.     netsnmp_assert(NULL != ifMtu_val_ptr);
  409.     DEBUGMSGTL(("verbose:ifTable:ifMtu_get", "calledn"));
  410.     netsnmp_assert(NULL != rowreq_ctx);
  411.     /*
  412.      * TODO:231:o: |-> Extract the current value of the ifMtu data.
  413.      * set (* ifMtu_val_ptr ) from rowreq_ctx->data
  414.      */
  415.     (*ifMtu_val_ptr) = rowreq_ctx->data.ifMtu;
  416.     return MFD_SUCCESS;
  417. }                               /* ifMtu_get */
  418. /*---------------------------------------------------------------------
  419.  * IF-MIB::ifEntry.ifSpeed
  420.  * ifSpeed is subid 5 of ifEntry.
  421.  * Its status is Current, and its access level is ReadOnly.
  422.  * OID: .1.3.6.1.2.1.2.2.1.5
  423.  * Description:
  424. An estimate of the interface's current bandwidth in bits
  425.             per second.  For interfaces which do not vary in bandwidth
  426.             or for those where no accurate estimation can be made, this
  427.             object should contain the nominal bandwidth.  If the
  428.             bandwidth of the interface is greater than the maximum value
  429.             reportable by this object then this object should report its
  430.             maximum value (4,294,967,295) and ifHighSpeed must be used
  431.             to report the interace's speed.  For a sub-layer which has
  432.             no concept of bandwidth, this object should be zero.
  433.  *
  434.  * Attributes:
  435.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  436.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  437.  *   settable   0
  438.  *
  439.  *
  440.  * Its syntax is GAUGE (based on perltype GAUGE)
  441.  * The net-snmp type is ASN_GAUGE. The C type decl is u_long (u_long)
  442.  */
  443. /**
  444.  * Extract the current value of the ifSpeed data.
  445.  *
  446.  * Set a value using the data context for the row.
  447.  *
  448.  * @param rowreq_ctx
  449.  *        Pointer to the row request context.
  450.  * @param ifSpeed_val_ptr
  451.  *        Pointer to storage for a u_long variable
  452.  *
  453.  * @retval MFD_SUCCESS         : success
  454.  * @retval MFD_SKIP            : skip this node (no value for now)
  455.  * @retval MFD_ERROR           : Any other error
  456.  */
  457. int
  458. ifSpeed_get(ifTable_rowreq_ctx * rowreq_ctx, u_long * ifSpeed_val_ptr)
  459. {
  460.    /** we should have a non-NULL pointer */
  461.     netsnmp_assert(NULL != ifSpeed_val_ptr);
  462.     DEBUGMSGTL(("verbose:ifTable:ifSpeed_get", "calledn"));
  463.     netsnmp_assert(NULL != rowreq_ctx);
  464.     /*
  465.      * TODO:231:o: |-> Extract the current value of the ifSpeed data.
  466.      * set (* ifSpeed_val_ptr ) from rowreq_ctx->data
  467.      */
  468.     (*ifSpeed_val_ptr) = rowreq_ctx->data.ifSpeed;
  469.     return MFD_SUCCESS;
  470. }                               /* ifSpeed_get */
  471. /*---------------------------------------------------------------------
  472.  * IF-MIB::ifEntry.ifPhysAddress
  473.  * ifPhysAddress is subid 6 of ifEntry.
  474.  * Its status is Current, and its access level is ReadOnly.
  475.  * OID: .1.3.6.1.2.1.2.2.1.6
  476.  * Description:
  477. The interface's address at its protocol sub-layer.  For
  478.             example, for an 802.x interface, this object normally
  479.             contains a MAC address.  The interface's media-specific MIB
  480.             must define the bit and byte ordering and the format of the
  481.             value of this object.  For interfaces which do not have such
  482.             an address (e.g., a serial line), this object should contain
  483.             an octet string of zero length.
  484.  *
  485.  * Attributes:
  486.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  487.  *   readable   1     iscolumn 1     ranges 0      hashint   1
  488.  *   settable   0
  489.  *   hint: 1x:
  490.  *
  491.  *
  492.  * Its syntax is PhysAddress (based on perltype OCTETSTR)
  493.  * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
  494.  * This data type requires a length.  (Max 255)
  495.  */
  496. /**
  497.  * Extract the current value of the ifPhysAddress data.
  498.  *
  499.  * Set a value using the data context for the row.
  500.  *
  501.  * @param rowreq_ctx
  502.  *        Pointer to the row request context.
  503.  * @param ifPhysAddress_val_ptr_ptr
  504.  *        Pointer to storage for a char variable
  505.  * @param ifPhysAddress_val_ptr_len_ptr
  506.  *        Pointer to a size_t. On entry, it will contain the size (in bytes)
  507.  *        pointed to by ifPhysAddress.
  508.  *        On exit, this value should contain the data size (in bytes).
  509.  *
  510.  * @retval MFD_SUCCESS         : success
  511.  * @retval MFD_SKIP            : skip this node (no value for now)
  512.  * @retval MFD_ERROR           : Any other error
  513. *
  514.  * @note If you need more than (*ifPhysAddress_val_ptr_len_ptr) bytes of memory,
  515.  *       allocate it using malloc() and update ifPhysAddress_val_ptr_ptr.
  516.  *       <b>DO NOT</b> free the previous pointer.
  517.  *       The MFD helper will release the memory you allocate.
  518.  *
  519.  * @remark If you call this function yourself, you are responsible
  520.  *         for checking if the pointer changed, and freeing any
  521.  *         previously allocated memory. (Not necessary if you pass
  522.  *         in a pointer to static memory, obviously.)
  523.  */
  524. int
  525. ifPhysAddress_get(ifTable_rowreq_ctx * rowreq_ctx,
  526.                   char **ifPhysAddress_val_ptr_ptr,
  527.                   size_t *ifPhysAddress_val_ptr_len_ptr)
  528. {
  529.    /** we should have a non-NULL pointer and enough storage */
  530.     netsnmp_assert((NULL != ifPhysAddress_val_ptr_ptr)
  531.                    && (NULL != *ifPhysAddress_val_ptr_ptr));
  532.     netsnmp_assert(NULL != ifPhysAddress_val_ptr_len_ptr);
  533.     DEBUGMSGTL(("verbose:ifTable:ifPhysAddress_get", "calledn"));
  534.     netsnmp_assert(NULL != rowreq_ctx);
  535.     if ((rowreq_ctx->data.ifPhysAddress[0] == 0) &&
  536.         (rowreq_ctx->data.ifPhysAddress[1] == 0) &&
  537.         (rowreq_ctx->data.ifPhysAddress[2] == 0) &&
  538.         (rowreq_ctx->data.ifPhysAddress[3] == 0) &&
  539.         (rowreq_ctx->data.ifPhysAddress[4] == 0) &&
  540.         (rowreq_ctx->data.ifPhysAddress[5] == 0)) {
  541.         /*
  542.          * all 0s = empty string
  543.          */
  544.         (*ifPhysAddress_val_ptr_len_ptr) = 0;
  545.         return MFD_SUCCESS;
  546.     }
  547.     /*
  548.      * TODO:231:o: |-> Extract the current value of the ifPhysAddress data.
  549.      * set (* ifPhysAddress_val_ptr_ptr ) and (* ifPhysAddress_val_ptr_len_ptr ) from rowreq_ctx->data
  550.      */
  551.     /*
  552.      * make sure there is enough space for ifPhysAddress data
  553.      */
  554.     if ((NULL == (*ifPhysAddress_val_ptr_ptr))
  555.         || ((*ifPhysAddress_val_ptr_len_ptr) <
  556.             rowreq_ctx->data.ifPhysAddress_len)) {
  557.         /*
  558.          * allocate space for ifPhysAddress data
  559.          */
  560.         (*ifPhysAddress_val_ptr_ptr) =
  561.             malloc(rowreq_ctx->data.ifPhysAddress_len *
  562.                    sizeof((*ifPhysAddress_val_ptr_ptr)[0]));
  563.         if (NULL == (*ifPhysAddress_val_ptr_ptr)) {
  564.             snmp_log(LOG_ERR, "could not allocate memoryn");
  565.             return MFD_ERROR;
  566.         }
  567.     }
  568.     (*ifPhysAddress_val_ptr_len_ptr) = rowreq_ctx->data.ifPhysAddress_len;
  569.     memcpy((*ifPhysAddress_val_ptr_ptr), rowreq_ctx->data.ifPhysAddress,
  570.            (*ifPhysAddress_val_ptr_len_ptr) *
  571.            sizeof((*ifPhysAddress_val_ptr_ptr)[0]));
  572.     return MFD_SUCCESS;
  573. }                               /* ifPhysAddress_get */
  574. /*---------------------------------------------------------------------
  575.  * IF-MIB::ifEntry.ifAdminStatus
  576.  * ifAdminStatus is subid 7 of ifEntry.
  577.  * Its status is Current, and its access level is ReadWrite.
  578.  * OID: .1.3.6.1.2.1.2.2.1.7
  579.  * Description:
  580. The desired state of the interface.  The testing(3) state
  581.             indicates that no operational packets can be passed.  When a
  582.             managed system initializes, all interfaces start with
  583.             ifAdminStatus in the down(2) state.  As a result of either
  584.             explicit management action or per configuration information
  585.             retained by the managed system, ifAdminStatus is then
  586.             changed to either the up(1) or testing(3) states (or remains
  587.             in the down(2) state).
  588.  *
  589.  * Attributes:
  590.  *   accessible 1     isscalar 0     enums  1      hasdefval 0
  591.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  592.  *   settable   1
  593.  *
  594.  * Enum range: 2/8. Values:  up(1), down(2), testing(3)
  595.  *
  596.  * Its syntax is INTEGER (based on perltype INTEGER)
  597.  * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
  598.  */
  599. /**
  600.  * Extract the current value of the ifAdminStatus data.
  601.  *
  602.  * Set a value using the data context for the row.
  603.  *
  604.  * @param rowreq_ctx
  605.  *        Pointer to the row request context.
  606.  * @param ifAdminStatus_val_ptr
  607.  *        Pointer to storage for a long variable
  608.  *
  609.  * @retval MFD_SUCCESS         : success
  610.  * @retval MFD_SKIP            : skip this node (no value for now)
  611.  * @retval MFD_ERROR           : Any other error
  612.  */
  613. int
  614. ifAdminStatus_get(ifTable_rowreq_ctx * rowreq_ctx,
  615.                   u_long * ifAdminStatus_val_ptr)
  616. {
  617.    /** we should have a non-NULL pointer */
  618.     netsnmp_assert(NULL != ifAdminStatus_val_ptr);
  619.     DEBUGMSGTL(("verbose:ifTable:ifAdminStatus_get", "calledn"));
  620.     netsnmp_assert(NULL != rowreq_ctx);
  621.     /*
  622.      * TODO:231:o: |-> Extract the current value of the ifAdminStatus data.
  623.      * set (* ifAdminStatus_val_ptr ) from rowreq_ctx->data
  624.      */
  625.     (*ifAdminStatus_val_ptr) = rowreq_ctx->data.ifAdminStatus;
  626.     return MFD_SUCCESS;
  627. }                               /* ifAdminStatus_get */
  628. /*---------------------------------------------------------------------
  629.  * IF-MIB::ifEntry.ifOperStatus
  630.  * ifOperStatus is subid 8 of ifEntry.
  631.  * Its status is Current, and its access level is ReadOnly.
  632.  * OID: .1.3.6.1.2.1.2.2.1.8
  633.  * Description:
  634. The current operational state of the interface.  The
  635.             testing(3) state indicates that no operational packets can
  636.             be passed.  If ifAdminStatus is down(2) then ifOperStatus
  637.             should be down(2).  If ifAdminStatus is changed to up(1)
  638.             then ifOperStatus should change to up(1) if the interface is
  639.             ready to transmit and receive network traffic; it should
  640.             change to dormant(5) if the interface is waiting for
  641.             external actions (such as a serial line waiting for an
  642.             incoming connection); it should remain in the down(2) state
  643.             if and only if there is a fault that prevents it from going
  644.             to the up(1) state; it should remain in the notPresent(6)
  645.             state if the interface has missing (typically, hardware)
  646.             components.
  647.  *
  648.  * Attributes:
  649.  *   accessible 1     isscalar 0     enums  1      hasdefval 0
  650.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  651.  *   settable   0
  652.  *
  653.  * Enum range: 5/8. Values:  up(1), down(2), testing(3), unknown(4), dormant(5), notPresent(6), lowerLayerDown(7)
  654.  *
  655.  * Its syntax is INTEGER (based on perltype INTEGER)
  656.  * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
  657.  */
  658. /**
  659.  * Extract the current value of the ifOperStatus data.
  660.  *
  661.  * Set a value using the data context for the row.
  662.  *
  663.  * @param rowreq_ctx
  664.  *        Pointer to the row request context.
  665.  * @param ifOperStatus_val_ptr
  666.  *        Pointer to storage for a long variable
  667.  *
  668.  * @retval MFD_SUCCESS         : success
  669.  * @retval MFD_SKIP            : skip this node (no value for now)
  670.  * @retval MFD_ERROR           : Any other error
  671.  */
  672. int
  673. ifOperStatus_get(ifTable_rowreq_ctx * rowreq_ctx,
  674.                  u_long * ifOperStatus_val_ptr)
  675. {
  676.    /** we should have a non-NULL pointer */
  677.     netsnmp_assert(NULL != ifOperStatus_val_ptr);
  678.     DEBUGMSGTL(("verbose:ifTable:ifOperStatus_get", "calledn"));
  679.     netsnmp_assert(NULL != rowreq_ctx);
  680.     /*
  681.      * TODO:231:o: |-> Extract the current value of the ifOperStatus data.
  682.      * set (* ifOperStatus_val_ptr ) from rowreq_ctx->data
  683.      */
  684.     (*ifOperStatus_val_ptr) = rowreq_ctx->data.ifOperStatus;
  685.     return MFD_SUCCESS;
  686. }                               /* ifOperStatus_get */
  687. /*---------------------------------------------------------------------
  688.  * IF-MIB::ifEntry.ifLastChange
  689.  * ifLastChange is subid 9 of ifEntry.
  690.  * Its status is Current, and its access level is ReadOnly.
  691.  * OID: .1.3.6.1.2.1.2.2.1.9
  692.  * Description:
  693. The value of sysUpTime at the time the interface entered
  694.             its current operational state.  If the current state was
  695.             entered prior to the last re-initialization of the local
  696.             network management subsystem, then this object contains a
  697.             zero value.
  698.  *
  699.  * Attributes:
  700.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  701.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  702.  *   settable   0
  703.  *
  704.  *
  705.  * Its syntax is TICKS (based on perltype TICKS)
  706.  * The net-snmp type is ASN_TIMETICKS. The C type decl is u_long (u_long)
  707.  */
  708. /**
  709.  * Extract the current value of the ifLastChange data.
  710.  *
  711.  * Set a value using the data context for the row.
  712.  *
  713.  * @param rowreq_ctx
  714.  *        Pointer to the row request context.
  715.  * @param ifLastChange_val_ptr
  716.  *        Pointer to storage for a u_long variable
  717.  *
  718.  * @retval MFD_SUCCESS         : success
  719.  * @retval MFD_SKIP            : skip this node (no value for now)
  720.  * @retval MFD_ERROR           : Any other error
  721.  */
  722. int
  723. ifLastChange_get(ifTable_rowreq_ctx * rowreq_ctx,
  724.                  u_long * ifLastChange_val_ptr)
  725. {
  726.    /** we should have a non-NULL pointer */
  727.     netsnmp_assert(NULL != ifLastChange_val_ptr);
  728.     DEBUGMSGTL(("verbose:ifTable:ifLastChange_get", "calledn"));
  729.     netsnmp_assert(NULL != rowreq_ctx);
  730.     /*
  731.      * TODO:231:o: |-> Extract the current value of the ifLastChange data.
  732.      * set (* ifLastChange_val_ptr ) from rowreq_ctx->data
  733.      */
  734.     (*ifLastChange_val_ptr) = rowreq_ctx->data.ifLastChange;
  735.     return MFD_SUCCESS;
  736. }                               /* ifLastChange_get */
  737. /*---------------------------------------------------------------------
  738.  * IF-MIB::ifEntry.ifInOctets
  739.  * ifInOctets is subid 10 of ifEntry.
  740.  * Its status is Current, and its access level is ReadOnly.
  741.  * OID: .1.3.6.1.2.1.2.2.1.10
  742.  * Description:
  743. The total number of octets received on the interface,
  744.             including framing characters.
  745.             Discontinuities in the value of this counter can occur at
  746.             re-initialization of the management system, and at other
  747.             times as indicated by the value of
  748.             ifCounterDiscontinuityTime.
  749.  *
  750.  * Attributes:
  751.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  752.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  753.  *   settable   0
  754.  *
  755.  *
  756.  * Its syntax is COUNTER (based on perltype COUNTER)
  757.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  758.  */
  759. /**
  760.  * Extract the current value of the ifInOctets data.
  761.  *
  762.  * Set a value using the data context for the row.
  763.  *
  764.  * @param rowreq_ctx
  765.  *        Pointer to the row request context.
  766.  * @param ifInOctets_val_ptr
  767.  *        Pointer to storage for a u_long variable
  768.  *
  769.  * @retval MFD_SUCCESS         : success
  770.  * @retval MFD_SKIP            : skip this node (no value for now)
  771.  * @retval MFD_ERROR           : Any other error
  772.  */
  773. int
  774. ifInOctets_get(ifTable_rowreq_ctx * rowreq_ctx,
  775.                u_long * ifInOctets_val_ptr)
  776. {
  777.    /** we should have a non-NULL pointer */
  778.     netsnmp_assert(NULL != ifInOctets_val_ptr);
  779.     DEBUGMSGTL(("verbose:ifTable:ifInOctets_get", "calledn"));
  780.     netsnmp_assert(NULL != rowreq_ctx);
  781.     /*
  782.      * TODO:231:o: |-> Extract the current value of the ifInOctets data.
  783.      * set (* ifInOctets_val_ptr ) from rowreq_ctx->data
  784.      */
  785.     (*ifInOctets_val_ptr) = rowreq_ctx->data.ifInOctets;
  786.     return MFD_SUCCESS;
  787. }                               /* ifInOctets_get */
  788. /*---------------------------------------------------------------------
  789.  * IF-MIB::ifEntry.ifInUcastPkts
  790.  * ifInUcastPkts is subid 11 of ifEntry.
  791.  * Its status is Current, and its access level is ReadOnly.
  792.  * OID: .1.3.6.1.2.1.2.2.1.11
  793.  * Description:
  794. The number of packets, delivered by this sub-layer to a
  795.             higher (sub-)layer, which were not addressed to a multicast
  796.             or broadcast address at this sub-layer.
  797.             Discontinuities in the value of this counter can occur at
  798.             re-initialization of the management system, and at other
  799.             times as indicated by the value of
  800.             ifCounterDiscontinuityTime.
  801.  *
  802.  * Attributes:
  803.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  804.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  805.  *   settable   0
  806.  *
  807.  *
  808.  * Its syntax is COUNTER (based on perltype COUNTER)
  809.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  810.  */
  811. /**
  812.  * Extract the current value of the ifInUcastPkts data.
  813.  *
  814.  * Set a value using the data context for the row.
  815.  *
  816.  * @param rowreq_ctx
  817.  *        Pointer to the row request context.
  818.  * @param ifInUcastPkts_val_ptr
  819.  *        Pointer to storage for a u_long variable
  820.  *
  821.  * @retval MFD_SUCCESS         : success
  822.  * @retval MFD_SKIP            : skip this node (no value for now)
  823.  * @retval MFD_ERROR           : Any other error
  824.  */
  825. int
  826. ifInUcastPkts_get(ifTable_rowreq_ctx * rowreq_ctx,
  827.                   u_long * ifInUcastPkts_val_ptr)
  828. {
  829.    /** we should have a non-NULL pointer */
  830.     netsnmp_assert(NULL != ifInUcastPkts_val_ptr);
  831.     DEBUGMSGTL(("verbose:ifTable:ifInUcastPkts_get", "calledn"));
  832.     netsnmp_assert(NULL != rowreq_ctx);
  833.     /*
  834.      * TODO:231:o: |-> Extract the current value of the ifInUcastPkts data.
  835.      * set (* ifInUcastPkts_val_ptr ) from rowreq_ctx->data
  836.      */
  837.     (*ifInUcastPkts_val_ptr) = rowreq_ctx->data.ifInUcastPkts;
  838.     return MFD_SUCCESS;
  839. }                               /* ifInUcastPkts_get */
  840. /*---------------------------------------------------------------------
  841.  * IF-MIB::ifEntry.ifInNUcastPkts
  842.  * ifInNUcastPkts is subid 12 of ifEntry.
  843.  * Its status is Deprecated, and its access level is ReadOnly.
  844.  * OID: .1.3.6.1.2.1.2.2.1.12
  845.  * Description:
  846. The number of packets, delivered by this sub-layer to a
  847.             higher (sub-)layer, which were addressed to a multicast or
  848.             broadcast address at this sub-layer.
  849.             Discontinuities in the value of this counter can occur at
  850.             re-initialization of the management system, and at other
  851.             times as indicated by the value of
  852.             ifCounterDiscontinuityTime.
  853.             This object is deprecated in favour of ifInMulticastPkts and
  854.             ifInBroadcastPkts.
  855.  *
  856.  * Attributes:
  857.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  858.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  859.  *   settable   0
  860.  *
  861.  *
  862.  * Its syntax is COUNTER (based on perltype COUNTER)
  863.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  864.  */
  865. /**
  866.  * Extract the current value of the ifInNUcastPkts data.
  867.  *
  868.  * Set a value using the data context for the row.
  869.  *
  870.  * @param rowreq_ctx
  871.  *        Pointer to the row request context.
  872.  * @param ifInNUcastPkts_val_ptr
  873.  *        Pointer to storage for a u_long variable
  874.  *
  875.  * @retval MFD_SUCCESS         : success
  876.  * @retval MFD_SKIP            : skip this node (no value for now)
  877.  * @retval MFD_ERROR           : Any other error
  878.  */
  879. int
  880. ifInNUcastPkts_get(ifTable_rowreq_ctx * rowreq_ctx,
  881.                    u_long * ifInNUcastPkts_val_ptr)
  882. {
  883.    /** we should have a non-NULL pointer */
  884.     netsnmp_assert(NULL != ifInNUcastPkts_val_ptr);
  885.     DEBUGMSGTL(("verbose:ifTable:ifInNUcastPkts_get", "calledn"));
  886.     netsnmp_assert(NULL != rowreq_ctx);
  887.     /*
  888.      * TODO:231:o: |-> Extract the current value of the ifInNUcastPkts data.
  889.      * set (* ifInNUcastPkts_val_ptr ) from rowreq_ctx->data
  890.      */
  891.     (*ifInNUcastPkts_val_ptr) = rowreq_ctx->data.ifInNUcastPkts;
  892.     return MFD_SUCCESS;
  893. }                               /* ifInNUcastPkts_get */
  894. /*---------------------------------------------------------------------
  895.  * IF-MIB::ifEntry.ifInDiscards
  896.  * ifInDiscards is subid 13 of ifEntry.
  897.  * Its status is Current, and its access level is ReadOnly.
  898.  * OID: .1.3.6.1.2.1.2.2.1.13
  899.  * Description:
  900. The number of inbound packets which were chosen to be
  901.             discarded even though no errors had been detected to prevent
  902.             their being deliverable to a higher-layer protocol.  One
  903.             possible reason for discarding such a packet could be to
  904.             free up buffer space.
  905.             Discontinuities in the value of this counter can occur at
  906.             re-initialization of the management system, and at other
  907.             times as indicated by the value of
  908.             ifCounterDiscontinuityTime.
  909.  *
  910.  * Attributes:
  911.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  912.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  913.  *   settable   0
  914.  *
  915.  *
  916.  * Its syntax is COUNTER (based on perltype COUNTER)
  917.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  918.  */
  919. /**
  920.  * Extract the current value of the ifInDiscards data.
  921.  *
  922.  * Set a value using the data context for the row.
  923.  *
  924.  * @param rowreq_ctx
  925.  *        Pointer to the row request context.
  926.  * @param ifInDiscards_val_ptr
  927.  *        Pointer to storage for a u_long variable
  928.  *
  929.  * @retval MFD_SUCCESS         : success
  930.  * @retval MFD_SKIP            : skip this node (no value for now)
  931.  * @retval MFD_ERROR           : Any other error
  932.  */
  933. int
  934. ifInDiscards_get(ifTable_rowreq_ctx * rowreq_ctx,
  935.                  u_long * ifInDiscards_val_ptr)
  936. {
  937.    /** we should have a non-NULL pointer */
  938.     netsnmp_assert(NULL != ifInDiscards_val_ptr);
  939.     DEBUGMSGTL(("verbose:ifTable:ifInDiscards_get", "calledn"));
  940.     netsnmp_assert(NULL != rowreq_ctx);
  941.     /*
  942.      * TODO:231:o: |-> Extract the current value of the ifInDiscards data.
  943.      * set (* ifInDiscards_val_ptr ) from rowreq_ctx->data
  944.      */
  945.     (*ifInDiscards_val_ptr) = rowreq_ctx->data.ifInDiscards;
  946.     return MFD_SUCCESS;
  947. }                               /* ifInDiscards_get */
  948. /*---------------------------------------------------------------------
  949.  * IF-MIB::ifEntry.ifInErrors
  950.  * ifInErrors is subid 14 of ifEntry.
  951.  * Its status is Current, and its access level is ReadOnly.
  952.  * OID: .1.3.6.1.2.1.2.2.1.14
  953.  * Description:
  954. For packet-oriented interfaces, the number of inbound
  955.             packets that contained errors preventing them from being
  956.             deliverable to a higher-layer protocol.  For character-
  957.             oriented or fixed-length interfaces, the number of inbound
  958.             transmission units that contained errors preventing them
  959.             from being deliverable to a higher-layer protocol.
  960.             Discontinuities in the value of this counter can occur at
  961.             re-initialization of the management system, and at other
  962.             times as indicated by the value of
  963.             ifCounterDiscontinuityTime.
  964.  *
  965.  * Attributes:
  966.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  967.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  968.  *   settable   0
  969.  *
  970.  *
  971.  * Its syntax is COUNTER (based on perltype COUNTER)
  972.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  973.  */
  974. /**
  975.  * Extract the current value of the ifInErrors data.
  976.  *
  977.  * Set a value using the data context for the row.
  978.  *
  979.  * @param rowreq_ctx
  980.  *        Pointer to the row request context.
  981.  * @param ifInErrors_val_ptr
  982.  *        Pointer to storage for a u_long variable
  983.  *
  984.  * @retval MFD_SUCCESS         : success
  985.  * @retval MFD_SKIP            : skip this node (no value for now)
  986.  * @retval MFD_ERROR           : Any other error
  987.  */
  988. int
  989. ifInErrors_get(ifTable_rowreq_ctx * rowreq_ctx,
  990.                u_long * ifInErrors_val_ptr)
  991. {
  992.    /** we should have a non-NULL pointer */
  993.     netsnmp_assert(NULL != ifInErrors_val_ptr);
  994.     DEBUGMSGTL(("verbose:ifTable:ifInErrors_get", "calledn"));
  995.     netsnmp_assert(NULL != rowreq_ctx);
  996.     /*
  997.      * TODO:231:o: |-> Extract the current value of the ifInErrors data.
  998.      * set (* ifInErrors_val_ptr ) from rowreq_ctx->data
  999.      */
  1000.     (*ifInErrors_val_ptr) = rowreq_ctx->data.ifInErrors;
  1001.     return MFD_SUCCESS;
  1002. }                               /* ifInErrors_get */
  1003. /*---------------------------------------------------------------------
  1004.  * IF-MIB::ifEntry.ifInUnknownProtos
  1005.  * ifInUnknownProtos is subid 15 of ifEntry.
  1006.  * Its status is Current, and its access level is ReadOnly.
  1007.  * OID: .1.3.6.1.2.1.2.2.1.15
  1008.  * Description:
  1009. For packet-oriented interfaces, the number of packets
  1010.             received via the interface which were discarded because of
  1011.             an unknown or unsupported protocol.  For character-oriented
  1012.             or fixed-length interfaces that support protocol
  1013.             multiplexing the number of transmission units received via
  1014.             the interface which were discarded because of an unknown or
  1015.             unsupported protocol.  For any interface that does not
  1016.             support protocol multiplexing, this counter will always be
  1017.             0.
  1018.             Discontinuities in the value of this counter can occur at
  1019.             re-initialization of the management system, and at other
  1020.             times as indicated by the value of
  1021.             ifCounterDiscontinuityTime.
  1022.  *
  1023.  * Attributes:
  1024.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  1025.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1026.  *   settable   0
  1027.  *
  1028.  *
  1029.  * Its syntax is COUNTER (based on perltype COUNTER)
  1030.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  1031.  */
  1032. /**
  1033.  * Extract the current value of the ifInUnknownProtos data.
  1034.  *
  1035.  * Set a value using the data context for the row.
  1036.  *
  1037.  * @param rowreq_ctx
  1038.  *        Pointer to the row request context.
  1039.  * @param ifInUnknownProtos_val_ptr
  1040.  *        Pointer to storage for a u_long variable
  1041.  *
  1042.  * @retval MFD_SUCCESS         : success
  1043.  * @retval MFD_SKIP            : skip this node (no value for now)
  1044.  * @retval MFD_ERROR           : Any other error
  1045.  */
  1046. int
  1047. ifInUnknownProtos_get(ifTable_rowreq_ctx * rowreq_ctx,
  1048.                       u_long * ifInUnknownProtos_val_ptr)
  1049. {
  1050.    /** we should have a non-NULL pointer */
  1051.     netsnmp_assert(NULL != ifInUnknownProtos_val_ptr);
  1052.     DEBUGMSGTL(("verbose:ifTable:ifInUnknownProtos_get", "calledn"));
  1053.     netsnmp_assert(NULL != rowreq_ctx);
  1054.     /*
  1055.      * TODO:231:o: |-> Extract the current value of the ifInUnknownProtos data.
  1056.      * set (* ifInUnknownProtos_val_ptr ) from rowreq_ctx->data
  1057.      */
  1058.     (*ifInUnknownProtos_val_ptr) = rowreq_ctx->data.ifInUnknownProtos;
  1059.     return MFD_SUCCESS;
  1060. }                               /* ifInUnknownProtos_get */
  1061. /*---------------------------------------------------------------------
  1062.  * IF-MIB::ifEntry.ifOutOctets
  1063.  * ifOutOctets is subid 16 of ifEntry.
  1064.  * Its status is Current, and its access level is ReadOnly.
  1065.  * OID: .1.3.6.1.2.1.2.2.1.16
  1066.  * Description:
  1067. The total number of octets transmitted out of the
  1068.             interface, including framing characters.
  1069.             Discontinuities in the value of this counter can occur at
  1070.             re-initialization of the management system, and at other
  1071.             times as indicated by the value of
  1072.             ifCounterDiscontinuityTime.
  1073.  *
  1074.  * Attributes:
  1075.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  1076.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1077.  *   settable   0
  1078.  *
  1079.  *
  1080.  * Its syntax is COUNTER (based on perltype COUNTER)
  1081.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  1082.  */
  1083. /**
  1084.  * Extract the current value of the ifOutOctets data.
  1085.  *
  1086.  * Set a value using the data context for the row.
  1087.  *
  1088.  * @param rowreq_ctx
  1089.  *        Pointer to the row request context.
  1090.  * @param ifOutOctets_val_ptr
  1091.  *        Pointer to storage for a u_long variable
  1092.  *
  1093.  * @retval MFD_SUCCESS         : success
  1094.  * @retval MFD_SKIP            : skip this node (no value for now)
  1095.  * @retval MFD_ERROR           : Any other error
  1096.  */
  1097. int
  1098. ifOutOctets_get(ifTable_rowreq_ctx * rowreq_ctx,
  1099.                 u_long * ifOutOctets_val_ptr)
  1100. {
  1101.    /** we should have a non-NULL pointer */
  1102.     netsnmp_assert(NULL != ifOutOctets_val_ptr);
  1103.     DEBUGMSGTL(("verbose:ifTable:ifOutOctets_get", "calledn"));
  1104.     netsnmp_assert(NULL != rowreq_ctx);
  1105.     /*
  1106.      * TODO:231:o: |-> Extract the current value of the ifOutOctets data.
  1107.      * set (* ifOutOctets_val_ptr ) from rowreq_ctx->data
  1108.      */
  1109.     (*ifOutOctets_val_ptr) = rowreq_ctx->data.ifOutOctets;
  1110.     return MFD_SUCCESS;
  1111. }                               /* ifOutOctets_get */
  1112. /*---------------------------------------------------------------------
  1113.  * IF-MIB::ifEntry.ifOutUcastPkts
  1114.  * ifOutUcastPkts is subid 17 of ifEntry.
  1115.  * Its status is Current, and its access level is ReadOnly.
  1116.  * OID: .1.3.6.1.2.1.2.2.1.17
  1117.  * Description:
  1118. The total number of packets that higher-level protocols
  1119.             requested be transmitted, and which were not addressed to a
  1120.             multicast or broadcast address at this sub-layer, including
  1121.             those that were discarded or not sent.
  1122.             Discontinuities in the value of this counter can occur at
  1123.             re-initialization of the management system, and at other
  1124.             times as indicated by the value of
  1125.             ifCounterDiscontinuityTime.
  1126.  *
  1127.  * Attributes:
  1128.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  1129.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1130.  *   settable   0
  1131.  *
  1132.  *
  1133.  * Its syntax is COUNTER (based on perltype COUNTER)
  1134.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  1135.  */
  1136. /**
  1137.  * Extract the current value of the ifOutUcastPkts data.
  1138.  *
  1139.  * Set a value using the data context for the row.
  1140.  *
  1141.  * @param rowreq_ctx
  1142.  *        Pointer to the row request context.
  1143.  * @param ifOutUcastPkts_val_ptr
  1144.  *        Pointer to storage for a u_long variable
  1145.  *
  1146.  * @retval MFD_SUCCESS         : success
  1147.  * @retval MFD_SKIP            : skip this node (no value for now)
  1148.  * @retval MFD_ERROR           : Any other error
  1149.  */
  1150. int
  1151. ifOutUcastPkts_get(ifTable_rowreq_ctx * rowreq_ctx,
  1152.                    u_long * ifOutUcastPkts_val_ptr)
  1153. {
  1154.    /** we should have a non-NULL pointer */
  1155.     netsnmp_assert(NULL != ifOutUcastPkts_val_ptr);
  1156.     DEBUGMSGTL(("verbose:ifTable:ifOutUcastPkts_get", "calledn"));
  1157.     netsnmp_assert(NULL != rowreq_ctx);
  1158.     /*
  1159.      * TODO:231:o: |-> Extract the current value of the ifOutUcastPkts data.
  1160.      * set (* ifOutUcastPkts_val_ptr ) from rowreq_ctx->data
  1161.      */
  1162.     (*ifOutUcastPkts_val_ptr) = rowreq_ctx->data.ifOutUcastPkts;
  1163.     return MFD_SUCCESS;
  1164. }                               /* ifOutUcastPkts_get */
  1165. /*---------------------------------------------------------------------
  1166.  * IF-MIB::ifEntry.ifOutNUcastPkts
  1167.  * ifOutNUcastPkts is subid 18 of ifEntry.
  1168.  * Its status is Deprecated, and its access level is ReadOnly.
  1169.  * OID: .1.3.6.1.2.1.2.2.1.18
  1170.  * Description:
  1171. The total number of packets that higher-level protocols
  1172.             requested be transmitted, and which were addressed to a
  1173.             multicast or broadcast address at this sub-layer, including
  1174.             those that were discarded or not sent.
  1175.             Discontinuities in the value of this counter can occur at
  1176.             re-initialization of the management system, and at other
  1177.             times as indicated by the value of
  1178.             ifCounterDiscontinuityTime.
  1179.             This object is deprecated in favour of ifOutMulticastPkts
  1180.             and ifOutBroadcastPkts.
  1181.  *
  1182.  * Attributes:
  1183.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  1184.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1185.  *   settable   0
  1186.  *
  1187.  *
  1188.  * Its syntax is COUNTER (based on perltype COUNTER)
  1189.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  1190.  */
  1191. /**
  1192.  * Extract the current value of the ifOutNUcastPkts data.
  1193.  *
  1194.  * Set a value using the data context for the row.
  1195.  *
  1196.  * @param rowreq_ctx
  1197.  *        Pointer to the row request context.
  1198.  * @param ifOutNUcastPkts_val_ptr
  1199.  *        Pointer to storage for a u_long variable
  1200.  *
  1201.  * @retval MFD_SUCCESS         : success
  1202.  * @retval MFD_SKIP            : skip this node (no value for now)
  1203.  * @retval MFD_ERROR           : Any other error
  1204.  */
  1205. int
  1206. ifOutNUcastPkts_get(ifTable_rowreq_ctx * rowreq_ctx,
  1207.                     u_long * ifOutNUcastPkts_val_ptr)
  1208. {
  1209.    /** we should have a non-NULL pointer */
  1210.     netsnmp_assert(NULL != ifOutNUcastPkts_val_ptr);
  1211.     DEBUGMSGTL(("verbose:ifTable:ifOutNUcastPkts_get", "calledn"));
  1212.     netsnmp_assert(NULL != rowreq_ctx);
  1213.     /*
  1214.      * TODO:231:o: |-> Extract the current value of the ifOutNUcastPkts data.
  1215.      * set (* ifOutNUcastPkts_val_ptr ) from rowreq_ctx->data
  1216.      */
  1217.     (*ifOutNUcastPkts_val_ptr) = rowreq_ctx->data.ifentry->stats.onucast;
  1218.     return MFD_SUCCESS;
  1219. }                               /* ifOutNUcastPkts_get */
  1220. /*---------------------------------------------------------------------
  1221.  * IF-MIB::ifEntry.ifOutDiscards
  1222.  * ifOutDiscards is subid 19 of ifEntry.
  1223.  * Its status is Current, and its access level is ReadOnly.
  1224.  * OID: .1.3.6.1.2.1.2.2.1.19
  1225.  * Description:
  1226. The number of outbound packets which were chosen to be
  1227.             discarded even though no errors had been detected to prevent
  1228.             their being transmitted.  One possible reason for discarding
  1229.             such a packet could be to free up buffer space.
  1230.             Discontinuities in the value of this counter can occur at
  1231.             re-initialization of the management system, and at other
  1232.             times as indicated by the value of
  1233.             ifCounterDiscontinuityTime.
  1234.  *
  1235.  * Attributes:
  1236.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  1237.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1238.  *   settable   0
  1239.  *
  1240.  *
  1241.  * Its syntax is COUNTER (based on perltype COUNTER)
  1242.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  1243.  */
  1244. /**
  1245.  * Extract the current value of the ifOutDiscards data.
  1246.  *
  1247.  * Set a value using the data context for the row.
  1248.  *
  1249.  * @param rowreq_ctx
  1250.  *        Pointer to the row request context.
  1251.  * @param ifOutDiscards_val_ptr
  1252.  *        Pointer to storage for a u_long variable
  1253.  *
  1254.  * @retval MFD_SUCCESS         : success
  1255.  * @retval MFD_SKIP            : skip this node (no value for now)
  1256.  * @retval MFD_ERROR           : Any other error
  1257.  */
  1258. int
  1259. ifOutDiscards_get(ifTable_rowreq_ctx * rowreq_ctx,
  1260.                   u_long * ifOutDiscards_val_ptr)
  1261. {
  1262.    /** we should have a non-NULL pointer */
  1263.     netsnmp_assert(NULL != ifOutDiscards_val_ptr);
  1264.     DEBUGMSGTL(("verbose:ifTable:ifOutDiscards_get", "calledn"));
  1265.     netsnmp_assert(NULL != rowreq_ctx);
  1266.     /*
  1267.      * TODO:231:o: |-> Extract the current value of the ifOutDiscards data.
  1268.      * set (* ifOutDiscards_val_ptr ) from rowreq_ctx->data
  1269.      */
  1270.     (*ifOutDiscards_val_ptr) = rowreq_ctx->data.ifOutDiscards;
  1271.     return MFD_SUCCESS;
  1272. }                               /* ifOutDiscards_get */
  1273. /*---------------------------------------------------------------------
  1274.  * IF-MIB::ifEntry.ifOutErrors
  1275.  * ifOutErrors is subid 20 of ifEntry.
  1276.  * Its status is Current, and its access level is ReadOnly.
  1277.  * OID: .1.3.6.1.2.1.2.2.1.20
  1278.  * Description:
  1279. For packet-oriented interfaces, the number of outbound
  1280.             packets that could not be transmitted because of errors.
  1281.             For character-oriented or fixed-length interfaces, the
  1282.             number of outbound transmission units that could not be
  1283.             transmitted because of errors.
  1284.             Discontinuities in the value of this counter can occur at
  1285.             re-initialization of the management system, and at other
  1286.             times as indicated by the value of
  1287.             ifCounterDiscontinuityTime.
  1288.  *
  1289.  * Attributes:
  1290.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  1291.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1292.  *   settable   0
  1293.  *
  1294.  *
  1295.  * Its syntax is COUNTER (based on perltype COUNTER)
  1296.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  1297.  */
  1298. /**
  1299.  * Extract the current value of the ifOutErrors data.
  1300.  *
  1301.  * Set a value using the data context for the row.
  1302.  *
  1303.  * @param rowreq_ctx
  1304.  *        Pointer to the row request context.
  1305.  * @param ifOutErrors_val_ptr
  1306.  *        Pointer to storage for a u_long variable
  1307.  *
  1308.  * @retval MFD_SUCCESS         : success
  1309.  * @retval MFD_SKIP            : skip this node (no value for now)
  1310.  * @retval MFD_ERROR           : Any other error
  1311.  */
  1312. int
  1313. ifOutErrors_get(ifTable_rowreq_ctx * rowreq_ctx,
  1314.                 u_long * ifOutErrors_val_ptr)
  1315. {
  1316.    /** we should have a non-NULL pointer */
  1317.     netsnmp_assert(NULL != ifOutErrors_val_ptr);
  1318.     DEBUGMSGTL(("verbose:ifTable:ifOutErrors_get", "calledn"));
  1319.     netsnmp_assert(NULL != rowreq_ctx);
  1320.     /*
  1321.      * TODO:231:o: |-> Extract the current value of the ifOutErrors data.
  1322.      * set (* ifOutErrors_val_ptr ) from rowreq_ctx->data
  1323.      */
  1324.     (*ifOutErrors_val_ptr) = rowreq_ctx->data.ifOutErrors;
  1325.     return MFD_SUCCESS;
  1326. }                               /* ifOutErrors_get */
  1327. /*---------------------------------------------------------------------
  1328.  * IF-MIB::ifEntry.ifOutQLen
  1329.  * ifOutQLen is subid 21 of ifEntry.
  1330.  * Its status is Deprecated, and its access level is ReadOnly.
  1331.  * OID: .1.3.6.1.2.1.2.2.1.21
  1332.  * Description:
  1333. The length of the output packet queue (in packets).
  1334.  *
  1335.  * Attributes:
  1336.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  1337.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1338.  *   settable   0
  1339.  *
  1340.  *
  1341.  * Its syntax is GAUGE (based on perltype GAUGE)
  1342.  * The net-snmp type is ASN_GAUGE. The C type decl is u_long (u_long)
  1343.  */
  1344. /**
  1345.  * Extract the current value of the ifOutQLen data.
  1346.  *
  1347.  * Set a value using the data context for the row.
  1348.  *
  1349.  * @param rowreq_ctx
  1350.  *        Pointer to the row request context.
  1351.  * @param ifOutQLen_val_ptr
  1352.  *        Pointer to storage for a u_long variable
  1353.  *
  1354.  * @retval MFD_SUCCESS         : success
  1355.  * @retval MFD_SKIP            : skip this node (no value for now)
  1356.  * @retval MFD_ERROR           : Any other error
  1357.  */
  1358. int
  1359. ifOutQLen_get(ifTable_rowreq_ctx * rowreq_ctx, u_long * ifOutQLen_val_ptr)
  1360. {
  1361.    /** we should have a non-NULL pointer */
  1362.     netsnmp_assert(NULL != ifOutQLen_val_ptr);
  1363.     DEBUGMSGTL(("verbose:ifTable:ifOutQLen_get", "calledn"));
  1364.     netsnmp_assert(NULL != rowreq_ctx);
  1365.     /*
  1366.      * TODO:231:o: |-> Extract the current value of the ifOutQLen data.
  1367.      * set (* ifOutQLen_val_ptr ) from rowreq_ctx->data
  1368.      */
  1369.     (*ifOutQLen_val_ptr) = rowreq_ctx->data.ifOutQLen;
  1370.     return MFD_SUCCESS;
  1371. }                               /* ifOutQLen_get */
  1372. /*---------------------------------------------------------------------
  1373.  * IF-MIB::ifEntry.ifSpecific
  1374.  * ifSpecific is subid 22 of ifEntry.
  1375.  * Its status is Deprecated, and its access level is ReadOnly.
  1376.  * OID: .1.3.6.1.2.1.2.2.1.22
  1377.  * Description:
  1378. A reference to MIB definitions specific to the particular
  1379.             media being used to realize the interface.  It is
  1380.             recommended that this value point to an instance of a MIB
  1381.             object in the media-specific MIB, i.e., that this object
  1382.             have the semantics associated with the InstancePointer
  1383.             textual convention defined in RFC 2579.  In fact, it is
  1384.             recommended that the media-specific MIB specify what value
  1385.             ifSpecific should/can take for values of ifType.  If no MIB
  1386.             definitions specific to the particular media are available,
  1387.             the value should be set to the OBJECT IDENTIFIER { 0 0 }.
  1388.  *
  1389.  * Attributes:
  1390.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  1391.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1392.  *   settable   0
  1393.  *
  1394.  *
  1395.  * Its syntax is OBJECTID (based on perltype OBJECTID)
  1396.  * The net-snmp type is ASN_OBJECT_ID. The C type decl is oid (oid)
  1397.  * This data type requires a length.  (Max 255)
  1398.  */
  1399. /**
  1400.  * Extract the current value of the ifSpecific data.
  1401.  *
  1402.  * Set a value using the data context for the row.
  1403.  *
  1404.  * @param rowreq_ctx
  1405.  *        Pointer to the row request context.
  1406.  * @param ifSpecific_val_ptr_ptr
  1407.  *        Pointer to storage for a oid variable
  1408.  * @param ifSpecific_val_ptr_len_ptr
  1409.  *        Pointer to a size_t. On entry, it will contain the size (in bytes)
  1410.  *        pointed to by ifSpecific.
  1411.  *        On exit, this value should contain the data size (in bytes).
  1412.  *
  1413.  * @retval MFD_SUCCESS         : success
  1414.  * @retval MFD_SKIP            : skip this node (no value for now)
  1415.  * @retval MFD_ERROR           : Any other error
  1416. *
  1417.  * @note If you need more than (*ifSpecific_val_ptr_len_ptr) bytes of memory,
  1418.  *       allocate it using malloc() and update ifSpecific_val_ptr_ptr.
  1419.  *       <b>DO NOT</b> free the previous pointer.
  1420.  *       The MFD helper will release the memory you allocate.
  1421.  *
  1422.  * @remark If you call this function yourself, you are responsible
  1423.  *         for checking if the pointer changed, and freeing any
  1424.  *         previously allocated memory. (Not necessary if you pass
  1425.  *         in a pointer to static memory, obviously.)
  1426.  */
  1427. int
  1428. ifSpecific_get(ifTable_rowreq_ctx * rowreq_ctx,
  1429.                oid ** ifSpecific_val_ptr_ptr,
  1430.                size_t *ifSpecific_val_ptr_len_ptr)
  1431. {
  1432.    /** we should have a non-NULL pointer and enough storage */
  1433.     netsnmp_assert((NULL != ifSpecific_val_ptr_ptr)
  1434.                    && (NULL != *ifSpecific_val_ptr_ptr));
  1435.     netsnmp_assert(NULL != ifSpecific_val_ptr_len_ptr);
  1436.     DEBUGMSGTL(("verbose:ifTable:ifSpecific_get", "calledn"));
  1437.     netsnmp_assert(NULL != rowreq_ctx);
  1438.     /*
  1439.      * TODO:231:o: |-> Extract the current value of the ifSpecific data.
  1440.      * set (* ifSpecific_val_ptr_ptr ) and (* ifSpecific_val_ptr_len_ptr ) from rowreq_ctx->data
  1441.      */
  1442. #ifdef IFTABLE_HAS_IFSPECIFIC
  1443.     /*
  1444.      * make sure there is enough space for ifSpecific data
  1445.      */
  1446.     if ((NULL == (*ifSpecific_val_ptr_ptr))
  1447.         || ((*ifSpecific_val_ptr_len_ptr) <
  1448.             rowreq_ctx->data.ifSpecific_len)) {
  1449.         /*
  1450.          * allocate space for ifSpecific data
  1451.          */
  1452.         (*ifSpecific_val_ptr_ptr) =
  1453.             malloc(rowreq_ctx->data.ifSpecific_len *
  1454.                    sizeof((*ifSpecific_val_ptr_ptr)[0]));
  1455.         if (NULL == (*ifSpecific_val_ptr_ptr)) {
  1456.             snmp_log(LOG_ERR, "could not allocate memoryn");
  1457.             return MFD_ERROR;
  1458.         }
  1459.     }
  1460.     (*ifSpecific_val_ptr_len_ptr) = rowreq_ctx->data.ifSpecific_len;
  1461.     memcpy((*ifSpecific_val_ptr_ptr), rowreq_ctx->data.ifSpecific,
  1462.            (*ifSpecific_val_ptr_len_ptr) *
  1463.            sizeof((*ifSpecific_val_ptr_ptr)[0]));
  1464. #else
  1465.     /*
  1466.      * hard coded
  1467.      */
  1468.     netsnmp_assert((*ifSpecific_val_ptr_len_ptr) > nullOidLen);
  1469.     (*ifSpecific_val_ptr_len_ptr) = nullOidLen;
  1470.     memcpy(*ifSpecific_val_ptr_ptr, &nullOid, nullOidLen);
  1471. #endif
  1472.     return MFD_SUCCESS;
  1473. }                               /* ifSpecific_get */
  1474. /** @} */
  1475. /**********************************************************************
  1476.  **********************************************************************
  1477.  ***
  1478.  *** Table ifTable
  1479.  ***
  1480.  **********************************************************************
  1481.  **********************************************************************/
  1482. /*
  1483.  * ifTable is subid 2 of interfaces.
  1484.  * Its status is Current.
  1485.  * OID: .1.3.6.1.2.1.2.2, length: 8
  1486.  */
  1487.     /*
  1488.      * NOTE: if you update this chart, please update the versions in
  1489.      *       local/mib2c-conf.d/parent-set.m2i
  1490.      *       agent/mibgroup/helpers/baby_steps.c
  1491.      * while you're at it.
  1492.      */
  1493.     /*
  1494.      ***********************************************************************
  1495.      * Baby Steps Flow Chart (2004.06.05)                                  *
  1496.      *                                                                     *
  1497.      * +--------------+    +================+    U = unconditional path    *
  1498.      * |optional state|    ||required state||    S = path for success      *
  1499.      * +--------------+    +================+    E = path for error        *
  1500.      ***********************************************************************
  1501.      *
  1502.      *                        +--------------+
  1503.      *                        |     pre      |
  1504.      *                        |   request    |
  1505.      *                        +--------------+
  1506.      *                               | U
  1507.      *                        +==============+
  1508.      *       +----------------||  object    ||
  1509.      *       |              E ||  lookup    ||
  1510.      *       |                +==============+
  1511.      *       |                       | S
  1512.      *       |                +==============+
  1513.      *       |              E ||   check    ||
  1514.      *       |<---------------||   values   ||
  1515.      *       |                +==============+
  1516.      *       |                       | S
  1517.      *       |                +==============+
  1518.      *       |       +<-------||   undo     ||
  1519.      *       |       |      E ||   setup    ||
  1520.      *       |       |        +==============+
  1521.      *       |       |               | S
  1522.      *       |       |        +==============+
  1523.      *       |       |        ||    set     ||-------------------------->+
  1524.      *       |       |        ||   value    || E                         |
  1525.      *       |       |        +==============+                           |
  1526.      *       |       |               | S                                 |
  1527.      *       |       |        +--------------+                           |
  1528.      *       |       |        |    check     |-------------------------->|
  1529.      *       |       |        |  consistency | E                         |
  1530.      *       |       |        +--------------+                           |
  1531.      *       |       |               | S                                 |
  1532.      *       |       |        +==============+         +==============+  |
  1533.      *       |       |        ||   commit   ||-------->||     undo   ||  |
  1534.      *       |       |        ||            || E       ||    commit  ||  |
  1535.      *       |       |        +==============+         +==============+  |
  1536.      *       |       |               | S                     U |<--------+
  1537.      *       |       |        +--------------+         +==============+
  1538.      *       |       |        | irreversible |         ||    undo    ||
  1539.      *       |       |        |    commit    |         ||     set    ||
  1540.      *       |       |        +--------------+         +==============+
  1541.      *       |       |               | U                     U |
  1542.      *       |       +-------------->|<------------------------+
  1543.      *       |                +==============+
  1544.      *       |                ||   undo     ||
  1545.      *       |                ||  cleanup   ||
  1546.      *       |                +==============+
  1547.      *       +---------------------->| U
  1548.      *                        +--------------+
  1549.      *                        |    post      |
  1550.      *                        |   request    |
  1551.      *                        +--------------+
  1552.      *
  1553.      */
  1554. /**
  1555.  * Setup up context with information needed to undo a set request.
  1556.  *
  1557.  * This function will be called before the individual node undo setup
  1558.  * functions are called. If you need to do any undo setup that is not
  1559.  * related to a specific column, you can do it here.
  1560.  *
  1561.  * Note that the undo context has been allocated with
  1562.  * ifTable_allocate_data(), but may need extra
  1563.  * initialization similar to what you may have done in
  1564.  * ifTable_rowreq_ctx_init().
  1565.  * Note that an individual node's undo_setup function will only be called
  1566.  * if that node is being set to a new value.
  1567.  *
  1568.  * If there is any setup specific to a particular column (e.g. allocating
  1569.  * memory for a string), you should do that setup in the node's undo_setup
  1570.  * function, so it won't be done unless it is necessary.
  1571.  *
  1572.  * @param rowreq_ctx
  1573.  *        Pointer to the table context (ifTable_rowreq_ctx)
  1574.  *
  1575.  * @retval MFD_SUCCESS : success
  1576.  * @retval MFD_ERROR   : error. set will fail.
  1577.  */
  1578. int
  1579. ifTable_undo_setup(ifTable_rowreq_ctx * rowreq_ctx)
  1580. {
  1581.     int             rc = MFD_SUCCESS;
  1582.     DEBUGMSGTL(("verbose:ifTable:ifTable_undo_setup", "calledn"));
  1583.     /** we should have a non-NULL pointer */
  1584.     netsnmp_assert(NULL != rowreq_ctx);
  1585.     /*
  1586.      * TODO:451:M: |-> Setup ifTable undo.
  1587.      * set up ifTable undo information, in preparation for a set.
  1588.      */
  1589.     rowreq_ctx->undo->ifentry =
  1590.         netsnmp_access_interface_entry_create(rowreq_ctx->data.ifentry->
  1591.                                               name, rowreq_ctx->data.ifentry->index);
  1592.     if (NULL == rowreq_ctx->undo->ifentry)
  1593.         rc = MFD_ERROR;
  1594.     else
  1595.         netsnmp_access_interface_entry_copy(rowreq_ctx->undo->ifentry,
  1596.                                             rowreq_ctx->data.ifentry);
  1597.     return rc;
  1598. }                               /* ifTable_undo_setup */
  1599. /**
  1600.  * Cleanup up context undo information.
  1601.  *
  1602.  * This function will be called after set/commit processing. If you
  1603.  * allocated any resources in undo_setup, this is the place to release
  1604.  * those resources.
  1605.  *
  1606.  * This function is called regardless of the success or failure of the set
  1607.  * request. If you need to perform different steps for cleanup depending
  1608.  * on success or failure, you can add a flag to the rowreq_ctx.
  1609.  *
  1610.  * @param rowreq_ctx
  1611.  *        Pointer to the table context (ifTable_rowreq_ctx)
  1612.  *
  1613.  * @retval MFD_SUCCESS : success
  1614.  * @retval MFD_ERROR   : error
  1615.  */
  1616. int
  1617. ifTable_undo_cleanup(ifTable_rowreq_ctx * rowreq_ctx)
  1618. {
  1619.     int             rc = MFD_SUCCESS;
  1620.     DEBUGMSGTL(("verbose:ifTable:ifTable_undo_cleanup", "calledn"));
  1621.     /** we should have a non-NULL pointer */
  1622.     netsnmp_assert(NULL != rowreq_ctx);
  1623.     /*
  1624.      * TODO:452:M: |-> Cleanup ifTable undo.
  1625.      */
  1626.     return rc;
  1627. }                               /* ifTable_undo_cleanup */
  1628. /**
  1629.  * commit new values.
  1630.  *
  1631.  * At this point, you should have done everything you can to ensure that
  1632.  * this commit will not fail.
  1633.  *
  1634.  * Should you need different behavior depending on which columns were
  1635.  * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
  1636.  * set. The definitions for the FLAG_* bits can be found in
  1637.  * ifTable.h.
  1638.  * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
  1639.  *
  1640.  * @param ifTable_rowreq_ctx
  1641.  *        Pointer to the users context.
  1642.  *
  1643.  * @retval MFD_SUCCESS : success
  1644.  * @retval MFD_ERROR   : error
  1645.  */
  1646. int
  1647. ifTable_commit(ifTable_rowreq_ctx * rowreq_ctx)
  1648. {
  1649.     int             rc = MFD_SUCCESS;
  1650.     int             save_flags;
  1651.     DEBUGMSGTL(("verbose:ifTable:ifTable_commit", "calledn"));
  1652.     /** we should have a non-NULL pointer */
  1653.     netsnmp_assert(NULL != rowreq_ctx);
  1654.     /*
  1655.      * save flags, then clear until we actually do something
  1656.      */
  1657.     save_flags = rowreq_ctx->column_set_flags;
  1658.     rowreq_ctx->column_set_flags = 0;
  1659.     /*
  1660.      * commit ifTable data
  1661.      * 1) check the column's flag in save_flags to see if it was set.
  1662.      * 2) clear the flag when you handle that column
  1663.      * 3) set the column's flag in column_set_flags if it needs undo
  1664.      *    processing in case of a failure.
  1665.      */
  1666.     if (save_flags & FLAG_IFADMINSTATUS) {
  1667.         save_flags &= ~FLAG_IFADMINSTATUS;      /* clear ifAdminStatus */
  1668.         /*
  1669.          * TODO:482:o: |-> commit column ifAdminStatus.
  1670.          */
  1671.         rc = netsnmp_access_interface_entry_set_admin_status(rowreq_ctx->
  1672.                                                              data.ifentry,
  1673.                                                              rowreq_ctx->
  1674.                                                              data.
  1675.                                                              ifAdminStatus);
  1676.         if (0 != rc) {
  1677.             snmp_log(LOG_ERR,
  1678.                      "ifTable column ifAdminStatus commit failedn");
  1679.         } else {
  1680.             /*
  1681.              * set flag, in case we need to undo ifAdminStatus
  1682.              */
  1683.             rowreq_ctx->column_set_flags |= FLAG_IFADMINSTATUS;
  1684.         }
  1685.     }
  1686.     if (save_flags) {
  1687.         snmp_log(LOG_ERR, "unhandled columns (0x%x) in commitn",
  1688.                  save_flags);
  1689.         return MFD_ERROR;
  1690.     }
  1691.     return rc;
  1692. }                               /* ifTable_commit */
  1693. /**
  1694.  * undo commit new values.
  1695.  *
  1696.  * Should you need different behavior depending on which columns were
  1697.  * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
  1698.  * set. The definitions for the FLAG_* bits can be found in
  1699.  * ifTable.h.
  1700.  * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
  1701.  *
  1702.  * @param ifTable_rowreq_ctx
  1703.  *        Pointer to the users context.
  1704.  *
  1705.  * @retval MFD_SUCCESS : success
  1706.  * @retval MFD_ERROR   : error
  1707.  */
  1708. int
  1709. ifTable_undo_commit(ifTable_rowreq_ctx * rowreq_ctx)
  1710. {
  1711.     int             rc = MFD_SUCCESS;
  1712.     DEBUGMSGTL(("verbose:ifTable:ifTable_undo_commit", "calledn"));
  1713.     /** we should have a non-NULL pointer */
  1714.     netsnmp_assert(NULL != rowreq_ctx);
  1715.     /*
  1716.      * TODO:485:M: |-> Undo ifTable commit.
  1717.      * check the column's flag in rowreq_ctx->column_set_flags to see
  1718.      * if it was set during commit, then undo it.
  1719.      *
  1720.      * eg: if (rowreq_ctx->column_set_flags & FLAG_) {}
  1721.      */
  1722.     /*
  1723.      * no undo cleanup, undo entry simply freed
  1724.      */
  1725.     return rc;
  1726. }                               /* ifTable_undo_commit */
  1727. /*
  1728.  * TODO:420:r: Implement ifTable index validation.
  1729.  */
  1730. /*
  1731.  * TODO:440:M: Implement ifTable node value checks.
  1732.  * TODO:450:M: Implement ifTable undo functions.
  1733.  * TODO:460:M: Implement ifTable set functions.
  1734.  * TODO:480:M: Implement ifTable commit functions.
  1735.  */
  1736. /*---------------------------------------------------------------------
  1737.  * IF-MIB::ifEntry.ifAdminStatus
  1738.  * ifAdminStatus is subid 7 of ifEntry.
  1739.  * Its status is Current, and its access level is ReadWrite.
  1740.  * OID: .1.3.6.1.2.1.2.2.1.7
  1741.  * Description:
  1742. The desired state of the interface.  The testing(3) state
  1743.             indicates that no operational packets can be passed.  When a
  1744.             managed system initializes, all interfaces start with
  1745.             ifAdminStatus in the down(2) state.  As a result of either
  1746.             explicit management action or per configuration information
  1747.             retained by the managed system, ifAdminStatus is then
  1748.             changed to either the up(1) or testing(3) states (or remains
  1749.             in the down(2) state).
  1750.  *
  1751.  * Attributes:
  1752.  *   accessible 1     isscalar 0     enums  1      hasdefval 0
  1753.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1754.  *   settable   1
  1755.  *
  1756.  * Enum range: 2/8. Values:  up(1), down(2), testing(3)
  1757.  *
  1758.  * Its syntax is INTEGER (based on perltype INTEGER)
  1759.  * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
  1760.  */
  1761. /**
  1762.  * Check that the proposed new value is potentially valid.
  1763.  *
  1764.  * @param rowreq_ctx
  1765.  *        Pointer to the row request context.
  1766.  * @param ifAdminStatus_val
  1767.  *        A long containing the new value.
  1768.  *
  1769.  * @retval MFD_SUCCESS        : incoming value is legal
  1770.  * @retval MFD_NOT_VALID_NOW  : incoming value is not valid now
  1771.  * @retval MFD_NOT_VALID_EVER : incoming value is never valid
  1772.  *
  1773.  * This is the place to check for requirements that are not
  1774.  * expressed in the mib syntax (for example, a requirement that
  1775.  * is detailed in the description for an object).
  1776.  *
  1777.  * You should check that the requested change between the undo value and the
  1778.  * new value is legal (ie, the transistion from one value to another
  1779.  * is legal).
  1780.  *      
  1781.  *@note
  1782.  * This check is only to determine if the new value
  1783.  * is b potentially valid. This is the first check of many, and
  1784.  * is one of the simplest ones.
  1785.  * 
  1786.  *@note
  1787.  * this is not the place to do any checks for values
  1788.  * which depend on some other value in the mib. Those
  1789.  * types of checks should be done in the
  1790.  * ifTable_check_dependencies() function.
  1791.  *
  1792.  * The following checks have already been done for you:
  1793.  *    The syntax is ASN_INTEGER
  1794.  *    The value is one of  up(1), down(2), testing(3)
  1795.  *
  1796.  * If there a no other checks you need to do, simply return MFD_SUCCESS.
  1797.  *
  1798.  */
  1799. int
  1800. ifAdminStatus_check_value(ifTable_rowreq_ctx * rowreq_ctx,
  1801.                           u_long ifAdminStatus_val)
  1802. {
  1803.     DEBUGMSGTL(("verbose:ifTable:ifAdminStatus_check_value", "calledn"));
  1804.     /** should never get a NULL pointer */
  1805.     netsnmp_assert(NULL != rowreq_ctx);
  1806.     /*
  1807.      * TODO:441:o: |-> Check for valid ifAdminStatus value.
  1808.      */
  1809.     /*
  1810.      * we don't support test
  1811.      */
  1812.     if (ifAdminStatus_val == IFADMINSTATUS_TESTING)
  1813.         return MFD_ERROR;
  1814.     return MFD_SUCCESS;         /* ifAdminStatus value not illegal */
  1815. }                               /* ifAdminStatus_check_value */
  1816. /**
  1817.  * Save old value information
  1818.  *
  1819.  * @param rowreq_ctx
  1820.  *        Pointer to the table context (ifTable_rowreq_ctx)
  1821.  *
  1822.  * @retval MFD_SUCCESS : success
  1823.  * @retval MFD_ERROR   : error. set will fail.
  1824.  *
  1825.  * This function will be called after the table level undo setup function
  1826.  * ifTable_undo_setup has been called.
  1827.  *
  1828.  *@note
  1829.  * this function will only be called if a new value is set for this column.
  1830.  *
  1831.  * If there is any setup specific to a particular column (e.g. allocating
  1832.  * memory for a string), you should do that setup in this function, so it
  1833.  * won't be done unless it is necessary.
  1834.  */
  1835. int
  1836. ifAdminStatus_undo_setup(ifTable_rowreq_ctx * rowreq_ctx)
  1837. {
  1838.     DEBUGMSGTL(("verbose:ifTable:ifAdminStatus_undo_setup", "calledn"));
  1839.     /** should never get a NULL pointer */
  1840.     netsnmp_assert(NULL != rowreq_ctx);
  1841.     /*
  1842.      * TODO:455:o: |-> Setup ifAdminStatus undo.
  1843.      */
  1844.     /*
  1845.      * copy ifAdminStatus data
  1846.      * set rowreq_ctx->undo->ifAdminStatus from rowreq_ctx->data.ifAdminStatus
  1847.      */
  1848.     rowreq_ctx->undo->ifAdminStatus = rowreq_ctx->data.ifAdminStatus;
  1849.     return MFD_SUCCESS;
  1850. }                               /* ifAdminStatus_undo_setup */
  1851. /**
  1852.  * Set the new value.
  1853.  *
  1854.  * @param rowreq_ctx
  1855.  *        Pointer to the users context. You should know how to
  1856.  *        manipulate the value from this object.
  1857.  * @param ifAdminStatus_val
  1858.  *        A long containing the new value.
  1859.  */
  1860. int
  1861. ifAdminStatus_set(ifTable_rowreq_ctx * rowreq_ctx,
  1862.                   u_long ifAdminStatus_val)
  1863. {
  1864.     DEBUGMSGTL(("verbose:ifTable:ifAdminStatus_set", "calledn"));
  1865.     /** should never get a NULL pointer */
  1866.     netsnmp_assert(NULL != rowreq_ctx);
  1867.     /*
  1868.      * TODO:461:M: |-> Set ifAdminStatus value.
  1869.      * set ifAdminStatus value in rowreq_ctx->data
  1870.      */
  1871.     rowreq_ctx->data.ifAdminStatus = ifAdminStatus_val;
  1872.     return MFD_SUCCESS;
  1873. }                               /* ifAdminStatus_set */
  1874. /**
  1875.  * undo the previous set.
  1876.  *
  1877.  * @param rowreq_ctx
  1878.  *        Pointer to the users context.
  1879.  */
  1880. int
  1881. ifAdminStatus_undo(ifTable_rowreq_ctx * rowreq_ctx)
  1882. {
  1883.     DEBUGMSGTL(("verbose:ifTable:ifAdminStatus_undo", "calledn"));
  1884.     netsnmp_assert(NULL != rowreq_ctx);
  1885.     /*
  1886.      * TODO:456:o: |-> Clean up ifAdminStatus undo.
  1887.      */
  1888.     /*
  1889.      * copy ifAdminStatus data
  1890.      * set rowreq_ctx->data.ifAdminStatus from rowreq_ctx->undo->ifAdminStatus
  1891.      */
  1892.     rowreq_ctx->data.ifAdminStatus = rowreq_ctx->undo->ifAdminStatus;
  1893.     return MFD_SUCCESS;
  1894. }                               /* ifAdminStatus_undo */
  1895. /**
  1896.  * check dependencies
  1897.  *
  1898.  * This is useful for for tables which have dependencies between columns
  1899.  * (or rows, or tables). For example, two columns allocating a percentage
  1900.  * of something add up 100%.
  1901.  *
  1902.  * Should you need different behavior depending on which columns were
  1903.  * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
  1904.  * set. The definitions for the FLAG_* bits can be found in
  1905.  * ifTable.h.
  1906.  * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
  1907.  *
  1908.  * @retval MFD_SUCCESS all the changes to the row are legal
  1909.  * @retval MFD_ERROR   one or more changes are not legal
  1910.  *
  1911.  * (see README-table-ifTable if you don't have dependencies)
  1912.  */
  1913. int
  1914. ifTable_check_dependencies(ifTable_rowreq_ctx * rowreq_ctx)
  1915. {
  1916.     int             rc = MFD_SUCCESS;
  1917.     DEBUGMSGTL(("internal:ifTable:ifTable_check_dependencies",
  1918.                 "calledn"));
  1919.     netsnmp_assert(NULL != rowreq_ctx);
  1920.     /*
  1921.      * TODO:470:o: Check ifTable row dependencies.
  1922.      * check that all new value are legal and consistent with each other
  1923.      */
  1924.     return rc;
  1925. }                               /* ifTable_check_dependencies */
  1926. /** @} */
  1927. /** @{ */