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

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * Note: this file originally auto-generated by mib2c using
  3.  *       version : 1.12 $ of : mfd-data-access.m2c,v $ 
  4.  *
  5.  * $Id: ipSystemStatsTable_data_access.c,v 1.6 2004/10/18 03:53:20 rstory Exp $
  6.  */
  7. /*
  8.  * standard Net-SNMP includes 
  9.  */
  10. #include <net-snmp/net-snmp-config.h>
  11. #include <net-snmp/net-snmp-includes.h>
  12. #include <net-snmp/agent/net-snmp-agent-includes.h>
  13. /*
  14.  * include our parent header 
  15.  */
  16. #include "ipSystemStatsTable.h"
  17. #include "ipSystemStatsTable_data_access.h"
  18. static int      ipss_cache_refresh = 30;
  19. /** @defgroup data_access data_access: Routines to access data
  20.  *
  21.  * These routines are used to locate the data used to satisfy
  22.  * requests.
  23.  * 
  24.  * @{
  25.  */
  26. /**********************************************************************
  27.  **********************************************************************
  28.  ***
  29.  *** Table ipSystemStatsTable
  30.  ***
  31.  **********************************************************************
  32.  **********************************************************************/
  33. /*
  34.  * ipSystemStatsTable is subid 1 of ipTrafficStats.
  35.  * Its status is Current.
  36.  * OID: .1.3.6.1.2.1.4.31.1, length: 9
  37.  */
  38. /**
  39.  * initialization for ipSystemStatsTable data access
  40.  *
  41.  * This function is called during startup to allow you to
  42.  * allocate any resources you need for the data table.
  43.  *
  44.  * @param ipSystemStatsTable_reg
  45.  *        Pointer to ipSystemStatsTable_registration
  46.  *
  47.  * @retval MFD_SUCCESS : success.
  48.  * @retval MFD_ERROR   : unrecoverable error.
  49.  */
  50. int
  51. ipSystemStatsTable_init_data(ipSystemStatsTable_registration_ptr
  52.                              ipSystemStatsTable_reg)
  53. {
  54.     static unsigned int my_columns[] = {
  55.         COLUMN_IPSYSTEMSTATSINRECEIVES, COLUMN_IPSYSTEMSTATSHCINRECEIVES,
  56.         /** COLUMN_IPSYSTEMSTATSINOCTETS, */
  57.         COLUMN_IPSYSTEMSTATSHCINOCTETS,
  58.         COLUMN_IPSYSTEMSTATSINHDRERRORS,
  59.         /** COLUMN_IPSYSTEMSTATSINNOROUTES, */
  60.         COLUMN_IPSYSTEMSTATSINADDRERRORS,
  61.         COLUMN_IPSYSTEMSTATSINUNKNOWNPROTOS,
  62.         /** COLUMN_IPSYSTEMSTATSINTRUNCATEDPKTS, */
  63.         COLUMN_IPSYSTEMSTATSINFORWDATAGRAMS,
  64.         COLUMN_IPSYSTEMSTATSHCINFORWDATAGRAMS,
  65.         COLUMN_IPSYSTEMSTATSREASMREQDS,
  66.         COLUMN_IPSYSTEMSTATSREASMOKS, COLUMN_IPSYSTEMSTATSREASMFAILS,
  67.         COLUMN_IPSYSTEMSTATSINDISCARDS, COLUMN_IPSYSTEMSTATSINDELIVERS,
  68.         COLUMN_IPSYSTEMSTATSHCINDELIVERS, COLUMN_IPSYSTEMSTATSOUTREQUESTS,
  69.         COLUMN_IPSYSTEMSTATSHCOUTREQUESTS, COLUMN_IPSYSTEMSTATSOUTNOROUTES,
  70.         /** COLUMN_IPSYSTEMSTATSOUTFORWDATAGRAMS, */
  71.         COLUMN_IPSYSTEMSTATSHCOUTFORWDATAGRAMS,
  72.         COLUMN_IPSYSTEMSTATSOUTDISCARDS,
  73.         /** COLUMN_IPSYSTEMSTATSOUTFRAGREQDS, */
  74.         COLUMN_IPSYSTEMSTATSOUTFRAGOKS, COLUMN_IPSYSTEMSTATSOUTFRAGFAILS,
  75.         COLUMN_IPSYSTEMSTATSOUTFRAGCREATES,
  76.         /** COLUMN_IPSYSTEMSTATSOUTTRANSMITS, */
  77.         /** COLUMN_IPSYSTEMSTATSHCOUTTRANSMITS, */
  78.         /** COLUMN_IPSYSTEMSTATSOUTOCTETS, */
  79.         /** COLUMN_IPSYSTEMSTATSHCOUTOCTETS, */
  80.         /** COLUMN_IPSYSTEMSTATSINMCASTPKTS, */
  81.         /** COLUMN_IPSYSTEMSTATSHCINMCASTPKTS, */
  82.         /** COLUMN_IPSYSTEMSTATSINMCASTOCTETS, */
  83.         /** COLUMN_IPSYSTEMSTATSHCINMCASTOCTETS, */
  84.         /** COLUMN_IPSYSTEMSTATSOUTMCASTPKTS, */
  85.         /** COLUMN_IPSYSTEMSTATSHCOUTMCASTPKTS, */
  86.         /** COLUMN_IPSYSTEMSTATSOUTMCASTOCTETS, */
  87.         /** COLUMN_IPSYSTEMSTATSHCOUTMCASTOCTETS, */
  88.         /** COLUMN_IPSYSTEMSTATSINBCASTPKTS, */
  89.         /** COLUMN_IPSYSTEMSTATSHCINBCASTPKTS, */
  90.         /** COLUMN_IPSYSTEMSTATSOUTBCASTPKTS, */
  91.         /** COLUMN_IPSYSTEMSTATSHCOUTBCASTPKTS, */
  92.         COLUMN_IPSYSTEMSTATSDISCONTINUITYTIME,
  93.         COLUMN_IPSYSTEMSTATSREFRESHRATE
  94.     };
  95.     static netsnmp_column_info valid_columns;
  96.     DEBUGMSGTL(("verbose:ipSystemStatsTable:ipSystemStatsTable_init_data",
  97.                 "calledn"));
  98.     /*
  99.      * we only want to process certain columns, and ignore
  100.      * anything else.
  101.      */
  102.     valid_columns.isRange = 0;
  103.     valid_columns.details.list = my_columns;
  104.     valid_columns.list_count = sizeof(my_columns) / sizeof(unsigned int);
  105.     ipSystemStatsTable_valid_columns_set(&valid_columns);
  106.     /*
  107.      * TODO:303:o: Initialize ipSystemStatsTable data.
  108.      */
  109.     return MFD_SUCCESS;
  110. }                               /* ipSystemStatsTable_init_data */
  111. /**
  112.  * container-cached overview
  113.  *
  114.  */
  115. /***********************************************************************
  116.  *
  117.  * cache
  118.  *
  119.  ***********************************************************************/
  120. /**
  121.  * container initialization
  122.  *
  123.  * @param container_ptr_ptr A pointer to a container pointer. If you
  124.  *        create a custom container, use this parameter to return it
  125.  *        to the MFD helper. If set to NULL, the MFD helper will
  126.  *        allocate a container for you.
  127.  * @param  cache A pointer to a cache structure. You can set the timeout
  128.  *         and other cache flags using this pointer.
  129.  *
  130.  *  This function is called at startup to allow you to customize certain
  131.  *  aspects of the access method. For the most part, it is for advanced
  132.  *  users. The default code should suffice for most cases. If no custom
  133.  *  container is allocated, the MFD code will create one for your.
  134.  *
  135.  *  This is also the place to set up cache behavior. The default, to
  136.  *  simply set the cache timeout, will work well with the default
  137.  *  container. If you are using a custom container, you may want to
  138.  *  look at the cache helper documentation to see if there are any
  139.  *  flags you want to set.
  140.  *
  141.  * @remark
  142.  *  This would also be a good place to do any initialization needed
  143.  *  for you data source. For example, opening a connection to another
  144.  *  process that will supply the data, opening a database, etc.
  145.  */
  146. void
  147. ipSystemStatsTable_container_init(netsnmp_container ** container_ptr_ptr,
  148.                                   netsnmp_cache * cache)
  149. {
  150.     DEBUGMSGTL(("verbose:ipSystemStatsTable:ipSystemStatsTable_container_init", "calledn"));
  151.     if ((NULL == cache) || (NULL == container_ptr_ptr)) {
  152.         snmp_log(LOG_ERR,
  153.                  "bad params to ipSystemStatsTable_container_initn");
  154.         return;
  155.     }
  156.     /*
  157.      * For advanced users, you can use a custom container. If you
  158.      * do not create one, one will be created for you.
  159.      */
  160.     *container_ptr_ptr = NULL;
  161.     /*
  162.      * TODO:345:A: Set up ipSystemStatsTable cache properties.
  163.      *
  164.      * Also for advanced users, you can set parameters for the
  165.      * cache. Do not change the magic pointer, as it is used
  166.      * by the MFD helper.
  167.      */
  168.     cache->timeout = IPSYSTEMSTATSTABLE_CACHE_TIMEOUT;  /* seconds */
  169.     /*
  170.      * don't release resources
  171.      */
  172.     cache->flags |=
  173.         (NETSNMP_CACHE_DONT_AUTO_RELEASE | NETSNMP_CACHE_DONT_FREE_EXPIRED
  174.          | NETSNMP_CACHE_DONT_FREE_BEFORE_LOAD |
  175.          NETSNMP_CACHE_AUTO_RELOAD);
  176. }                               /* ipSystemStatsTable_container_init */
  177. /**
  178.  * check entry for update
  179.  */
  180. static void
  181. _check_for_updates(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
  182.                    netsnmp_container * stats)
  183. {
  184.     /*
  185.      * check for matching entry. works because indexes are the same.
  186.      */
  187.     netsnmp_systemstats_entry *systemstats_entry =
  188.         CONTAINER_FIND(stats, rowreq_ctx->data);
  189.     if (NULL == systemstats_entry) {
  190.         DEBUGMSGTL(("ipSystemStatsTable:access",
  191.                     "updating missing entryn"));
  192.         /*
  193.          * mark row as missing, so we can set discontinuity
  194.          * when it comes back.
  195.          *
  196.          * what else should we do? set refresh to 0? that's not quite right...
  197.          */
  198.         rowreq_ctx->known_missing = 1;
  199.     } else {
  200.         DEBUGMSGTL(("ipSystemStatsTable:access",
  201.                     "updating existing entryn"));
  202.         /*
  203.          * Check for changes & update
  204.          */
  205.         netsnmp_access_systemstats_entry_update(rowreq_ctx->data,
  206.                                                 systemstats_entry);
  207.         /*
  208.          * set discontinuity if previously missing.
  209.          */
  210.         if (1 == rowreq_ctx->known_missing) {
  211.             rowreq_ctx->known_missing = 0;
  212.             rowreq_ctx->ipSystemStatsDiscontinuityTime =
  213.                 netsnmp_get_agent_uptime();
  214.         }
  215.         /*
  216.          * remove entry from container
  217.          */
  218.         CONTAINER_REMOVE(stats, systemstats_entry);
  219.         netsnmp_access_systemstats_entry_free(systemstats_entry);
  220.     }
  221. }
  222. /**
  223.  * add new entry
  224.  */
  225. static void
  226. _add_new(netsnmp_systemstats_entry * systemstats_entry,
  227.          netsnmp_container * container)
  228. {
  229.     ipSystemStatsTable_rowreq_ctx *rowreq_ctx;
  230.     DEBUGMSGTL(("ipSystemStatsTable:access", "creating new entryn"));
  231.     netsnmp_assert(NULL != systemstats_entry);
  232.     netsnmp_assert(NULL != container);
  233.     /*
  234.      * allocate an row context and set the index(es)
  235.      */
  236.     rowreq_ctx = ipSystemStatsTable_allocate_rowreq_ctx(systemstats_entry);
  237.     if ((NULL != rowreq_ctx) &&
  238.         (MFD_SUCCESS ==
  239.          ipSystemStatsTable_indexes_set(rowreq_ctx,
  240.                                         systemstats_entry->
  241.                                         ns_ip_version))) {
  242.         rowreq_ctx->ipSystemStatsRefreshRate = ipss_cache_refresh * 1000;       /* milli-seconds */
  243.         CONTAINER_INSERT(container, rowreq_ctx);
  244.     } else {
  245.         if (NULL != rowreq_ctx) {
  246.             snmp_log(LOG_ERR, "error setting index while loading "
  247.                      "ipSystemStatsTable cache.n");
  248.             ipSystemStatsTable_release_rowreq_ctx(rowreq_ctx);
  249.         } else {
  250.             snmp_log(LOG_ERR, "memory allocation failed while loading "
  251.                      "ipSystemStatsTable cache.n");
  252.             netsnmp_access_systemstats_entry_free(systemstats_entry);
  253.         }
  254.     }
  255. }
  256. /**
  257.  * load cache data
  258.  *
  259.  * TODO:350:M: Implement ipSystemStatsTable cache load
  260.  *
  261.  * @param container container to which items should be inserted
  262.  *
  263.  * @retval MFD_SUCCESS              : success.
  264.  * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
  265.  * @retval MFD_ERROR                : other error.
  266.  *
  267.  *  This function is called to cache the index(es) (and data, optionally)
  268.  *  for the every row in the data set.
  269.  *
  270.  * @remark
  271.  *  While loading the cache, the only important thing is the indexes.
  272.  *  If access to your data is cheap/fast (e.g. you have a pointer to a
  273.  *  structure in memory), it would make sense to update the data here.
  274.  *  If, however, the accessing the data invovles more work (e.g. parsing
  275.  *  some other existing data, or peforming calculations to derive the data),
  276.  *  then you can limit yourself to setting the indexes and saving any
  277.  *  information you will need later. Then use the saved information in
  278.  *  ipSystemStatsTable_row_prep() for populating data.
  279.  *
  280.  * @note
  281.  *  If you need consistency between rows (like you want statistics
  282.  *  for each row to be from the same time frame), you should set all
  283.  *  data here.
  284.  *
  285.  */
  286. int
  287. ipSystemStatsTable_cache_load(netsnmp_container * container)
  288. {
  289.     netsnmp_container *stats =
  290.         netsnmp_access_systemstats_container_load(NULL, 0);
  291.     DEBUGMSGTL(("verbose:ipSystemStatsTable:ipSystemStatsTable_cache_load",
  292.                 "calledn"));
  293.     netsnmp_assert(NULL != container);
  294.     if (NULL == stats)
  295.         return MFD_RESOURCE_UNAVAILABLE;        /* msg already logged */
  296.     /*
  297.      * TODO:351:M: |-> Load/update data in the ipSystemStatsTable container.
  298.      * loop over your ipSystemStatsTable data, allocate a rowreq context,
  299.      * set the index(es) [and data, optionally] and insert into
  300.      * the container.
  301.      */
  302.     /*
  303.      * we just got a fresh copy of data. compare it to
  304.      * what we've already got, and make any adjustements...
  305.      */
  306.     CONTAINER_FOR_EACH(container, (netsnmp_container_obj_func *)
  307.                        _check_for_updates, stats);
  308.     /*
  309.      * now add any new entries
  310.      */
  311.     CONTAINER_FOR_EACH(stats, (netsnmp_container_obj_func *)
  312.                        _add_new, container);
  313.     /*
  314.      * free the container. we've either claimed each ifentry, or released it,
  315.      * so the dal function doesn't need to clear the container.
  316.      */
  317.     netsnmp_access_systemstats_container_free(stats,
  318.                                               NETSNMP_ACCESS_SYSTEMSTATS_FREE_DONT_CLEAR);
  319.     DEBUGMSGT(("verbose:ipSystemStatsTable:ipSystemStatsTable_cache_load",
  320.                "%d recordsn", CONTAINER_SIZE(container)));
  321.     return MFD_SUCCESS;
  322. }                               /* ipSystemStatsTable_cache_load */
  323. /**
  324.  * cache clean up
  325.  *
  326.  * @param container container with all current items
  327.  *
  328.  *  This optional callback is called prior to all
  329.  *  item's being removed from the container. If you
  330.  *  need to do any processing before that, do it here.
  331.  *
  332.  * @note
  333.  *  The MFD helper will take care of releasing all the row contexts.
  334.  *
  335.  */
  336. void
  337. ipSystemStatsTable_cache_free(netsnmp_container * container)
  338. {
  339.     DEBUGMSGTL(("verbose:ipSystemStatsTable:ipSystemStatsTable_cache_free",
  340.                 "calledn"));
  341.     /*
  342.      * TODO:380:M: Free ipSystemStatsTable cache.
  343.      */
  344. }                               /* ipSystemStatsTable_cache_free */
  345. /**
  346.  * prepare row for processing.
  347.  *
  348.  *  When the agent has located the row for a request, this function is
  349.  *  called to prepare the row for processing. If you fully populated
  350.  *  the data context during the index setup phase, you may not need to
  351.  *  do anything.
  352.  *
  353.  * @param rowreq_ctx pointer to a context.
  354.  *
  355.  * @retval MFD_SUCCESS     : success.
  356.  * @retval MFD_ERROR       : other error.
  357.  */
  358. int
  359. ipSystemStatsTable_row_prep(ipSystemStatsTable_rowreq_ctx * rowreq_ctx)
  360. {
  361.     DEBUGMSGTL(("verbose:ipSystemStatsTable:ipSystemStatsTable_row_prep",
  362.                 "calledn"));
  363.     netsnmp_assert(NULL != rowreq_ctx);
  364.     /*
  365.      * TODO:390:o: Prepare row for request.
  366.      * If populating row data was delayed, this is the place to
  367.      * fill in the row for this request.
  368.      */
  369.     return MFD_SUCCESS;
  370. }                               /* ipSystemStatsTable_row_prep */
  371. /** @} */