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

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: ifXTable.c,v 1.12.2.2 2005/09/01 20:45:36 rstory Exp $
  6.  */
  7. /** mainpage MFD helper for ifXTable
  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. #include <ctype.h>
  20. /*
  21.  * include our parent header 
  22.  */
  23. #include "ifXTable.h"
  24. #include <net-snmp/agent/mib_modules.h>
  25. #include "ifXTable_interface.h"
  26. #define LINE_TERM_CHAR '$'
  27. /*
  28.  * not sure if we want to support set for promiscuous mode, because
  29.  * 1) careful thought should go into any settable object that performs
  30.  *    an action that requires root access
  31.  * 2) i don't want to write the code right now
  32.  * 
  33.  */
  34. #undef NETSNMP_ENABLE_PROMISCUOUSMODE_SET
  35. oid             ifXTable_oid[] = { IFXTABLE_OID };
  36. int             ifXTable_oid_size = OID_LENGTH(ifXTable_oid);
  37. const char     *row_token = "ifXTable";
  38. void            initialize_table_ifXTable(void);
  39. static void     _ifXTable_restore(const char *token, char *buf);
  40. static int      _ifXTable_save(int majorID, int minorID, void *serverarg,
  41.                                void *clientarg);
  42. extern netsnmp_container *_ifXTable_container_get(void);
  43. /**
  44.  * Initializes the ifXTable module
  45.  */
  46. void
  47. init_ifXTable(void)
  48. {
  49.     DEBUGMSGTL(("verbose:ifXTable:init_ifXTable", "calledn"));
  50.     /*
  51.      * TODO:300:o: Perform ifXTable one-time module initialization.
  52.      */
  53.     /*
  54.      * here we initialize all the tables we're planning on supporting
  55.      */
  56.     if (should_init("ifXTable"))
  57.         initialize_table_ifXTable();
  58. }                               /* init_ifXTable */
  59. /**
  60.  * Initialize the table ifXTable 
  61.  *    (Define its contents and how it's structured)
  62.  */
  63. void
  64. initialize_table_ifXTable(void)
  65. {
  66.     ifXTable_registration_ptr user_context;
  67.     u_long          flags;
  68.     int             rc;
  69.     DEBUGMSGTL(("verbose:ifXTable:initialize_table_ifXTable", "calledn"));
  70.     /*
  71.      * TODO:301:o: Perform ifXTable one-time table initialization.
  72.      */
  73.     /*
  74.      * TODO:302:o: |->Initialize ifXTable user context
  75.      * if you'd like to pass in a pointer to some data for this
  76.      * table, allocate or set it up here.
  77.      */
  78.     /*
  79.      * a netsnmp_data_list is a simple way to store void pointers. A simple
  80.      * string token is used to add, find or remove pointers.
  81.      */
  82.     user_context = netsnmp_create_data_list("ifXTable", NULL, NULL);
  83.     /*
  84.      * No support for any flags yet, but in the future you would
  85.      * set any flags here.
  86.      */
  87.     flags = 0;
  88.     /*
  89.      * call interface initialization code
  90.      */
  91.     _ifXTable_initialize_interface(user_context, flags);
  92.     /*
  93.      * if there is no container, bail. otherwise, register the callbacks
  94.      * for persistent storage.
  95.      */
  96.     if (NULL == _ifXTable_container_get())
  97.         return; /* msg already logged */
  98.     register_config_handler(NULL, "ifXTable", _ifXTable_restore, NULL,
  99.                             NULL);
  100.     rc = snmp_register_callback(SNMP_CALLBACK_LIBRARY,
  101.                                 SNMP_CALLBACK_STORE_DATA, _ifXTable_save,
  102.                                 _ifXTable_container_get());
  103.     if (rc != SNMP_ERR_NOERROR)
  104.         snmp_log(LOG_ERR, "error registering for STORE_DATA callback "
  105.                  "in initialize_table_ifXTablen");
  106. }                               /* initialize_table_ifXTable */
  107. /**
  108.  * extra context initialization
  109.  *
  110.  * @param rowreq_ctx    : row request context
  111.  * @param user_init_ctx : void pointer for user (parameter to rowreq_ctx_allocate)
  112.  *
  113.  * @retval MFD_SUCCESS  : no errors
  114.  * @retval MFD_ERROR    : error (context allocate will fail)
  115.  */
  116. int
  117. ifXTable_rowreq_ctx_init(ifXTable_rowreq_ctx * rowreq_ctx,
  118.                          void *user_init_ctx)
  119. {
  120.     DEBUGMSGTL(("verbose:ifXTable:ifXTable_rowreq_ctx_init", "calledn"));
  121.     netsnmp_assert(NULL != rowreq_ctx);
  122.     /*
  123.      * TODO:210:o: |-> Perform extra ifXTable rowreq initialization.
  124.      * should never get here - ifTable should handle this
  125.      */
  126.     netsnmp_assert(0);
  127.     return MFD_SUCCESS;
  128. }                               /* ifXTable_rowreq_ctx_init */
  129. /**
  130.  * extra context cleanup
  131.  *
  132.  */
  133. void
  134. ifXTable_rowreq_ctx_cleanup(ifXTable_rowreq_ctx * rowreq_ctx)
  135. {
  136.     DEBUGMSGTL(("verbose:ifXTable:ifXTable_rowreq_ctx_cleanup",
  137.                 "calledn"));
  138.     netsnmp_assert(NULL != rowreq_ctx);
  139.     /*
  140.      * TODO:211:o: |-> Perform extra ifXTable rowreq cleanup.
  141.      */
  142.     /*
  143.      * should never get here - ifTable should handle this
  144.      */
  145.     netsnmp_assert(0);
  146. }                               /* ifXTable_rowreq_ctx_cleanup */
  147. /**
  148.  * pre-request callback
  149.  *
  150.  *
  151.  * @retval MFD_SUCCESS              : success.
  152.  * @retval MFD_ERROR                : other error
  153.  */
  154. int
  155. ifXTable_pre_request(ifXTable_registration_ptr user_context)
  156. {
  157.     DEBUGMSGTL(("verbose:ifXTable:ifXTable_pre_request", "calledn"));
  158.     /*
  159.      * TODO:510:o: Perform ifXTable pre-request actions.
  160.      */
  161.     return MFD_SUCCESS;
  162. }                               /* ifXTable_pre_request */
  163. /**
  164.  * post-request callback
  165.  *
  166.  *
  167.  * @retval MFD_SUCCESS : success.
  168.  * @retval MFD_ERROR   : other error (ignored)
  169.  */
  170. int
  171. ifXTable_post_request(ifXTable_registration_ptr user_context)
  172. {
  173.     DEBUGMSGTL(("verbose:ifXTable:ifXTable_post_request", "calledn"));
  174.     /*
  175.      * TODO:511:o: Perform ifXTable pos-request actions.
  176.      */
  177.     return MFD_SUCCESS;
  178. }                               /* ifXTable_post_request */
  179. /**********************************************************************
  180.  **********************************************************************
  181.  ***
  182.  *** Table ifXTable
  183.  ***
  184.  **********************************************************************
  185.  **********************************************************************/
  186. /*
  187.  * ifXTable is subid 1 of ifMIBObjects.
  188.  * Its status is Current.
  189.  * OID: .1.3.6.1.2.1.31.1.1, length: 9
  190.  */
  191. /**
  192.  * set mib index(es)
  193.  *
  194.  * @param tbl_idx mib index structure
  195.  *
  196.  * @retval MFD_SUCCESS     : success.
  197.  * @retval MFD_ERROR       : other error.
  198.  *
  199.  * @remark
  200.  *  This convenience function is useful for setting all the MIB index
  201.  *  components with a single function call. It is assume that the C values
  202.  *  have already been mapped from their native/rawformat to the MIB format.
  203.  */
  204. int
  205. ifXTable_indexes_set_tbl_idx(ifXTable_mib_index * tbl_idx,
  206.                              long ifIndex_val)
  207. {
  208.     DEBUGMSGTL(("verbose:ifXTable:ifXTable_indexes_set_tbl_idx",
  209.                 "calledn"));
  210.     /*
  211.      * ifIndex(1)/InterfaceIndex/ASN_INTEGER/long(long)//l/A/w/e/R/d/H 
  212.      */
  213.     tbl_idx->ifIndex = ifIndex_val;
  214.     return MFD_SUCCESS;
  215. }                               /* ifXTable_indexes_set_tbl_idx */
  216. /**
  217.  * @internal
  218.  * set row context indexes
  219.  *
  220.  * @param reqreq_ctx the row context that needs updated indexes
  221.  *
  222.  * @retval MFD_SUCCESS     : success.
  223.  * @retval MFD_ERROR       : other error.
  224.  *
  225.  * @remark
  226.  *  This function sets the mib indexs, then updates the oid indexs
  227.  *  from the mib index.
  228.  */
  229. int
  230. ifXTable_indexes_set(ifXTable_rowreq_ctx * rowreq_ctx, long ifIndex_val)
  231. {
  232.     DEBUGMSGTL(("verbose:ifXTable:ifXTable_indexes_set", "calledn"));
  233.     if (MFD_SUCCESS !=
  234.         ifXTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx, ifIndex_val))
  235.         return MFD_ERROR;
  236.     /*
  237.      * convert mib index to oid index
  238.      */
  239.     rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
  240.     if (0 != ifXTable_index_to_oid(&rowreq_ctx->oid_idx,
  241.                                    &rowreq_ctx->tbl_idx)) {
  242.         return MFD_ERROR;
  243.     }
  244.     return MFD_SUCCESS;
  245. }                               /* ifXTable_indexes_set */
  246. /*---------------------------------------------------------------------
  247.  * IF-MIB::ifXEntry.ifName
  248.  * ifName is subid 1 of ifXEntry.
  249.  * Its status is Current, and its access level is ReadOnly.
  250.  * OID: .1.3.6.1.2.1.31.1.1.1.1
  251.  * Description:
  252. The textual name of the interface.  The value of this
  253.             object should be the name of the interface as assigned by
  254.             the local device and should be suitable for use in commands
  255.             entered at the device's `console'.  This might be a text
  256.             name, such as `le0' or a simple port number, such as `1',
  257.             depending on the interface naming syntax of the device.  If
  258.             several entries in the ifTable together represent a single
  259.             interface as named by the device, then each will have the
  260.             same value of ifName.  Note that for an agent which responds
  261.             to SNMP queries concerning an interface on some other
  262.             (proxied) device, then the value of ifName for such an
  263.             interface is the proxied device's local name for it.
  264.             If there is no local name, or this object is otherwise not
  265.             applicable, then this object contains a zero-length string.
  266.  *
  267.  * Attributes:
  268.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  269.  *   readable   1     iscolumn 1     ranges 1      hashint   1
  270.  *   settable   0
  271.  *   hint: 255a
  272.  *
  273.  * Ranges:  0 - 255;
  274.  *
  275.  * Its syntax is DisplayString (based on perltype OCTETSTR)
  276.  * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
  277.  * This data type requires a length.  (Max 255)
  278.  */
  279. /**
  280.  * Extract the current value of the ifName data.
  281.  *
  282.  * Set a value using the data context for the row.
  283.  *
  284.  * @param rowreq_ctx
  285.  *        Pointer to the row request context.
  286.  * @param ifName_val_ptr_ptr
  287.  *        Pointer to storage for a char variable
  288.  * @param ifName_val_ptr_len_ptr
  289.  *        Pointer to a size_t. On entry, it will contain the size (in bytes)
  290.  *        pointed to by ifName.
  291.  *        On exit, this value should contain the data size (in bytes).
  292.  *
  293.  * @retval MFD_SUCCESS         : success
  294.  * @retval MFD_SKIP            : skip this node (no value for now)
  295.  * @retval MFD_ERROR           : Any other error
  296. *
  297.  * @note If you need more than (*ifName_val_ptr_len_ptr) bytes of memory,
  298.  *       allocate it using malloc() and update ifName_val_ptr_ptr.
  299.  *       <b>DO NOT</b> free the previous pointer.
  300.  *       The MFD helper will release the memory you allocate.
  301.  *
  302.  * @remark If you call this function yourself, you are responsible
  303.  *         for checking if the pointer changed, and freeing any
  304.  *         previously allocated memory. (Not necessary if you pass
  305.  *         in a pointer to static memory, obviously.)
  306.  */
  307. int
  308. ifName_get(ifXTable_rowreq_ctx * rowreq_ctx, char **ifName_val_ptr_ptr,
  309.            size_t *ifName_val_ptr_len_ptr)
  310. {
  311.     int             tmp_len;
  312.    /** we should have a non-NULL pointer and enough storage */
  313.     netsnmp_assert((NULL != ifName_val_ptr_ptr)
  314.                    && (NULL != *ifName_val_ptr_ptr));
  315.     netsnmp_assert(NULL != ifName_val_ptr_len_ptr);
  316.     DEBUGMSGTL(("verbose:ifXTable:ifName_get", "calledn"));
  317.     netsnmp_assert(NULL != rowreq_ctx);
  318.     /*
  319.      * TODO:231:o: |-> Extract the current value of the ifName data.
  320.      * set (* ifName_val_ptr_ptr ) and (* ifName_val_ptr_len_ptr ) from rowreq_ctx->data
  321.      */
  322.     /*
  323.      * make sure there is enough space for ifName data
  324.      */
  325.     tmp_len = strlen(rowreq_ctx->data.ifName);
  326.     if ((NULL == (*ifName_val_ptr_ptr))
  327.         || ((*ifName_val_ptr_len_ptr) < tmp_len)) {
  328.         /*
  329.          * allocate space for ifName data
  330.          */
  331.         (*ifName_val_ptr_ptr) =
  332.             malloc(tmp_len * sizeof((*ifName_val_ptr_ptr)[0]));
  333.         if (NULL == (*ifName_val_ptr_ptr)) {
  334.             snmp_log(LOG_ERR, "could not allocate memoryn");
  335.             return MFD_ERROR;
  336.         }
  337.     }
  338.     (*ifName_val_ptr_len_ptr) = tmp_len;
  339.     memcpy((*ifName_val_ptr_ptr), rowreq_ctx->data.ifName,
  340.            (*ifName_val_ptr_len_ptr) * sizeof((*ifName_val_ptr_ptr)[0]));
  341.     return MFD_SUCCESS;
  342. }                               /* ifName_get */
  343. /*---------------------------------------------------------------------
  344.  * IF-MIB::ifXEntry.ifInMulticastPkts
  345.  * ifInMulticastPkts is subid 2 of ifXEntry.
  346.  * Its status is Current, and its access level is ReadOnly.
  347.  * OID: .1.3.6.1.2.1.31.1.1.1.2
  348.  * Description:
  349. The number of packets, delivered by this sub-layer to a
  350.             higher (sub-)layer, which were addressed to a multicast
  351.             address at this sub-layer.  For a MAC layer protocol, this
  352.             includes both Group and Functional addresses.
  353.             Discontinuities in the value of this counter can occur at
  354.             re-initialization of the management system, and at other
  355.             times as indicated by the value of
  356.             ifCounterDiscontinuityTime.
  357.  *
  358.  * Attributes:
  359.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  360.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  361.  *   settable   0
  362.  *
  363.  *
  364.  * Its syntax is COUNTER (based on perltype COUNTER)
  365.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  366.  */
  367. /**
  368.  * Extract the current value of the ifInMulticastPkts data.
  369.  *
  370.  * Set a value using the data context for the row.
  371.  *
  372.  * @param rowreq_ctx
  373.  *        Pointer to the row request context.
  374.  * @param ifInMulticastPkts_val_ptr
  375.  *        Pointer to storage for a u_long variable
  376.  *
  377.  * @retval MFD_SUCCESS         : success
  378.  * @retval MFD_SKIP            : skip this node (no value for now)
  379.  * @retval MFD_ERROR           : Any other error
  380.  */
  381. int
  382. ifInMulticastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
  383.                       u_long * ifInMulticastPkts_val_ptr)
  384. {
  385.    /** we should have a non-NULL pointer */
  386.     netsnmp_assert(NULL != ifInMulticastPkts_val_ptr);
  387.     DEBUGMSGTL(("verbose:ifXTable:ifInMulticastPkts_get", "calledn"));
  388.     netsnmp_assert(NULL != rowreq_ctx);
  389.     /*
  390.      * TODO:231:o: |-> Extract the current value of the ifInMulticastPkts data.
  391.      * set (* ifInMulticastPkts_val_ptr ) from rowreq_ctx->data
  392.      */
  393.     (*ifInMulticastPkts_val_ptr) = rowreq_ctx->data.ifInMulticastPkts;
  394.     return MFD_SUCCESS;
  395. }                               /* ifInMulticastPkts_get */
  396. /*---------------------------------------------------------------------
  397.  * IF-MIB::ifXEntry.ifInBroadcastPkts
  398.  * ifInBroadcastPkts is subid 3 of ifXEntry.
  399.  * Its status is Current, and its access level is ReadOnly.
  400.  * OID: .1.3.6.1.2.1.31.1.1.1.3
  401.  * Description:
  402. The number of packets, delivered by this sub-layer to a
  403.             higher (sub-)layer, which were addressed to a broadcast
  404.             address at this sub-layer.
  405.             Discontinuities in the value of this counter can occur at
  406.             re-initialization of the management system, and at other
  407.             times as indicated by the value of
  408.             ifCounterDiscontinuityTime.
  409.  *
  410.  * Attributes:
  411.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  412.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  413.  *   settable   0
  414.  *
  415.  *
  416.  * Its syntax is COUNTER (based on perltype COUNTER)
  417.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  418.  */
  419. /**
  420.  * Extract the current value of the ifInBroadcastPkts data.
  421.  *
  422.  * Set a value using the data context for the row.
  423.  *
  424.  * @param rowreq_ctx
  425.  *        Pointer to the row request context.
  426.  * @param ifInBroadcastPkts_val_ptr
  427.  *        Pointer to storage for a u_long variable
  428.  *
  429.  * @retval MFD_SUCCESS         : success
  430.  * @retval MFD_SKIP            : skip this node (no value for now)
  431.  * @retval MFD_ERROR           : Any other error
  432.  */
  433. int
  434. ifInBroadcastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
  435.                       u_long * ifInBroadcastPkts_val_ptr)
  436. {
  437.    /** we should have a non-NULL pointer */
  438.     netsnmp_assert(NULL != ifInBroadcastPkts_val_ptr);
  439.     DEBUGMSGTL(("verbose:ifXTable:ifInBroadcastPkts_get", "calledn"));
  440.     netsnmp_assert(NULL != rowreq_ctx);
  441.     /*
  442.      * TODO:231:o: |-> Extract the current value of the ifInBroadcastPkts data.
  443.      * set (* ifInBroadcastPkts_val_ptr ) from rowreq_ctx->data
  444.      */
  445.     (*ifInBroadcastPkts_val_ptr) = rowreq_ctx->data.ifInBroadcastPkts;
  446.     return MFD_SUCCESS;
  447. }                               /* ifInBroadcastPkts_get */
  448. /*---------------------------------------------------------------------
  449.  * IF-MIB::ifXEntry.ifOutMulticastPkts
  450.  * ifOutMulticastPkts is subid 4 of ifXEntry.
  451.  * Its status is Current, and its access level is ReadOnly.
  452.  * OID: .1.3.6.1.2.1.31.1.1.1.4
  453.  * Description:
  454. The total number of packets that higher-level protocols
  455.             requested be transmitted, and which were addressed to a
  456.             multicast address at this sub-layer, including those that
  457.             were discarded or not sent.  For a MAC layer protocol, this
  458.             includes both Group and Functional addresses.
  459.             Discontinuities in the value of this counter can occur at
  460.             re-initialization of the management system, and at other
  461.             times as indicated by the value of
  462.             ifCounterDiscontinuityTime.
  463.  *
  464.  * Attributes:
  465.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  466.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  467.  *   settable   0
  468.  *
  469.  *
  470.  * Its syntax is COUNTER (based on perltype COUNTER)
  471.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  472.  */
  473. /**
  474.  * Extract the current value of the ifOutMulticastPkts data.
  475.  *
  476.  * Set a value using the data context for the row.
  477.  *
  478.  * @param rowreq_ctx
  479.  *        Pointer to the row request context.
  480.  * @param ifOutMulticastPkts_val_ptr
  481.  *        Pointer to storage for a u_long variable
  482.  *
  483.  * @retval MFD_SUCCESS         : success
  484.  * @retval MFD_SKIP            : skip this node (no value for now)
  485.  * @retval MFD_ERROR           : Any other error
  486.  */
  487. int
  488. ifOutMulticastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
  489.                        u_long * ifOutMulticastPkts_val_ptr)
  490. {
  491.    /** we should have a non-NULL pointer */
  492.     netsnmp_assert(NULL != ifOutMulticastPkts_val_ptr);
  493.     DEBUGMSGTL(("verbose:ifXTable:ifOutMulticastPkts_get", "calledn"));
  494.     netsnmp_assert(NULL != rowreq_ctx);
  495.     /*
  496.      * TODO:231:o: |-> Extract the current value of the ifOutMulticastPkts data.
  497.      * set (* ifOutMulticastPkts_val_ptr ) from rowreq_ctx->data
  498.      */
  499.     (*ifOutMulticastPkts_val_ptr) = rowreq_ctx->data.ifOutMulticastPkts;
  500.     return MFD_SUCCESS;
  501. }                               /* ifOutMulticastPkts_get */
  502. /*---------------------------------------------------------------------
  503.  * IF-MIB::ifXEntry.ifOutBroadcastPkts
  504.  * ifOutBroadcastPkts is subid 5 of ifXEntry.
  505.  * Its status is Current, and its access level is ReadOnly.
  506.  * OID: .1.3.6.1.2.1.31.1.1.1.5
  507.  * Description:
  508. The total number of packets that higher-level protocols
  509.             requested be transmitted, and which were addressed to a
  510.             broadcast address at this sub-layer, including those that
  511.             were discarded or not sent.
  512.             Discontinuities in the value of this counter can occur at
  513.             re-initialization of the management system, and at other
  514.             times as indicated by the value of
  515.             ifCounterDiscontinuityTime.
  516.  *
  517.  * Attributes:
  518.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  519.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  520.  *   settable   0
  521.  *
  522.  *
  523.  * Its syntax is COUNTER (based on perltype COUNTER)
  524.  * The net-snmp type is ASN_COUNTER. The C type decl is u_long (u_long)
  525.  */
  526. /**
  527.  * Extract the current value of the ifOutBroadcastPkts data.
  528.  *
  529.  * Set a value using the data context for the row.
  530.  *
  531.  * @param rowreq_ctx
  532.  *        Pointer to the row request context.
  533.  * @param ifOutBroadcastPkts_val_ptr
  534.  *        Pointer to storage for a u_long variable
  535.  *
  536.  * @retval MFD_SUCCESS         : success
  537.  * @retval MFD_SKIP            : skip this node (no value for now)
  538.  * @retval MFD_ERROR           : Any other error
  539.  */
  540. int
  541. ifOutBroadcastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
  542.                        u_long * ifOutBroadcastPkts_val_ptr)
  543. {
  544.    /** we should have a non-NULL pointer */
  545.     netsnmp_assert(NULL != ifOutBroadcastPkts_val_ptr);
  546.     DEBUGMSGTL(("verbose:ifXTable:ifOutBroadcastPkts_get", "calledn"));
  547.     netsnmp_assert(NULL != rowreq_ctx);
  548.     /*
  549.      * TODO:231:o: |-> Extract the current value of the ifOutBroadcastPkts data.
  550.      * set (* ifOutBroadcastPkts_val_ptr ) from rowreq_ctx->data
  551.      */
  552.     (*ifOutBroadcastPkts_val_ptr) = rowreq_ctx->data.ifOutBroadcastPkts;
  553.     return MFD_SUCCESS;
  554. }                               /* ifOutBroadcastPkts_get */
  555. /*---------------------------------------------------------------------
  556.  * IF-MIB::ifXEntry.ifHCInOctets
  557.  * ifHCInOctets is subid 6 of ifXEntry.
  558.  * Its status is Current, and its access level is ReadOnly.
  559.  * OID: .1.3.6.1.2.1.31.1.1.1.6
  560.  * Description:
  561. The total number of octets received on the interface,
  562.             including framing characters.  This object is a 64-bit
  563.             version of ifInOctets.
  564.             Discontinuities in the value of this counter can occur at
  565.             re-initialization of the management system, and at other
  566.             times as indicated by the value of
  567.             ifCounterDiscontinuityTime.
  568.  *
  569.  * Attributes:
  570.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  571.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  572.  *   settable   0
  573.  *
  574.  *
  575.  * Its syntax is COUNTER64 (based on perltype COUNTER64)
  576.  * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
  577.  */
  578. /**
  579.  * Extract the current value of the ifHCInOctets data.
  580.  *
  581.  * Set a value using the data context for the row.
  582.  *
  583.  * @param rowreq_ctx
  584.  *        Pointer to the row request context.
  585.  * @param ifHCInOctets_val_ptr
  586.  *        Pointer to storage for a U64 variable
  587.  *
  588.  * @retval MFD_SUCCESS         : success
  589.  * @retval MFD_SKIP            : skip this node (no value for now)
  590.  * @retval MFD_ERROR           : Any other error
  591.  */
  592. int
  593. ifHCInOctets_get(ifXTable_rowreq_ctx * rowreq_ctx,
  594.                  U64 * ifHCInOctets_val_ptr)
  595. {
  596.    /** we should have a non-NULL pointer */
  597.     netsnmp_assert(NULL != ifHCInOctets_val_ptr);
  598.     /*
  599.      * TODO:231:o: |-> copy ifHCInOctets data.
  600.      * get (* ifHCInOctets_val_ptr ).low and (* ifHCInOctets_val_ptr ).high from rowreq_ctx->data
  601.      */
  602.     (*ifHCInOctets_val_ptr).high = rowreq_ctx->data.ifHCInOctets.high;
  603.     (*ifHCInOctets_val_ptr).low = rowreq_ctx->data.ifHCInOctets.low;
  604.     return MFD_SUCCESS;
  605. }                               /* ifHCInOctets_get */
  606. /*---------------------------------------------------------------------
  607.  * IF-MIB::ifXEntry.ifHCInUcastPkts
  608.  * ifHCInUcastPkts is subid 7 of ifXEntry.
  609.  * Its status is Current, and its access level is ReadOnly.
  610.  * OID: .1.3.6.1.2.1.31.1.1.1.7
  611.  * Description:
  612. The number of packets, delivered by this sub-layer to a
  613.             higher (sub-)layer, which were not addressed to a multicast
  614.             or broadcast address at this sub-layer.  This object is a
  615.             64-bit version of ifInUcastPkts.
  616.             Discontinuities in the value of this counter can occur at
  617.             re-initialization of the management system, and at other
  618.             times as indicated by the value of
  619.             ifCounterDiscontinuityTime.
  620.  *
  621.  * Attributes:
  622.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  623.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  624.  *   settable   0
  625.  *
  626.  *
  627.  * Its syntax is COUNTER64 (based on perltype COUNTER64)
  628.  * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
  629.  */
  630. /**
  631.  * Extract the current value of the ifHCInUcastPkts data.
  632.  *
  633.  * Set a value using the data context for the row.
  634.  *
  635.  * @param rowreq_ctx
  636.  *        Pointer to the row request context.
  637.  * @param ifHCInUcastPkts_val_ptr
  638.  *        Pointer to storage for a U64 variable
  639.  *
  640.  * @retval MFD_SUCCESS         : success
  641.  * @retval MFD_SKIP            : skip this node (no value for now)
  642.  * @retval MFD_ERROR           : Any other error
  643.  */
  644. int
  645. ifHCInUcastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
  646.                     U64 * ifHCInUcastPkts_val_ptr)
  647. {
  648.    /** we should have a non-NULL pointer */
  649.     netsnmp_assert(NULL != ifHCInUcastPkts_val_ptr);
  650.     /*
  651.      * TODO:231:o: |-> copy ifHCInUcastPkts data.
  652.      * get (* ifHCInUcastPkts_val_ptr ).low and (* ifHCInUcastPkts_val_ptr ).high from rowreq_ctx->data
  653.      */
  654.     (*ifHCInUcastPkts_val_ptr).high =
  655.         rowreq_ctx->data.ifHCInUcastPkts.high;
  656.     (*ifHCInUcastPkts_val_ptr).low = rowreq_ctx->data.ifHCInUcastPkts.low;
  657.     return MFD_SUCCESS;
  658. }                               /* ifHCInUcastPkts_get */
  659. /*---------------------------------------------------------------------
  660.  * IF-MIB::ifXEntry.ifHCInMulticastPkts
  661.  * ifHCInMulticastPkts is subid 8 of ifXEntry.
  662.  * Its status is Current, and its access level is ReadOnly.
  663.  * OID: .1.3.6.1.2.1.31.1.1.1.8
  664.  * Description:
  665. The number of packets, delivered by this sub-layer to a
  666.             higher (sub-)layer, which were addressed to a multicast
  667.             address at this sub-layer.  For a MAC layer protocol, this
  668.             includes both Group and Functional addresses.  This object
  669.             is a 64-bit version of ifInMulticastPkts.
  670.             Discontinuities in the value of this counter can occur at
  671.             re-initialization of the management system, and at other
  672.             times as indicated by the value of
  673.             ifCounterDiscontinuityTime.
  674.  *
  675.  * Attributes:
  676.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  677.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  678.  *   settable   0
  679.  *
  680.  *
  681.  * Its syntax is COUNTER64 (based on perltype COUNTER64)
  682.  * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
  683.  */
  684. /**
  685.  * Extract the current value of the ifHCInMulticastPkts data.
  686.  *
  687.  * Set a value using the data context for the row.
  688.  *
  689.  * @param rowreq_ctx
  690.  *        Pointer to the row request context.
  691.  * @param ifHCInMulticastPkts_val_ptr
  692.  *        Pointer to storage for a U64 variable
  693.  *
  694.  * @retval MFD_SUCCESS         : success
  695.  * @retval MFD_SKIP            : skip this node (no value for now)
  696.  * @retval MFD_ERROR           : Any other error
  697.  */
  698. int
  699. ifHCInMulticastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
  700.                         U64 * ifHCInMulticastPkts_val_ptr)
  701. {
  702.    /** we should have a non-NULL pointer */
  703.     netsnmp_assert(NULL != ifHCInMulticastPkts_val_ptr);
  704.     /*
  705.      * TODO:231:o: |-> copy ifHCInMulticastPkts data.
  706.      * get (* ifHCInMulticastPkts_val_ptr ).low and (* ifHCInMulticastPkts_val_ptr ).high from rowreq_ctx->data
  707.      */
  708.     (*ifHCInMulticastPkts_val_ptr).high =
  709.         rowreq_ctx->data.ifHCInMulticastPkts.high;
  710.     (*ifHCInMulticastPkts_val_ptr).low =
  711.         rowreq_ctx->data.ifHCInMulticastPkts.low;
  712.     return MFD_SUCCESS;
  713. }                               /* ifHCInMulticastPkts_get */
  714. /*---------------------------------------------------------------------
  715.  * IF-MIB::ifXEntry.ifHCInBroadcastPkts
  716.  * ifHCInBroadcastPkts is subid 9 of ifXEntry.
  717.  * Its status is Current, and its access level is ReadOnly.
  718.  * OID: .1.3.6.1.2.1.31.1.1.1.9
  719.  * Description:
  720. The number of packets, delivered by this sub-layer to a
  721.             higher (sub-)layer, which were addressed to a broadcast
  722.             address at this sub-layer.  This object is a 64-bit version
  723.             of ifInBroadcastPkts.
  724.             Discontinuities in the value of this counter can occur at
  725.             re-initialization of the management system, and at other
  726.             times as indicated by the value of
  727.             ifCounterDiscontinuityTime.
  728.  *
  729.  * Attributes:
  730.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  731.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  732.  *   settable   0
  733.  *
  734.  *
  735.  * Its syntax is COUNTER64 (based on perltype COUNTER64)
  736.  * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
  737.  */
  738. /**
  739.  * Extract the current value of the ifHCInBroadcastPkts data.
  740.  *
  741.  * Set a value using the data context for the row.
  742.  *
  743.  * @param rowreq_ctx
  744.  *        Pointer to the row request context.
  745.  * @param ifHCInBroadcastPkts_val_ptr
  746.  *        Pointer to storage for a U64 variable
  747.  *
  748.  * @retval MFD_SUCCESS         : success
  749.  * @retval MFD_SKIP            : skip this node (no value for now)
  750.  * @retval MFD_ERROR           : Any other error
  751.  */
  752. int
  753. ifHCInBroadcastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
  754.                         U64 * ifHCInBroadcastPkts_val_ptr)
  755. {
  756.    /** we should have a non-NULL pointer */
  757.     netsnmp_assert(NULL != ifHCInBroadcastPkts_val_ptr);
  758.     /*
  759.      * TODO:231:o: |-> copy ifHCInBroadcastPkts data.
  760.      * get (* ifHCInBroadcastPkts_val_ptr ).low and (* ifHCInBroadcastPkts_val_ptr ).high from rowreq_ctx->data
  761.      */
  762.     (*ifHCInBroadcastPkts_val_ptr).high =
  763.         rowreq_ctx->data.ifHCInBroadcastPkts.high;
  764.     (*ifHCInBroadcastPkts_val_ptr).low =
  765.         rowreq_ctx->data.ifHCInBroadcastPkts.low;
  766.     return MFD_SUCCESS;
  767. }                               /* ifHCInBroadcastPkts_get */
  768. /*---------------------------------------------------------------------
  769.  * IF-MIB::ifXEntry.ifHCOutOctets
  770.  * ifHCOutOctets is subid 10 of ifXEntry.
  771.  * Its status is Current, and its access level is ReadOnly.
  772.  * OID: .1.3.6.1.2.1.31.1.1.1.10
  773.  * Description:
  774. The total number of octets transmitted out of the
  775.             interface, including framing characters.  This object is a
  776.             64-bit version of ifOutOctets.
  777.             Discontinuities in the value of this counter can occur at
  778.             re-initialization of the management system, and at other
  779.             times as indicated by the value of
  780.             ifCounterDiscontinuityTime.
  781.  *
  782.  * Attributes:
  783.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  784.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  785.  *   settable   0
  786.  *
  787.  *
  788.  * Its syntax is COUNTER64 (based on perltype COUNTER64)
  789.  * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
  790.  */
  791. /**
  792.  * Extract the current value of the ifHCOutOctets data.
  793.  *
  794.  * Set a value using the data context for the row.
  795.  *
  796.  * @param rowreq_ctx
  797.  *        Pointer to the row request context.
  798.  * @param ifHCOutOctets_val_ptr
  799.  *        Pointer to storage for a U64 variable
  800.  *
  801.  * @retval MFD_SUCCESS         : success
  802.  * @retval MFD_SKIP            : skip this node (no value for now)
  803.  * @retval MFD_ERROR           : Any other error
  804.  */
  805. int
  806. ifHCOutOctets_get(ifXTable_rowreq_ctx * rowreq_ctx,
  807.                   U64 * ifHCOutOctets_val_ptr)
  808. {
  809.    /** we should have a non-NULL pointer */
  810.     netsnmp_assert(NULL != ifHCOutOctets_val_ptr);
  811.     /*
  812.      * TODO:231:o: |-> copy ifHCOutOctets data.
  813.      * get (* ifHCOutOctets_val_ptr ).low and (* ifHCOutOctets_val_ptr ).high from rowreq_ctx->data
  814.      */
  815.     (*ifHCOutOctets_val_ptr).high = rowreq_ctx->data.ifHCOutOctets.high;
  816.     (*ifHCOutOctets_val_ptr).low = rowreq_ctx->data.ifHCOutOctets.low;
  817.     return MFD_SUCCESS;
  818. }                               /* ifHCOutOctets_get */
  819. /*---------------------------------------------------------------------
  820.  * IF-MIB::ifXEntry.ifHCOutUcastPkts
  821.  * ifHCOutUcastPkts is subid 11 of ifXEntry.
  822.  * Its status is Current, and its access level is ReadOnly.
  823.  * OID: .1.3.6.1.2.1.31.1.1.1.11
  824.  * Description:
  825. The total number of packets that higher-level protocols
  826.             requested be transmitted, and which were not addressed to a
  827.             multicast or broadcast address at this sub-layer, including
  828.             those that were discarded or not sent.  This object is a
  829.             64-bit version of ifOutUcastPkts.
  830.             Discontinuities in the value of this counter can occur at
  831.             re-initialization of the management system, and at other
  832.             times as indicated by the value of
  833.             ifCounterDiscontinuityTime.
  834.  *
  835.  * Attributes:
  836.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  837.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  838.  *   settable   0
  839.  *
  840.  *
  841.  * Its syntax is COUNTER64 (based on perltype COUNTER64)
  842.  * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
  843.  */
  844. /**
  845.  * Extract the current value of the ifHCOutUcastPkts data.
  846.  *
  847.  * Set a value using the data context for the row.
  848.  *
  849.  * @param rowreq_ctx
  850.  *        Pointer to the row request context.
  851.  * @param ifHCOutUcastPkts_val_ptr
  852.  *        Pointer to storage for a U64 variable
  853.  *
  854.  * @retval MFD_SUCCESS         : success
  855.  * @retval MFD_SKIP            : skip this node (no value for now)
  856.  * @retval MFD_ERROR           : Any other error
  857.  */
  858. int
  859. ifHCOutUcastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
  860.                      U64 * ifHCOutUcastPkts_val_ptr)
  861. {
  862.    /** we should have a non-NULL pointer */
  863.     netsnmp_assert(NULL != ifHCOutUcastPkts_val_ptr);
  864.     /*
  865.      * TODO:231:o: |-> copy ifHCOutUcastPkts data.
  866.      * get (* ifHCOutUcastPkts_val_ptr ).low and (* ifHCOutUcastPkts_val_ptr ).high from rowreq_ctx->data
  867.      */
  868.     (*ifHCOutUcastPkts_val_ptr).high =
  869.         rowreq_ctx->data.ifHCOutUcastPkts.high;
  870.     (*ifHCOutUcastPkts_val_ptr).low =
  871.         rowreq_ctx->data.ifHCOutUcastPkts.low;
  872.     return MFD_SUCCESS;
  873. }                               /* ifHCOutUcastPkts_get */
  874. /*---------------------------------------------------------------------
  875.  * IF-MIB::ifXEntry.ifHCOutMulticastPkts
  876.  * ifHCOutMulticastPkts is subid 12 of ifXEntry.
  877.  * Its status is Current, and its access level is ReadOnly.
  878.  * OID: .1.3.6.1.2.1.31.1.1.1.12
  879.  * Description:
  880. The total number of packets that higher-level protocols
  881.             requested be transmitted, and which were addressed to a
  882.             multicast address at this sub-layer, including those that
  883.             were discarded or not sent.  For a MAC layer protocol, this
  884.             includes both Group and Functional addresses.  This object
  885.             is a 64-bit version of ifOutMulticastPkts.
  886.             Discontinuities in the value of this counter can occur at
  887.             re-initialization of the management system, and at other
  888.             times as indicated by the value of
  889.             ifCounterDiscontinuityTime.
  890.  *
  891.  * Attributes:
  892.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  893.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  894.  *   settable   0
  895.  *
  896.  *
  897.  * Its syntax is COUNTER64 (based on perltype COUNTER64)
  898.  * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
  899.  */
  900. /**
  901.  * Extract the current value of the ifHCOutMulticastPkts data.
  902.  *
  903.  * Set a value using the data context for the row.
  904.  *
  905.  * @param rowreq_ctx
  906.  *        Pointer to the row request context.
  907.  * @param ifHCOutMulticastPkts_val_ptr
  908.  *        Pointer to storage for a U64 variable
  909.  *
  910.  * @retval MFD_SUCCESS         : success
  911.  * @retval MFD_SKIP            : skip this node (no value for now)
  912.  * @retval MFD_ERROR           : Any other error
  913.  */
  914. int
  915. ifHCOutMulticastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
  916.                          U64 * ifHCOutMulticastPkts_val_ptr)
  917. {
  918.    /** we should have a non-NULL pointer */
  919.     netsnmp_assert(NULL != ifHCOutMulticastPkts_val_ptr);
  920.     /*
  921.      * TODO:231:o: |-> copy ifHCOutMulticastPkts data.
  922.      * get (* ifHCOutMulticastPkts_val_ptr ).low and (* ifHCOutMulticastPkts_val_ptr ).high from rowreq_ctx->data
  923.      */
  924.     (*ifHCOutMulticastPkts_val_ptr).high =
  925.         rowreq_ctx->data.ifHCOutMulticastPkts.high;
  926.     (*ifHCOutMulticastPkts_val_ptr).low =
  927.         rowreq_ctx->data.ifHCOutMulticastPkts.low;
  928.     return MFD_SUCCESS;
  929. }                               /* ifHCOutMulticastPkts_get */
  930. /*---------------------------------------------------------------------
  931.  * IF-MIB::ifXEntry.ifHCOutBroadcastPkts
  932.  * ifHCOutBroadcastPkts is subid 13 of ifXEntry.
  933.  * Its status is Current, and its access level is ReadOnly.
  934.  * OID: .1.3.6.1.2.1.31.1.1.1.13
  935.  * Description:
  936. The total number of packets that higher-level protocols
  937.             requested be transmitted, and which were addressed to a
  938.             broadcast address at this sub-layer, including those that
  939.             were discarded or not sent.  This object is a 64-bit version
  940.             of ifOutBroadcastPkts.
  941.             Discontinuities in the value of this counter can occur at
  942.             re-initialization of the management system, and at other
  943.             times as indicated by the value of
  944.             ifCounterDiscontinuityTime.
  945.  *
  946.  * Attributes:
  947.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  948.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  949.  *   settable   0
  950.  *
  951.  *
  952.  * Its syntax is COUNTER64 (based on perltype COUNTER64)
  953.  * The net-snmp type is ASN_COUNTER64. The C type decl is U64 (U64)
  954.  */
  955. /**
  956.  * Extract the current value of the ifHCOutBroadcastPkts data.
  957.  *
  958.  * Set a value using the data context for the row.
  959.  *
  960.  * @param rowreq_ctx
  961.  *        Pointer to the row request context.
  962.  * @param ifHCOutBroadcastPkts_val_ptr
  963.  *        Pointer to storage for a U64 variable
  964.  *
  965.  * @retval MFD_SUCCESS         : success
  966.  * @retval MFD_SKIP            : skip this node (no value for now)
  967.  * @retval MFD_ERROR           : Any other error
  968.  */
  969. int
  970. ifHCOutBroadcastPkts_get(ifXTable_rowreq_ctx * rowreq_ctx,
  971.                          U64 * ifHCOutBroadcastPkts_val_ptr)
  972. {
  973.    /** we should have a non-NULL pointer */
  974.     netsnmp_assert(NULL != ifHCOutBroadcastPkts_val_ptr);
  975.     /*
  976.      * TODO:231:o: |-> copy ifHCOutBroadcastPkts data.
  977.      * get (* ifHCOutBroadcastPkts_val_ptr ).low and (* ifHCOutBroadcastPkts_val_ptr ).high from rowreq_ctx->data
  978.      */
  979.     (*ifHCOutBroadcastPkts_val_ptr).high =
  980.         rowreq_ctx->data.ifHCOutBroadcastPkts.high;
  981.     (*ifHCOutBroadcastPkts_val_ptr).low =
  982.         rowreq_ctx->data.ifHCOutBroadcastPkts.low;
  983.     return MFD_SUCCESS;
  984. }                               /* ifHCOutBroadcastPkts_get */
  985. /*---------------------------------------------------------------------
  986.  * IF-MIB::ifXEntry.ifLinkUpDownTrapEnable
  987.  * ifLinkUpDownTrapEnable is subid 14 of ifXEntry.
  988.  * Its status is Current, and its access level is ReadWrite.
  989.  * OID: .1.3.6.1.2.1.31.1.1.1.14
  990.  * Description:
  991. Indicates whether linkUp/linkDown traps should be generated
  992.             for this interface.
  993.             By default, this object should have the value enabled(1) for
  994.             interfaces which do not operate on 'top' of any other
  995.             interface (as defined in the ifStackTable), and disabled(2)
  996.             otherwise.
  997.  *
  998.  * Attributes:
  999.  *   accessible 1     isscalar 0     enums  1      hasdefval 0
  1000.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1001.  *   settable   1
  1002.  *
  1003.  * Enum range: 2/8. Values:  enabled(1), disabled(2)
  1004.  *
  1005.  * Its syntax is INTEGER (based on perltype INTEGER)
  1006.  * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
  1007.  */
  1008. /**
  1009.  * Extract the current value of the ifLinkUpDownTrapEnable data.
  1010.  *
  1011.  * Set a value using the data context for the row.
  1012.  *
  1013.  * @param rowreq_ctx
  1014.  *        Pointer to the row request context.
  1015.  * @param ifLinkUpDownTrapEnable_val_ptr
  1016.  *        Pointer to storage for a long variable
  1017.  *
  1018.  * @retval MFD_SUCCESS         : success
  1019.  * @retval MFD_SKIP            : skip this node (no value for now)
  1020.  * @retval MFD_ERROR           : Any other error
  1021.  */
  1022. int
  1023. ifLinkUpDownTrapEnable_get(ifXTable_rowreq_ctx * rowreq_ctx,
  1024.                            u_long * ifLinkUpDownTrapEnable_val_ptr)
  1025. {
  1026.    /** we should have a non-NULL pointer */
  1027.     netsnmp_assert(NULL != ifLinkUpDownTrapEnable_val_ptr);
  1028.     DEBUGMSGTL(("verbose:ifXTable:ifLinkUpDownTrapEnable_get",
  1029.                 "calledn"));
  1030.     netsnmp_assert(NULL != rowreq_ctx);
  1031.     /*
  1032.      * TODO:231:o: |-> Extract the current value of the ifLinkUpDownTrapEnable data.
  1033.      * set (* ifLinkUpDownTrapEnable_val_ptr ) from rowreq_ctx->data
  1034.      */
  1035.     (*ifLinkUpDownTrapEnable_val_ptr) =
  1036.         rowreq_ctx->data.ifLinkUpDownTrapEnable;
  1037.     return MFD_SUCCESS;
  1038. }                               /* ifLinkUpDownTrapEnable_get */
  1039. /*---------------------------------------------------------------------
  1040.  * IF-MIB::ifXEntry.ifHighSpeed
  1041.  * ifHighSpeed is subid 15 of ifXEntry.
  1042.  * Its status is Current, and its access level is ReadOnly.
  1043.  * OID: .1.3.6.1.2.1.31.1.1.1.15
  1044.  * Description:
  1045. An estimate of the interface's current bandwidth in units
  1046.             of 1,000,000 bits per second.  If this object reports a
  1047.             value of `n' then the speed of the interface is somewhere in
  1048.             the range of `n-500,000' to `n+499,999'.  For interfaces
  1049.             which do not vary in bandwidth or for those where no
  1050.             accurate estimation can be made, this object should contain
  1051.             the nominal bandwidth.  For a sub-layer which has no concept
  1052.             of bandwidth, this object should be zero.
  1053.  *
  1054.  * Attributes:
  1055.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  1056.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1057.  *   settable   0
  1058.  *
  1059.  *
  1060.  * Its syntax is GAUGE (based on perltype GAUGE)
  1061.  * The net-snmp type is ASN_GAUGE. The C type decl is u_long (u_long)
  1062.  */
  1063. /**
  1064.  * Extract the current value of the ifHighSpeed data.
  1065.  *
  1066.  * Set a value using the data context for the row.
  1067.  *
  1068.  * @param rowreq_ctx
  1069.  *        Pointer to the row request context.
  1070.  * @param ifHighSpeed_val_ptr
  1071.  *        Pointer to storage for a u_long variable
  1072.  *
  1073.  * @retval MFD_SUCCESS         : success
  1074.  * @retval MFD_SKIP            : skip this node (no value for now)
  1075.  * @retval MFD_ERROR           : Any other error
  1076.  */
  1077. int
  1078. ifHighSpeed_get(ifXTable_rowreq_ctx * rowreq_ctx,
  1079.                 u_long * ifHighSpeed_val_ptr)
  1080. {
  1081.    /** we should have a non-NULL pointer */
  1082.     netsnmp_assert(NULL != ifHighSpeed_val_ptr);
  1083.     DEBUGMSGTL(("verbose:ifXTable:ifHighSpeed_get", "calledn"));
  1084.     netsnmp_assert(NULL != rowreq_ctx);
  1085.     /*
  1086.      * TODO:231:o: |-> Extract the current value of the ifHighSpeed data.
  1087.      * set (* ifHighSpeed_val_ptr ) from rowreq_ctx->data
  1088.      */
  1089.     (*ifHighSpeed_val_ptr) = rowreq_ctx->data.ifHighSpeed;
  1090.     return MFD_SUCCESS;
  1091. }                               /* ifHighSpeed_get */
  1092. /*---------------------------------------------------------------------
  1093.  * IF-MIB::ifXEntry.ifPromiscuousMode
  1094.  * ifPromiscuousMode is subid 16 of ifXEntry.
  1095.  * Its status is Current, and its access level is ReadWrite.
  1096.  * OID: .1.3.6.1.2.1.31.1.1.1.16
  1097.  * Description:
  1098. This object has a value of false(2) if this interface only
  1099.             accepts packets/frames that are addressed to this station.
  1100.             This object has a value of true(1) when the station accepts
  1101.             all packets/frames transmitted on the media.  The value
  1102.             true(1) is only legal on certain types of media.  If legal,
  1103.             setting this object to a value of true(1) may require the
  1104.             interface to be reset before becoming effective.
  1105.             The value of ifPromiscuousMode does not affect the reception
  1106.             of broadcast and multicast packets/frames by the interface.
  1107.  *
  1108.  * Attributes:
  1109.  *   accessible 1     isscalar 0     enums  1      hasdefval 0
  1110.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1111.  *   settable   1
  1112.  *
  1113.  * Enum range: 2/8. Values:  true(1), false(2)
  1114.  *
  1115.  * Its syntax is TruthValue (based on perltype INTEGER)
  1116.  * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
  1117.  */
  1118. /**
  1119.  * Extract the current value of the ifPromiscuousMode data.
  1120.  *
  1121.  * Set a value using the data context for the row.
  1122.  *
  1123.  * @param rowreq_ctx
  1124.  *        Pointer to the row request context.
  1125.  * @param ifPromiscuousMode_val_ptr
  1126.  *        Pointer to storage for a long variable
  1127.  *
  1128.  * @retval MFD_SUCCESS         : success
  1129.  * @retval MFD_SKIP            : skip this node (no value for now)
  1130.  * @retval MFD_ERROR           : Any other error
  1131.  */
  1132. int
  1133. ifPromiscuousMode_get(ifXTable_rowreq_ctx * rowreq_ctx,
  1134.                       u_long * ifPromiscuousMode_val_ptr)
  1135. {
  1136.    /** we should have a non-NULL pointer */
  1137.     netsnmp_assert(NULL != ifPromiscuousMode_val_ptr);
  1138.     DEBUGMSGTL(("verbose:ifXTable:ifPromiscuousMode_get", "calledn"));
  1139.     netsnmp_assert(NULL != rowreq_ctx);
  1140.     /*
  1141.      * TODO:231:o: |-> Extract the current value of the ifPromiscuousMode data.
  1142.      * set (* ifPromiscuousMode_val_ptr ) from rowreq_ctx->data
  1143.      */
  1144.     (*ifPromiscuousMode_val_ptr) = rowreq_ctx->data.ifPromiscuousMode;
  1145.     return MFD_SUCCESS;
  1146. }                               /* ifPromiscuousMode_get */
  1147. /*---------------------------------------------------------------------
  1148.  * IF-MIB::ifXEntry.ifConnectorPresent
  1149.  * ifConnectorPresent is subid 17 of ifXEntry.
  1150.  * Its status is Current, and its access level is ReadOnly.
  1151.  * OID: .1.3.6.1.2.1.31.1.1.1.17
  1152.  * Description:
  1153. This object has the value 'true(1)' if the interface
  1154.             sublayer has a physical connector and the value 'false(2)'
  1155.             otherwise.
  1156.  *
  1157.  * Attributes:
  1158.  *   accessible 1     isscalar 0     enums  1      hasdefval 0
  1159.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1160.  *   settable   0
  1161.  *
  1162.  * Enum range: 2/8. Values:  true(1), false(2)
  1163.  *
  1164.  * Its syntax is TruthValue (based on perltype INTEGER)
  1165.  * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
  1166.  */
  1167. /**
  1168.  * Extract the current value of the ifConnectorPresent data.
  1169.  *
  1170.  * Set a value using the data context for the row.
  1171.  *
  1172.  * @param rowreq_ctx
  1173.  *        Pointer to the row request context.
  1174.  * @param ifConnectorPresent_val_ptr
  1175.  *        Pointer to storage for a long variable
  1176.  *
  1177.  * @retval MFD_SUCCESS         : success
  1178.  * @retval MFD_SKIP            : skip this node (no value for now)
  1179.  * @retval MFD_ERROR           : Any other error
  1180.  */
  1181. int
  1182. ifConnectorPresent_get(ifXTable_rowreq_ctx * rowreq_ctx,
  1183.                        u_long * ifConnectorPresent_val_ptr)
  1184. {
  1185.    /** we should have a non-NULL pointer */
  1186.     netsnmp_assert(NULL != ifConnectorPresent_val_ptr);
  1187.     DEBUGMSGTL(("verbose:ifXTable:ifConnectorPresent_get", "calledn"));
  1188.     netsnmp_assert(NULL != rowreq_ctx);
  1189.     /*
  1190.      * TODO:231:o: |-> Extract the current value of the ifConnectorPresent data.
  1191.      * set (* ifConnectorPresent_val_ptr ) from rowreq_ctx->data
  1192.      */
  1193.     (*ifConnectorPresent_val_ptr) = rowreq_ctx->data.ifConnectorPresent;
  1194.     return MFD_SUCCESS;
  1195. }                               /* ifConnectorPresent_get */
  1196. /*---------------------------------------------------------------------
  1197.  * IF-MIB::ifXEntry.ifAlias
  1198.  * ifAlias is subid 18 of ifXEntry.
  1199.  * Its status is Current, and its access level is ReadWrite.
  1200.  * OID: .1.3.6.1.2.1.31.1.1.1.18
  1201.  * Description:
  1202. This object is an 'alias' name for the interface as
  1203.             specified by a network manager, and provides a non-volatile
  1204.             'handle' for the interface.
  1205.             On the first instantiation of an interface, the value of
  1206.             ifAlias associated with that interface is the zero-length
  1207.             string.  As and when a value is written into an instance of
  1208.             ifAlias through a network management set operation, then the
  1209.             agent must retain the supplied value in the ifAlias instance
  1210.             associated with the same interface for as long as that
  1211.             interface remains instantiated, including across all re-
  1212.             initializations/reboots of the network management system,
  1213.             including those which result in a change of the interface's
  1214.             ifIndex value.
  1215.             An example of the value which a network manager might store
  1216.             in this object for a WAN interface is the (Telco's) circuit
  1217.             number/identifier of the interface.
  1218.             Some agents may support write-access only for interfaces
  1219.             having particular values of ifType.  An agent which supports
  1220.             write access to this object is required to keep the value in
  1221.             non-volatile storage, but it may limit the length of new
  1222.             values depending on how much storage is already occupied by
  1223.             the current values for other interfaces.
  1224.  *
  1225.  * Attributes:
  1226.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  1227.  *   readable   1     iscolumn 1     ranges 1      hashint   1
  1228.  *   settable   1
  1229.  *   hint: 255a
  1230.  *
  1231.  * Ranges:  0 - 64;
  1232.  *
  1233.  * Its syntax is DisplayString (based on perltype OCTETSTR)
  1234.  * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
  1235.  * This data type requires a length.  (Max 64)
  1236.  */
  1237. /**
  1238.  * Extract the current value of the ifAlias data.
  1239.  *
  1240.  * Set a value using the data context for the row.
  1241.  *
  1242.  * @param rowreq_ctx
  1243.  *        Pointer to the row request context.
  1244.  * @param ifAlias_val_ptr_ptr
  1245.  *        Pointer to storage for a char variable
  1246.  * @param ifAlias_val_ptr_len_ptr
  1247.  *        Pointer to a size_t. On entry, it will contain the size (in bytes)
  1248.  *        pointed to by ifAlias.
  1249.  *        On exit, this value should contain the data size (in bytes).
  1250.  *
  1251.  * @retval MFD_SUCCESS         : success
  1252.  * @retval MFD_SKIP            : skip this node (no value for now)
  1253.  * @retval MFD_ERROR           : Any other error
  1254. *
  1255.  * @note If you need more than (*ifAlias_val_ptr_len_ptr) bytes of memory,
  1256.  *       allocate it using malloc() and update ifAlias_val_ptr_ptr.
  1257.  *       <b>DO NOT</b> free the previous pointer.
  1258.  *       The MFD helper will release the memory you allocate.
  1259.  *
  1260.  * @remark If you call this function yourself, you are responsible
  1261.  *         for checking if the pointer changed, and freeing any
  1262.  *         previously allocated memory. (Not necessary if you pass
  1263.  *         in a pointer to static memory, obviously.)
  1264.  */
  1265. int
  1266. ifAlias_get(ifXTable_rowreq_ctx * rowreq_ctx, char **ifAlias_val_ptr_ptr,
  1267.             size_t *ifAlias_val_ptr_len_ptr)
  1268. {
  1269.    /** we should have a non-NULL pointer and enough storage */
  1270.     netsnmp_assert((NULL != ifAlias_val_ptr_ptr)
  1271.                    && (NULL != *ifAlias_val_ptr_ptr));
  1272.     netsnmp_assert(NULL != ifAlias_val_ptr_len_ptr);
  1273.     DEBUGMSGTL(("verbose:ifXTable:ifAlias_get", "calledn"));
  1274.     netsnmp_assert(NULL != rowreq_ctx);
  1275.     /*
  1276.      * TODO:231:o: |-> Extract the current value of the ifAlias data.
  1277.      * set (* ifAlias_val_ptr_ptr ) and (* ifAlias_val_ptr_len_ptr ) from rowreq_ctx->data
  1278.      */
  1279.     /*
  1280.      * make sure there is enough space for ifAlias data
  1281.      */
  1282.     if ((NULL == (*ifAlias_val_ptr_ptr))
  1283.         || ((*ifAlias_val_ptr_len_ptr) < rowreq_ctx->data.ifAlias_len)) {
  1284.         /*
  1285.          * allocate space for ifAlias data
  1286.          */
  1287.         (*ifAlias_val_ptr_ptr) =
  1288.             malloc(rowreq_ctx->data.ifAlias_len *
  1289.                    sizeof((*ifAlias_val_ptr_ptr)[0]));
  1290.         if (NULL == (*ifAlias_val_ptr_ptr)) {
  1291.             snmp_log(LOG_ERR, "could not allocate memoryn");
  1292.             return MFD_ERROR;
  1293.         }
  1294.     }
  1295.     (*ifAlias_val_ptr_len_ptr) = rowreq_ctx->data.ifAlias_len;
  1296.     memcpy((*ifAlias_val_ptr_ptr), rowreq_ctx->data.ifAlias,
  1297.            (*ifAlias_val_ptr_len_ptr) * sizeof((*ifAlias_val_ptr_ptr)[0]));
  1298.     return MFD_SUCCESS;
  1299. }                               /* ifAlias_get */
  1300. /*---------------------------------------------------------------------
  1301.  * IF-MIB::ifXEntry.ifCounterDiscontinuityTime
  1302.  * ifCounterDiscontinuityTime is subid 19 of ifXEntry.
  1303.  * Its status is Current, and its access level is ReadOnly.
  1304.  * OID: .1.3.6.1.2.1.31.1.1.1.19
  1305.  * Description:
  1306. The value of sysUpTime on the most recent occasion at which
  1307.             any one or more of this interface's counters suffered a
  1308.             discontinuity.  The relevant counters are the specific
  1309.             instances associated with this interface of any Counter32 or
  1310.             Counter64 object contained in the ifTable or ifXTable.  If
  1311.             no such discontinuities have occurred since the last re-
  1312.             initialization of the local management subsystem, then this
  1313.             object contains a zero value.
  1314.  *
  1315.  * Attributes:
  1316.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  1317.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1318.  *   settable   0
  1319.  *
  1320.  *
  1321.  * Its syntax is TimeStamp (based on perltype TICKS)
  1322.  * The net-snmp type is ASN_TIMETICKS. The C type decl is u_long (u_long)
  1323.  */
  1324. /**
  1325.  * Extract the current value of the ifCounterDiscontinuityTime data.
  1326.  *
  1327.  * Set a value using the data context for the row.
  1328.  *
  1329.  * @param rowreq_ctx
  1330.  *        Pointer to the row request context.
  1331.  * @param ifCounterDiscontinuityTime_val_ptr
  1332.  *        Pointer to storage for a u_long variable
  1333.  *
  1334.  * @retval MFD_SUCCESS         : success
  1335.  * @retval MFD_SKIP            : skip this node (no value for now)
  1336.  * @retval MFD_ERROR           : Any other error
  1337.  */
  1338. int
  1339. ifCounterDiscontinuityTime_get(ifXTable_rowreq_ctx * rowreq_ctx,
  1340.                                u_long * ifCounterDiscontinuityTime_val_ptr)
  1341. {
  1342.    /** we should have a non-NULL pointer */
  1343.     netsnmp_assert(NULL != ifCounterDiscontinuityTime_val_ptr);
  1344.     DEBUGMSGTL(("verbose:ifXTable:ifCounterDiscontinuityTime_get",
  1345.                 "calledn"));
  1346.     netsnmp_assert(NULL != rowreq_ctx);
  1347.     /*
  1348.      * TODO:231:o: |-> Extract the current value of the ifCounterDiscontinuityTime data.
  1349.      * set (* ifCounterDiscontinuityTime_val_ptr ) from rowreq_ctx->data
  1350.      */
  1351.     (*ifCounterDiscontinuityTime_val_ptr) =
  1352.         rowreq_ctx->data.ifCounterDiscontinuityTime;
  1353.     return MFD_SUCCESS;
  1354. }                               /* ifCounterDiscontinuityTime_get */
  1355. /** @} */
  1356. /**********************************************************************
  1357.  **********************************************************************
  1358.  ***
  1359.  *** Table ifXTable
  1360.  ***
  1361.  **********************************************************************
  1362.  **********************************************************************/
  1363. /*
  1364.  * ifXTable is subid 1 of ifMIBObjects.
  1365.  * Its status is Current.
  1366.  * OID: .1.3.6.1.2.1.31.1.1, length: 9
  1367.  */
  1368.     /*
  1369.      * NOTE: if you update this chart, please update the versions in
  1370.      *       local/mib2c-conf.d/parent-set.m2i
  1371.      *       agent/mibgroup/helpers/baby_steps.c
  1372.      * while you're at it.
  1373.      */
  1374.     /*
  1375.      ***********************************************************************
  1376.      * Baby Steps Flow Chart (2004.06.05)                                  *
  1377.      *                                                                     *
  1378.      * +--------------+    +================+    U = unconditional path    *
  1379.      * |optional state|    ||required state||    S = path for success      *
  1380.      * +--------------+    +================+    E = path for error        *
  1381.      ***********************************************************************
  1382.      *
  1383.      *                        +--------------+
  1384.      *                        |     pre      |
  1385.      *                        |   request    |
  1386.      *                        +--------------+
  1387.      *                               | U
  1388.      *                        +==============+
  1389.      *       +----------------||  object    ||
  1390.      *       |              E ||  lookup    ||
  1391.      *       |                +==============+
  1392.      *       |                       | S
  1393.      *       |                +==============+
  1394.      *       |              E ||   check    ||
  1395.      *       |<---------------||   values   ||
  1396.      *       |                +==============+
  1397.      *       |                       | S
  1398.      *       |                +==============+
  1399.      *       |       +<-------||   undo     ||
  1400.      *       |       |      E ||   setup    ||
  1401.      *       |       |        +==============+
  1402.      *       |       |               | S
  1403.      *       |       |        +==============+
  1404.      *       |       |        ||    set     ||-------------------------->+
  1405.      *       |       |        ||   value    || E                         |
  1406.      *       |       |        +==============+                           |
  1407.      *       |       |               | S                                 |
  1408.      *       |       |        +--------------+                           |
  1409.      *       |       |        |    check     |-------------------------->|
  1410.      *       |       |        |  consistency | E                         |
  1411.      *       |       |        +--------------+                           |
  1412.      *       |       |               | S                                 |
  1413.      *       |       |        +==============+         +==============+  |
  1414.      *       |       |        ||   commit   ||-------->||     undo   ||  |
  1415.      *       |       |        ||            || E       ||    commit  ||  |
  1416.      *       |       |        +==============+         +==============+  |
  1417.      *       |       |               | S                     U |<--------+
  1418.      *       |       |        +--------------+         +==============+
  1419.      *       |       |        | irreversible |         ||    undo    ||
  1420.      *       |       |        |    commit    |         ||     set    ||
  1421.      *       |       |        +--------------+         +==============+
  1422.      *       |       |               | U                     U |
  1423.      *       |       +-------------->|<------------------------+
  1424.      *       |                +==============+
  1425.      *       |                ||   undo     ||
  1426.      *       |                ||  cleanup   ||
  1427.      *       |                +==============+
  1428.      *       +---------------------->| U
  1429.      *                        +--------------+
  1430.      *                        |    post      |
  1431.      *                        |   request    |
  1432.      *                        +--------------+
  1433.      *
  1434.      */
  1435. /**
  1436.  * Setup up context with information needed to undo a set request.
  1437.  *
  1438.  * This function will be called before the individual node undo setup
  1439.  * functions are called. If you need to do any undo setup that is not
  1440.  * related to a specific column, you can do it here.
  1441.  *
  1442.  * Note that the undo context has been allocated with
  1443.  * ifXTable_allocate_data(), but may need extra
  1444.  * initialization similar to what you may have done in
  1445.  * ifXTable_rowreq_ctx_init().
  1446.  * Note that an individual node's undo_setup function will only be called
  1447.  * if that node is being set to a new value.
  1448.  *
  1449.  * If there is any setup specific to a particular column (e.g. allocating
  1450.  * memory for a string), you should do that setup in the node's undo_setup
  1451.  * function, so it won't be done unless it is necessary.
  1452.  *
  1453.  * @param rowreq_ctx
  1454.  *        Pointer to the table context (ifXTable_rowreq_ctx)
  1455.  *
  1456.  * @retval MFD_SUCCESS : success
  1457.  * @retval MFD_ERROR   : error. set will fail.
  1458.  */
  1459. int
  1460. ifXTable_undo_setup(ifXTable_rowreq_ctx * rowreq_ctx)
  1461. {
  1462.     int             rc = MFD_SUCCESS;
  1463.     DEBUGMSGTL(("verbose:ifXTable:ifXTable_undo_setup", "calledn"));
  1464.     /** we should have a non-NULL pointer */
  1465.     netsnmp_assert(NULL != rowreq_ctx);
  1466.     /*
  1467.      * TODO:451:M: |-> Setup ifXTable undo.
  1468.      * set up ifXTable undo information, in preparation for a set.
  1469.      */
  1470.     return rc;
  1471. }                               /* ifXTable_undo_setup */
  1472. /**
  1473.  * Cleanup up context undo information.
  1474.  *
  1475.  * This function will be called after set/commit processing. If you
  1476.  * allocated any resources in undo_setup, this is the place to release
  1477.  * those resources.
  1478.  *
  1479.  * This function is called regardless of the success or failure of the set
  1480.  * request. If you need to perform different steps for cleanup depending
  1481.  * on success or failure, you can add a flag to the rowreq_ctx.
  1482.  *
  1483.  * @param rowreq_ctx
  1484.  *        Pointer to the table context (ifXTable_rowreq_ctx)
  1485.  *
  1486.  * @retval MFD_SUCCESS : success
  1487.  * @retval MFD_ERROR   : error
  1488.  */
  1489. int
  1490. ifXTable_undo_cleanup(ifXTable_rowreq_ctx * rowreq_ctx)
  1491. {
  1492.     int             rc = MFD_SUCCESS;
  1493.     DEBUGMSGTL(("verbose:ifXTable:ifXTable_undo_cleanup", "calledn"));
  1494.     /** we should have a non-NULL pointer */
  1495.     netsnmp_assert(NULL != rowreq_ctx);
  1496.     /*
  1497.      * TODO:452:M: |-> Cleanup ifXTable undo.
  1498.      */
  1499.     return rc;
  1500. }                               /* ifXTable_undo_cleanup */
  1501. /**
  1502.  * commit new values.
  1503.  *
  1504.  * At this point, you should have done everything you can to ensure that
  1505.  * this commit will not fail.
  1506.  *
  1507.  * Should you need different behavior depending on which columns were
  1508.  * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
  1509.  * set. The definitions for the FLAG_* bits can be found in
  1510.  * ifXTable.h.
  1511.  * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
  1512.  *
  1513.  * @param ifXTable_rowreq_ctx
  1514.  *        Pointer to the users context.
  1515.  *
  1516.  * @retval MFD_SUCCESS : success
  1517.  * @retval MFD_ERROR   : error
  1518.  */
  1519. int
  1520. ifXTable_commit(ifXTable_rowreq_ctx * rowreq_ctx)
  1521. {
  1522.     int             rc = MFD_SUCCESS;
  1523.     int             save_flags;
  1524.     DEBUGMSGTL(("verbose:ifXTable:ifXTable_commit", "calledn"));
  1525.     /** we should have a non-NULL pointer */
  1526.     netsnmp_assert(NULL != rowreq_ctx);
  1527.     /*
  1528.      * save flags, then clear until we actually do something
  1529.      */
  1530.     save_flags = rowreq_ctx->column_set_flags;
  1531.     rowreq_ctx->column_set_flags = 0;
  1532.     /*
  1533.      * commit ifXTable data
  1534.      * 1) check the column's flag in save_flags to see if it was set.
  1535.      * 2) clear the flag when you handle that column
  1536.      * 3) set the column's flag in column_set_flags if it needs undo
  1537.      *    processing in case of a failure.
  1538.      *
  1539.      * this is where one would usually commit data. In this case,
  1540.      * ifLinkUpDownTrapEnable and ifAlias are purely internal, so
  1541.      * nothing needs to be done. That leaves ifPromiscuosMode,
  1542.      * which I'm leery about implementing. Thus, at this point,
  1543.      * there is nothing to do except twiddle flag bits.
  1544.      *
  1545.      * in keeping with the net-snmp persistence policy, changes are kept
  1546.      * in memory, and saved to disk when the agent shuts down.
  1547.      */
  1548.     if (save_flags & FLAG_IFLINKUPDOWNTRAPENABLE) {
  1549.         save_flags &= ~FLAG_IFLINKUPDOWNTRAPENABLE;     /* clear ifLinkUpDownTrapEnable */
  1550.         /*
  1551.          * TODO:482:o: |-> commit column ifLinkUpDownTrapEnable.
  1552.          */
  1553.         /*
  1554.          * set flag, in case we need to undo ifLinkUpDownTrapEnable
  1555.          */
  1556.         rowreq_ctx->column_set_flags |= FLAG_IFLINKUPDOWNTRAPENABLE;
  1557.     }
  1558.     if (save_flags & FLAG_IFPROMISCUOUSMODE) {
  1559.         save_flags &= ~FLAG_IFPROMISCUOUSMODE;  /* clear ifPromiscuousMode */
  1560. #ifdef NETSNMP_ENABLE_PROMISCUOUSMODE_SET
  1561.         /*
  1562.          * TODO:482:o: |-> commit column ifPromiscuousMode.
  1563.          */
  1564.         rc = -1;
  1565.         if (-1 == rc) {
  1566.             snmp_log(LOG_ERR,
  1567.                      "ifXTable column ifPromiscuousMode commit failedn");
  1568.         } else {
  1569.             /*
  1570.              * set flag, in case we need to undo ifPromiscuousMode
  1571.              */
  1572.             rowreq_ctx->column_set_flags |= FLAG_IFPROMISCUOUSMODE;
  1573.         }
  1574. #endif
  1575.     }
  1576.     if (save_flags & FLAG_IFALIAS) {
  1577.         save_flags &= ~FLAG_IFALIAS;    /* clear ifAlias */
  1578.         /*
  1579.          * TODO:482:o: |-> commit column ifAlias.
  1580.          */
  1581.         /*
  1582.          * set flag, in case we need to undo ifAlias
  1583.          */
  1584.         rowreq_ctx->column_set_flags |= FLAG_IFALIAS;
  1585.     }
  1586.     if (save_flags) {
  1587.         snmp_log(LOG_ERR, "unhandled columns (0x%x) in commitn",
  1588.                  save_flags);
  1589.         return MFD_ERROR;
  1590.     }
  1591.     return rc;
  1592. }                               /* ifXTable_commit */
  1593. /**
  1594.  * undo commit new values.
  1595.  *
  1596.  * Should you need different behavior depending on which columns were
  1597.  * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
  1598.  * set. The definitions for the FLAG_* bits can be found in
  1599.  * ifXTable.h.
  1600.  * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
  1601.  *
  1602.  * @param ifXTable_rowreq_ctx
  1603.  *        Pointer to the users context.
  1604.  *
  1605.  * @retval MFD_SUCCESS : success
  1606.  * @retval MFD_ERROR   : error
  1607.  */
  1608. int
  1609. ifXTable_undo_commit(ifXTable_rowreq_ctx * rowreq_ctx)
  1610. {
  1611.     int             rc = MFD_SUCCESS;
  1612.     DEBUGMSGTL(("verbose:ifXTable:ifXTable_undo_commit", "calledn"));
  1613.     /** we should have a non-NULL pointer */
  1614.     netsnmp_assert(NULL != rowreq_ctx);
  1615.     /*
  1616.      * TODO:485:M: |-> Undo ifXTable commit.
  1617.      * check the column's flag in rowreq_ctx->column_set_flags to see
  1618.      * if it was set during commit, then undo it.
  1619.      *
  1620.      * eg: if (rowreq_ctx->column_set_flags & FLAG_) {}
  1621.      */
  1622.     return rc;
  1623. }                               /* ifXTable_undo_commit */
  1624. /*
  1625.  * TODO:420:r: Implement ifXTable index validation.
  1626.  */
  1627. /*---------------------------------------------------------------------
  1628.  * IF-MIB::ifEntry.ifIndex
  1629.  * ifIndex is subid 1 of ifEntry.
  1630.  * Its status is Current, and its access level is ReadOnly.
  1631.  * OID: .1.3.6.1.2.1.2.2.1.1
  1632.  * Description:
  1633. A unique value, greater than zero, for each interface.  It
  1634.             is recommended that values are assigned contiguously
  1635.             starting from 1.  The value for each interface sub-layer
  1636.             must remain constant at least from one re-initialization of
  1637.             the entity's network management system to the next re-
  1638.             initialization.
  1639.  *
  1640.  * Attributes:
  1641.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  1642.  *   readable   1     iscolumn 1     ranges 1      hashint   1
  1643.  *   settable   0
  1644.  *   hint: d
  1645.  *
  1646.  * Ranges:  1 - 2147483647;
  1647.  *
  1648.  * Its syntax is InterfaceIndex (based on perltype INTEGER32)
  1649.  * The net-snmp type is ASN_INTEGER. The C type decl is long (long)
  1650.  */
  1651. /*
  1652.  * TODO:440:M: Implement ifXTable node value checks.
  1653.  * TODO:450:M: Implement ifXTable undo functions.
  1654.  * TODO:460:M: Implement ifXTable set functions.
  1655.  * TODO:480:M: Implement ifXTable commit functions.
  1656.  */
  1657. /*---------------------------------------------------------------------
  1658.  * IF-MIB::ifXEntry.ifLinkUpDownTrapEnable
  1659.  * ifLinkUpDownTrapEnable is subid 14 of ifXEntry.
  1660.  * Its status is Current, and its access level is ReadWrite.
  1661.  * OID: .1.3.6.1.2.1.31.1.1.1.14
  1662.  * Description:
  1663. Indicates whether linkUp/linkDown traps should be generated
  1664.             for this interface.
  1665.             By default, this object should have the value enabled(1) for
  1666.             interfaces which do not operate on 'top' of any other
  1667.             interface (as defined in the ifStackTable), and disabled(2)
  1668.             otherwise.
  1669.  *
  1670.  * Attributes:
  1671.  *   accessible 1     isscalar 0     enums  1      hasdefval 0
  1672.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1673.  *   settable   1
  1674.  *
  1675.  * Enum range: 2/8. Values:  enabled(1), disabled(2)
  1676.  *
  1677.  * Its syntax is INTEGER (based on perltype INTEGER)
  1678.  * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
  1679.  */
  1680. /**
  1681.  * Check that the proposed new value is potentially valid.
  1682.  *
  1683.  * @param rowreq_ctx
  1684.  *        Pointer to the row request context.
  1685.  * @param ifLinkUpDownTrapEnable_val
  1686.  *        A long containing the new value.
  1687.  *
  1688.  * @retval MFD_SUCCESS        : incoming value is legal
  1689.  * @retval MFD_NOT_VALID_NOW  : incoming value is not valid now
  1690.  * @retval MFD_NOT_VALID_EVER : incoming value is never valid
  1691.  *
  1692.  * This is the place to check for requirements that are not
  1693.  * expressed in the mib syntax (for example, a requirement that
  1694.  * is detailed in the description for an object).
  1695.  *
  1696.  * You should check that the requested change between the undo value and the
  1697.  * new value is legal (ie, the transistion from one value to another
  1698.  * is legal).
  1699.  *      
  1700.  *@note
  1701.  * This check is only to determine if the new value
  1702.  * is b potentially valid. This is the first check of many, and
  1703.  * is one of the simplest ones.
  1704.  * 
  1705.  *@note
  1706.  * this is not the place to do any checks for values
  1707.  * which depend on some other value in the mib. Those
  1708.  * types of checks should be done in the
  1709.  * ifXTable_check_dependencies() function.
  1710.  *
  1711.  * The following checks have already been done for you:
  1712.  *    The syntax is ASN_INTEGER
  1713.  *    The value is one of  enabled(1), disabled(2)
  1714.  *
  1715.  * If there a no other checks you need to do, simply return MFD_SUCCESS.
  1716.  *
  1717.  */
  1718. int
  1719. ifLinkUpDownTrapEnable_check_value(ifXTable_rowreq_ctx * rowreq_ctx,
  1720.                                    u_long ifLinkUpDownTrapEnable_val)
  1721. {
  1722.     DEBUGMSGTL(("verbose:ifXTable:ifLinkUpDownTrapEnable_check_value",
  1723.                 "calledn"));
  1724.     /** should never get a NULL pointer */
  1725.     netsnmp_assert(NULL != rowreq_ctx);
  1726.     /*
  1727.      * TODO:441:o: |-> Check for valid ifLinkUpDownTrapEnable value.
  1728.      */
  1729.     return MFD_SUCCESS;         /* ifLinkUpDownTrapEnable value not illegal */
  1730. }                               /* ifLinkUpDownTrapEnable_check_value */
  1731. /**
  1732.  * Save old value information
  1733.  *
  1734.  * @param rowreq_ctx
  1735.  *        Pointer to the table context (ifXTable_rowreq_ctx)
  1736.  *
  1737.  * @retval MFD_SUCCESS : success
  1738.  * @retval MFD_ERROR   : error. set will fail.
  1739.  *
  1740.  * This function will be called after the table level undo setup function
  1741.  * ifXTable_undo_setup has been called.
  1742.  *
  1743.  *@note
  1744.  * this function will only be called if a new value is set for this column.
  1745.  *
  1746.  * If there is any setup specific to a particular column (e.g. allocating
  1747.  * memory for a string), you should do that setup in this function, so it
  1748.  * won't be done unless it is necessary.
  1749.  */
  1750. int
  1751. ifLinkUpDownTrapEnable_undo_setup(ifXTable_rowreq_ctx * rowreq_ctx)
  1752. {
  1753.     DEBUGMSGTL(("verbose:ifXTable:ifLinkUpDownTrapEnable_undo_setup",
  1754.                 "calledn"));
  1755.     /** should never get a NULL pointer */
  1756.     netsnmp_assert(NULL != rowreq_ctx);
  1757.     /*
  1758.      * TODO:455:o: |-> Setup ifLinkUpDownTrapEnable undo.
  1759.      */
  1760.     /*
  1761.      * copy ifLinkUpDownTrapEnable data
  1762.      * set rowreq_ctx->undo->ifLinkUpDownTrapEnable from rowreq_ctx->data.ifLinkUpDownTrapEnable
  1763.      */
  1764.     rowreq_ctx->undo->ifLinkUpDownTrapEnable =
  1765.         rowreq_ctx->data.ifLinkUpDownTrapEnable;
  1766.     return MFD_SUCCESS;
  1767. }                               /* ifLinkUpDownTrapEnable_undo_setup */
  1768. /**
  1769.  * Set the new value.
  1770.  *
  1771.  * @param rowreq_ctx
  1772.  *        Pointer to the users context. You should know how to
  1773.  *        manipulate the value from this object.
  1774.  * @param ifLinkUpDownTrapEnable_val
  1775.  *        A long containing the new value.
  1776.  */
  1777. int
  1778. ifLinkUpDownTrapEnable_set(ifXTable_rowreq_ctx * rowreq_ctx,
  1779.                            u_long ifLinkUpDownTrapEnable_val)
  1780. {
  1781.     DEBUGMSGTL(("verbose:ifXTable:ifLinkUpDownTrapEnable_set",
  1782.                 "calledn"));
  1783.     /** should never get a NULL pointer */
  1784.     netsnmp_assert(NULL != rowreq_ctx);
  1785.     /*
  1786.      * TODO:461:M: |-> Set ifLinkUpDownTrapEnable value.
  1787.      * set ifLinkUpDownTrapEnable value in rowreq_ctx->data
  1788.      */
  1789.     rowreq_ctx->data.ifLinkUpDownTrapEnable = ifLinkUpDownTrapEnable_val;
  1790.     return MFD_SUCCESS;
  1791. }                               /* ifLinkUpDownTrapEnable_set */
  1792. /**
  1793.  * undo the previous set.
  1794.  *
  1795.  * @param rowreq_ctx
  1796.  *        Pointer to the users context.
  1797.  */
  1798. int
  1799. ifLinkUpDownTrapEnable_undo(ifXTable_rowreq_ctx * rowreq_ctx)
  1800. {
  1801.     DEBUGMSGTL(("verbose:ifXTable:ifLinkUpDownTrapEnable_undo",
  1802.                 "calledn"));
  1803.     netsnmp_assert(NULL != rowreq_ctx);
  1804.     /*
  1805.      * TODO:456:o: |-> Clean up ifLinkUpDownTrapEnable undo.
  1806.      */
  1807.     /*
  1808.      * copy ifLinkUpDownTrapEnable data
  1809.      * set rowreq_ctx->data.ifLinkUpDownTrapEnable from rowreq_ctx->undo->ifLinkUpDownTrapEnable
  1810.      */
  1811.     rowreq_ctx->data.ifLinkUpDownTrapEnable =
  1812.         rowreq_ctx->undo->ifLinkUpDownTrapEnable;
  1813.     return MFD_SUCCESS;
  1814. }                               /* ifLinkUpDownTrapEnable_undo */
  1815. /*---------------------------------------------------------------------
  1816.  * IF-MIB::ifXEntry.ifPromiscuousMode
  1817.  * ifPromiscuousMode is subid 16 of ifXEntry.
  1818.  * Its status is Current, and its access level is ReadWrite.
  1819.  * OID: .1.3.6.1.2.1.31.1.1.1.16
  1820.  * Description:
  1821. This object has a value of false(2) if this interface only
  1822.             accepts packets/frames that are addressed to this station.
  1823.             This object has a value of true(1) when the station accepts
  1824.             all packets/frames transmitted on the media.  The value
  1825.             true(1) is only legal on certain types of media.  If legal,
  1826.             setting this object to a value of true(1) may require the
  1827.             interface to be reset before becoming effective.
  1828.             The value of ifPromiscuousMode does not affect the reception
  1829.             of broadcast and multicast packets/frames by the interface.
  1830.  *
  1831.  * Attributes:
  1832.  *   accessible 1     isscalar 0     enums  1      hasdefval 0
  1833.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  1834.  *   settable   1
  1835.  *
  1836.  * Enum range: 2/8. Values:  true(1), false(2)
  1837.  *
  1838.  * Its syntax is TruthValue (based on perltype INTEGER)
  1839.  * The net-snmp type is ASN_INTEGER. The C type decl is long (u_long)
  1840.  */
  1841. /**
  1842.  * Check that the proposed new value is potentially valid.
  1843.  *
  1844.  * @param rowreq_ctx
  1845.  *        Pointer to the row request context.
  1846.  * @param ifPromiscuousMode_val
  1847.  *        A long containing the new value.
  1848.  *
  1849.  * @retval MFD_SUCCESS        : incoming value is legal
  1850.  * @retval MFD_NOT_VALID_NOW  : incoming value is not valid now
  1851.  * @retval MFD_NOT_VALID_EVER : incoming value is never valid
  1852.  *
  1853.  * This is the place to check for requirements that are not
  1854.  * expressed in the mib syntax (for example, a requirement that
  1855.  * is detailed in the description for an object).
  1856.  *
  1857.  * You should check that the requested change between the undo value and the
  1858.  * new value is legal (ie, the transistion from one value to another
  1859.  * is legal).
  1860.  *      
  1861.  *@note
  1862.  * This check is only to determine if the new value
  1863.  * is b potentially valid. This is the first check of many, and
  1864.  * is one of the simplest ones.
  1865.  * 
  1866.  *@note
  1867.  * this is not the place to do any checks for values
  1868.  * which depend on some other value in the mib. Those
  1869.  * types of checks should be done in the
  1870.  * ifXTable_check_dependencies() function.
  1871.  *
  1872.  * The following checks have already been done for you:
  1873.  *    The syntax is ASN_INTEGER
  1874.  *    The value is one of  true(1), false(2)
  1875.  *
  1876.  * If there a no other checks you need to do, simply return MFD_SUCCESS.
  1877.  *
  1878.  */
  1879. int
  1880. ifPromiscuousMode_check_value(ifXTable_rowreq_ctx * rowreq_ctx,
  1881.                               u_long ifPromiscuousMode_val)
  1882. {
  1883.     DEBUGMSGTL(("verbose:ifXTable:ifPromiscuousMode_check_value",
  1884.                 "calledn"));
  1885.     /** should never get a NULL pointer */
  1886.     netsnmp_assert(NULL != rowreq_ctx);
  1887.     /*
  1888.      * TODO:441:o: |-> Check for valid ifPromiscuousMode value.
  1889.      */
  1890.     return MFD_SUCCESS;         /* ifPromiscuousMode value not illegal */
  1891. }                               /* ifPromiscuousMode_check_value */
  1892. /**
  1893.  * Save old value information
  1894.  *
  1895.  * @param rowreq_ctx
  1896.  *        Pointer to the table context (ifXTable_rowreq_ctx)
  1897.  *
  1898.  * @retval MFD_SUCCESS : success
  1899.  * @retval MFD_ERROR   : error. set will fail.
  1900.  *
  1901.  * This function will be called after the table level undo setup function
  1902.  * ifXTable_undo_setup has been called.
  1903.  *
  1904.  *@note
  1905.  * this function will only be called if a new value is set for this column.
  1906.  *
  1907.  * If there is any setup specific to a particular column (e.g. allocating
  1908.  * memory for a string), you should do that setup in this function, so it
  1909.  * won't be done unless it is necessary.
  1910.  */
  1911. int
  1912. ifPromiscuousMode_undo_setup(ifXTable_rowreq_ctx * rowreq_ctx)
  1913. {
  1914.     DEBUGMSGTL(("verbose:ifXTable:ifPromiscuousMode_undo_setup",
  1915.                 "calledn"));
  1916.     /** should never get a NULL pointer */
  1917.     netsnmp_assert(NULL != rowreq_ctx);
  1918.     /*
  1919.      * TODO:455:o: |-> Setup ifPromiscuousMode undo.
  1920.      */
  1921.     /*
  1922.      * copy ifPromiscuousMode data
  1923.      * set rowreq_ctx->undo->ifPromiscuousMode from rowreq_ctx->data.ifPromiscuousMode
  1924.      */
  1925.     rowreq_ctx->undo->ifPromiscuousMode =
  1926.         rowreq_ctx->data.ifPromiscuousMode;
  1927. #ifdef NETSNMP_ENABLE_PROMISCUOUSMODE_SET
  1928.     return MFD_SUCCESS;
  1929. #else
  1930.     return MFD_NOT_VALID_EVER;
  1931. #endif
  1932. }                               /* ifPromiscuousMode_undo_setup */
  1933. /**
  1934.  * Set the new value.
  1935.  *
  1936.  * @param rowreq_ctx
  1937.  *        Pointer to the users context. You should know how to
  1938.  *        manipulate the value from this object.
  1939.  * @param ifPromiscuousMode_val
  1940.  *        A long containing the new value.
  1941.  */
  1942. int
  1943. ifPromiscuousMode_set(ifXTable_rowreq_ctx * rowreq_ctx,
  1944.                       u_long ifPromiscuousMode_val)
  1945. {
  1946.     DEBUGMSGTL(("verbose:ifXTable:ifPromiscuousMode_set", "calledn"));
  1947.     /** should never get a NULL pointer */
  1948.     netsnmp_assert(NULL != rowreq_ctx);
  1949.     /*
  1950.      * TODO:461:M: |-> Set ifPromiscuousMode value.
  1951.      * set ifPromiscuousMode value in rowreq_ctx->data
  1952.      */
  1953.     rowreq_ctx->data.ifPromiscuousMode = ifPromiscuousMode_val;
  1954.     return MFD_SUCCESS;
  1955. }                               /* ifPromiscuousMode_set */
  1956. /**
  1957.  * undo the previous set.
  1958.  *
  1959.  * @param rowreq_ctx
  1960.  *        Pointer to the users context.
  1961.  */
  1962. int
  1963. ifPromiscuousMode_undo(ifXTable_rowreq_ctx * rowreq_ctx)
  1964. {
  1965.     DEBUGMSGTL(("verbose:ifXTable:ifPromiscuousMode_undo", "calledn"));
  1966.     netsnmp_assert(NULL != rowreq_ctx);
  1967.     /*
  1968.      * TODO:456:o: |-> Clean up ifPromiscuousMode undo.
  1969.      */
  1970.     /*
  1971.      * copy ifPromiscuousMode data
  1972.      * set rowreq_ctx->data.ifPromiscuousMode from rowreq_ctx->undo->ifPromiscuousMode
  1973.      */
  1974.     rowreq_ctx->data.ifPromiscuousMode =
  1975.         rowreq_ctx->undo->ifPromiscuousMode;
  1976.     return MFD_SUCCESS;
  1977. }                               /* ifPromiscuousMode_undo */
  1978. /*---------------------------------------------------------------------
  1979.  * IF-MIB::ifXEntry.ifAlias
  1980.  * ifAlias is subid 18 of ifXEntry.
  1981.  * Its status is Current, and its access level is ReadWrite.
  1982.  * OID: .1.3.6.1.2.1.31.1.1.1.18
  1983.  * Description:
  1984. This object is an 'alias' name for the interface as
  1985.             specified by a network manager, and provides a non-volatile
  1986.             'handle' for the interface.
  1987.             On the first instantiation of an interface, the value of
  1988.             ifAlias associated with that interface is the zero-length
  1989.             string.  As and when a value is written into an instance of
  1990.             ifAlias through a network management set operation, then the
  1991.             agent must retain the supplied value in the ifAlias instance
  1992.             associated with the same interface for as long as that
  1993.             interface remains instantiated, including across all re-
  1994.             initializations/reboots of the network management system,
  1995.             including those which result in a change of the interface's
  1996.             ifIndex value.
  1997.             An example of the value which a network manager might store
  1998.             in this object for a WAN interface is the (Telco's) circuit
  1999.             number/identifier of the interface.
  2000.             Some agents may support write-access only for interfaces
  2001.             having particular values of ifType.  An agent which supports
  2002.             write access to this object is required to keep the value in
  2003.             non-volatile storage, but it may limit the length of new
  2004.             values depending on how much storage is already occupied by
  2005.             the current values for other interfaces.
  2006.  *
  2007.  * Attributes:
  2008.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  2009.  *   readable   1     iscolumn 1     ranges 1      hashint   1
  2010.  *   settable   1
  2011.  *   hint: 255a
  2012.  *
  2013.  * Ranges:  0 - 64;
  2014.  *
  2015.  * Its syntax is DisplayString (based on perltype OCTETSTR)
  2016.  * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
  2017.  * This data type requires a length.  (Max 64)
  2018.  */
  2019. /**
  2020.  * Check that the proposed new value is potentially valid.
  2021.  *
  2022.  * @param rowreq_ctx
  2023.  *        Pointer to the row request context.
  2024.  * @param ifAlias_val_ptr
  2025.  *        A char containing the new value.
  2026.  * @param ifAlias_val_ptr_len
  2027.  *        The size (in bytes) of the data pointed to by ifAlias_val_ptr
  2028.  *
  2029.  * @retval MFD_SUCCESS        : incoming value is legal
  2030.  * @retval MFD_NOT_VALID_NOW  : incoming value is not valid now
  2031.  * @retval MFD_NOT_VALID_EVER : incoming value is never valid
  2032.  *
  2033.  * This is the place to check for requirements that are not
  2034.  * expressed in the mib syntax (for example, a requirement that
  2035.  * is detailed in the description for an object).
  2036.  *
  2037.  * You should check that the requested change between the undo value and the
  2038.  * new value is legal (ie, the transistion from one value to another
  2039.  * is legal).
  2040.  *      
  2041.  *@note
  2042.  * This check is only to determine if the new value
  2043.  * is b potentially valid. This is the first check of many, and
  2044.  * is one of the simplest ones.
  2045.  * 
  2046.  *@note
  2047.  * this is not the place to do any checks for values
  2048.  * which depend on some other value in the mib. Those
  2049.  * types of checks should be done in the
  2050.  * ifXTable_check_dependencies() function.
  2051.  *
  2052.  * The following checks have already been done for you:
  2053.  *    The syntax is ASN_OCTET_STR
  2054.  *    The length is in (one of) the range set(s):  0 - 64
  2055.  *
  2056.  * If there a no other checks you need to do, simply return MFD_SUCCESS.
  2057.  *
  2058.  */
  2059. int
  2060. ifAlias_check_value(ifXTable_rowreq_ctx * rowreq_ctx,
  2061.                     char *ifAlias_val_ptr, size_t ifAlias_val_ptr_len)
  2062. {
  2063.     DEBUGMSGTL(("verbose:ifXTable:ifAlias_check_value", "calledn"));
  2064.     /** should never get a NULL pointer */
  2065.     netsnmp_assert(NULL != rowreq_ctx);
  2066.     netsnmp_assert(NULL != ifAlias_val_ptr);
  2067.     /*
  2068.      * TODO:441:o: |-> Check for valid ifAlias value.
  2069.      */
  2070.     return MFD_SUCCESS;         /* ifAlias value not illegal */
  2071. }                               /* ifAlias_check_value */
  2072. /**
  2073.  * Save old value information
  2074.  *
  2075.  * @param rowreq_ctx
  2076.  *        Pointer to the table context (ifXTable_rowreq_ctx)
  2077.  *
  2078.  * @retval MFD_SUCCESS : success
  2079.  * @retval MFD_ERROR   : error. set will fail.
  2080.  *
  2081.  * This function will be called after the table level undo setup function
  2082.  * ifXTable_undo_setup has been called.
  2083.  *
  2084.  *@note
  2085.  * this function will only be called if a new value is set for this column.
  2086.  *
  2087.  * If there is any setup specific to a particular column (e.g. allocating
  2088.  * memory for a string), you should do that setup in this function, so it
  2089.  * won't be done unless it is necessary.
  2090.  */
  2091. int
  2092. ifAlias_undo_setup(ifXTable_rowreq_ctx * rowreq_ctx)
  2093. {
  2094.     DEBUGMSGTL(("verbose:ifXTable:ifAlias_undo_setup", "calledn"));
  2095.     /** should never get a NULL pointer */
  2096.     netsnmp_assert(NULL != rowreq_ctx);
  2097.     /*
  2098.      * TODO:455:o: |-> Setup ifAlias undo.
  2099.      */
  2100.     /*
  2101.      * copy ifAlias and ifAlias_len data
  2102.      * set rowreq_ctx->undo->ifAlias from rowreq_ctx->data.ifAlias
  2103.      */
  2104.     memcpy(rowreq_ctx->undo->ifAlias, rowreq_ctx->data.ifAlias,
  2105.            (rowreq_ctx->data.ifAlias_len *
  2106.             sizeof(rowreq_ctx->undo->ifAlias[0])));
  2107.     rowreq_ctx->undo->ifAlias_len = rowreq_ctx->data.ifAlias_len;
  2108.     return MFD_SUCCESS;
  2109. }                               /* ifAlias_undo_setup */
  2110. /**
  2111.  * Set the new value.
  2112.  *
  2113.  * @param rowreq_ctx
  2114.  *        Pointer to the users context. You should know how to
  2115.  *        manipulate the value from this object.
  2116.  * @param ifAlias_val_ptr
  2117.  *        A char containing the new value.
  2118.  * @param ifAlias_val_ptr_len
  2119.  *        The size (in bytes) of the data pointed to by ifAlias_val_ptr
  2120.  */
  2121. int
  2122. ifAlias_set(ifXTable_rowreq_ctx * rowreq_ctx, char *ifAlias_val_ptr,
  2123.             size_t ifAlias_val_ptr_len)
  2124. {
  2125.     DEBUGMSGTL(("verbose:ifXTable:ifAlias_set", "calledn"));
  2126.     /** should never get a NULL pointer */
  2127.     netsnmp_assert(NULL != rowreq_ctx);
  2128.     netsnmp_assert(NULL != ifAlias_val_ptr);
  2129.     /*
  2130.      * TODO:461:M: |-> Set ifAlias value.
  2131.      * set ifAlias value in rowreq_ctx->data
  2132.      */
  2133.     memcpy(rowreq_ctx->data.ifAlias, ifAlias_val_ptr,
  2134.            ifAlias_val_ptr_len * sizeof(ifAlias_val_ptr[0]));
  2135.     rowreq_ctx->data.ifAlias_len = ifAlias_val_ptr_len;
  2136.     return MFD_SUCCESS;
  2137. }                               /* ifAlias_set */
  2138. /**
  2139.  * undo the previous set.
  2140.  *
  2141.  * @param rowreq_ctx
  2142.  *        Pointer to the users context.
  2143.  */
  2144. int
  2145. ifAlias_undo(ifXTable_rowreq_ctx * rowreq_ctx)
  2146. {
  2147.     DEBUGMSGTL(("verbose:ifXTable:ifAlias_undo", "calledn"));
  2148.     netsnmp_assert(NULL != rowreq_ctx);
  2149.     /*
  2150.      * TODO:456:o: |-> Clean up ifAlias undo.
  2151.      */
  2152.     /*
  2153.      * copy ifAlias and ifAlias_len data
  2154.      * set rowreq_ctx->data.ifAlias from rowreq_ctx->undo->ifAlias
  2155.      */
  2156.     memcpy(rowreq_ctx->data.ifAlias, rowreq_ctx->undo->ifAlias,
  2157.            (rowreq_ctx->undo->ifAlias_len *
  2158.             sizeof(rowreq_ctx->data.ifAlias[0])));
  2159.     rowreq_ctx->data.ifAlias_len = rowreq_ctx->undo->ifAlias_len;
  2160.     return MFD_SUCCESS;
  2161. }                               /* ifAlias_undo */
  2162. /**
  2163.  * check dependencies
  2164.  *
  2165.  * This is useful for for tables which have dependencies between columns
  2166.  * (or rows, or tables). For example, two columns allocating a percentage
  2167.  * of something add up 100%.
  2168.  *
  2169.  * Should you need different behavior depending on which columns were
  2170.  * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
  2171.  * set. The definitions for the FLAG_* bits can be found in
  2172.  * ifXTable.h.
  2173.  * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
  2174.  *
  2175.  * @retval MFD_SUCCESS all the changes to the row are legal
  2176.  * @retval MFD_ERROR   one or more changes are not legal
  2177.  *
  2178.  * (see README-table-ifXTable if you don't have dependencies)
  2179.  */
  2180. int
  2181. ifXTable_check_dependencies(ifXTable_rowreq_ctx * rowreq_ctx)
  2182. {
  2183.     int             rc = MFD_SUCCESS;
  2184.     DEBUGMSGTL(("internal:ifXTable:ifXTable_check_dependencies",
  2185.                 "calledn"));
  2186.     netsnmp_assert(NULL != rowreq_ctx);
  2187.     /*
  2188.      * TODO:470:o: Check ifXTable row dependencies.
  2189.      * check that all new value are legal and consistent with each other
  2190.      */
  2191.     return rc;
  2192. }                               /* ifXTable_check_dependencies */
  2193. /** @} */
  2194. /** @{ */
  2195. int
  2196. _ifXTable_row_save(ifXTable_rowreq_ctx * rowreq_ctx, void *type)
  2197. {
  2198.     char           *buf, *line;
  2199.     int             size;
  2200.     netsnmp_assert(NULL != rowreq_ctx);
  2201.     /*
  2202.      * allocate space for data. Remeber, data will be stored in
  2203.      * ASCII form, so you need to allow for that. Here are some
  2204.      * general guidelines:
  2205.      *
  2206.      * Object ID :  12 * len (ASCII len of max int + 1 for .)
  2207.      * Octet String: (2 * len) + 2 (2 ASCII chars per byte + "0x")
  2208.      * Integers :  12 (ASCII len for smallest negative number)
  2209.      */
  2210.     size = sizeof(row_token) + 1 +      /* 'ifXTable ' */
  2211.         13 +                    /* ifIndex value + ' ' */
  2212.         13 +                    /* col #, + ':' */
  2213.         (rowreq_ctx->data.ifAlias_len * 2) + 2 +      /* [0|1] + ' ' */
  2214.         4;                      /* 'n' & possible quoting */
  2215.     /*
  2216.      * allocate memory for the line
  2217.      */
  2218.     line = buf = calloc(1, size);
  2219.     if (NULL == buf) {
  2220.         snmp_log(LOG_ERR, "error allocating memory while saving rown");
  2221.         return SNMP_ERR_GENERR;
  2222.     }
  2223.     /*
  2224.      * build the line
  2225.      */
  2226.     buf += sprintf(buf, "%s ", row_token);
  2227.     buf = read_config_save_objid(buf, rowreq_ctx->oid_idx.oids,
  2228.                                  rowreq_ctx->oid_idx.len);
  2229.     if (NULL == buf) {
  2230.         snmp_log(LOG_ERR, "error saving row to persistent filen");
  2231.         free(line);
  2232.         return SNMP_ERR_GENERR;
  2233.     }
  2234.     *buf++ = ' ';
  2235.     /*
  2236.      * prefix with column number, so we don't ever depend on
  2237.      * order saved.
  2238.      */
  2239.     buf += sprintf(buf, "%u:", COLUMN_IFALIAS);
  2240.     buf = read_config_save_octet_string(buf, rowreq_ctx->data.ifAlias,
  2241.                                         rowreq_ctx->data.ifAlias_len);
  2242.     *buf++ = ' ';
  2243.     /*
  2244.      * prefix with column number, so we don't ever depend on
  2245.      * order saved.
  2246.      */
  2247.     buf += sprintf(buf, "%u:%1lu ", COLUMN_IFLINKUPDOWNTRAPENABLE,
  2248.                    rowreq_ctx->data.ifLinkUpDownTrapEnable);
  2249.     /*
  2250.      * terminate and store the line
  2251.      */
  2252.     sprintf(buf, "%cn", LINE_TERM_CHAR);
  2253.     DEBUGMSGTL(("ifXTable:save", "saving line '%s'n", line));
  2254.     read_config_store((char *) type, line);
  2255.     /*
  2256.      * free memory
  2257.      */
  2258.     free(line);
  2259.     return SNMP_ERR_NOERROR;
  2260. }
  2261. static int
  2262. _ifXTable_save(int majorID, int minorID, void *serverarg, void *clientarg)
  2263. {
  2264.     char           *appname = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID,
  2265.                                                     NETSNMP_DS_LIB_APPTYPE);
  2266.     /*
  2267.      * save all rows
  2268.      */
  2269.     CONTAINER_FOR_EACH((netsnmp_container *) clientarg,
  2270.                        (netsnmp_container_obj_func *)
  2271.                        _ifXTable_row_save, appname);
  2272.     /*
  2273.      * never fails 
  2274.      */
  2275.     return SNMPERR_SUCCESS;
  2276. }
  2277. static void
  2278. _ifXTable_restore(const char *token, char *buf)
  2279. {
  2280.     ifXTable_rowreq_ctx *context;
  2281.     netsnmp_container *container;
  2282.     netsnmp_index   index;
  2283.     u_int           col, len;
  2284.     if (strncmp(token, row_token, sizeof(row_token)) != 0) {
  2285.         snmp_log(LOG_ERR, "unknown token in _ifXTable_restoren");
  2286.         return;
  2287.     }
  2288.     container = _ifXTable_container_get();
  2289.     if (NULL == container) {
  2290.         snmp_log(LOG_ERR, "null container in _ifXTable_restoren");
  2291.         return;
  2292.     }
  2293.     DEBUGMSGTL(("ifXTable:restore", "parsing line '%s'n", buf));
  2294.     /*
  2295.      * pull out index and find row
  2296.      */
  2297.     index.oids = NULL;
  2298.     buf = read_config_read_objid(buf, &index.oids, &index.len);
  2299.     if (NULL == buf) {
  2300.         snmp_log(LOG_ERR,
  2301.                  "error reading row index in _ifXTable_restoren");
  2302.         return;
  2303.     }
  2304.     context = CONTAINER_FIND(container, &index);
  2305.     if (NULL == context) {
  2306.         snmp_log(LOG_ERR,
  2307.                  "error finding row index in _ifXTable_restoren");
  2308.         return;
  2309.     }
  2310.     /*
  2311.      * get each column
  2312.      */
  2313.     buf = skip_white(buf);
  2314.     if ((NULL == buf) || !isdigit(*buf)) {
  2315.         snmp_log(LOG_ERR, "unexpected format1 in _ifXTable_restoren");
  2316.         return;
  2317.     }
  2318.     /*
  2319.      * extract column, skip ':'
  2320.      */
  2321.     col = (u_int) strtol(buf, &buf, 10);
  2322.     if ((NULL == buf) || (*buf != ':') || (COLUMN_IFALIAS != col)) {
  2323.         snmp_log(LOG_ERR, "unexpected format2 in _ifXTable_restoren");
  2324.         return;
  2325.     }
  2326.     ++buf;                      /* skip : */
  2327.     /*
  2328.      * parse value
  2329.      */
  2330.     DEBUGMSGTL(("ifXTable:restore", "parsing column %dn", col));
  2331.     context->data.ifAlias_len = sizeof(context->data.ifAlias);
  2332.     buf = read_config_read_memory(ASN_OCTET_STR, buf,
  2333.                                   (char *) &context->data.ifAlias,
  2334.                                   (size_t *) &context->data.ifAlias_len);
  2335.     /*
  2336.      * extract column, skip ':'
  2337.      */
  2338.     col = (u_int) strtol(buf, &buf, 10);
  2339.     if ((NULL == buf) || (*buf != ':') ||
  2340.         (COLUMN_IFLINKUPDOWNTRAPENABLE != col)) {
  2341.         snmp_log(LOG_ERR, "unexpected format3 in _ifXTable_restoren");
  2342.         return;
  2343.     }
  2344.     ++buf;                      /* skip : */
  2345.     /*
  2346.      * parse value
  2347.      */
  2348.     DEBUGMSGTL(("ifXTable:restore", "parsing column %dn", col));
  2349.     len = sizeof(context->data.ifLinkUpDownTrapEnable);
  2350.     buf = read_config_read_memory(ASN_INTEGER, buf,
  2351.                                   (char *) &context->data.
  2352.                                   ifLinkUpDownTrapEnable, &len);
  2353.     /*
  2354.      * if the pointer is NULL and we didn't reach the
  2355.      * end of the line, something went wrong. Log message,
  2356.      * delete the row and bail.
  2357.      */
  2358.     if ((buf == NULL) || (*buf != LINE_TERM_CHAR)) {
  2359.         snmp_log(LOG_ERR, "unexpected format4 in _ifXTable_restoren");
  2360.         return;
  2361.     }
  2362. }