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

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: ipCidrRouteTable_data_access.c,v 1.14.2.1 2005/02/08 21:58:05 nba 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 "ipCidrRouteTable.h"
  17. #include "ipCidrRouteTable_data_access.h"
  18. /** @defgroup data_access data_access: Routines to access data
  19.  *
  20.  * These routines are used to locate the data used to satisfy
  21.  * requests.
  22.  * 
  23.  * @{
  24.  */
  25. /**********************************************************************
  26.  **********************************************************************
  27.  ***
  28.  *** Table ipCidrRouteTable
  29.  ***
  30.  **********************************************************************
  31.  **********************************************************************/
  32. /*
  33.  * ipCidrRouteTable is subid 4 of ipForward.
  34.  * Its status is Deprecated.
  35.  * OID: .1.3.6.1.2.1.4.24.4, length: 9
  36.  */
  37. /**
  38.  * initialization for ipCidrRouteTable data access
  39.  *
  40.  * This function is called during startup to allow you to
  41.  * allocate any resources you need for the data table.
  42.  *
  43.  * @param ipCidrRouteTable_reg
  44.  *        Pointer to ipCidrRouteTable_registration
  45.  *
  46.  * @retval MFD_SUCCESS : success.
  47.  * @retval MFD_ERROR   : unrecoverable error.
  48.  */
  49. int
  50. ipCidrRouteTable_init_data(ipCidrRouteTable_registration_ptr
  51.                            ipCidrRouteTable_reg)
  52. {
  53.     DEBUGMSGTL(("verbose:ipCidrRouteTable:ipCidrRouteTable_init_data",
  54.                 "calledn"));
  55.     /*
  56.      * TODO:303:o: Initialize ipCidrRouteTable data.
  57.      */
  58.     return MFD_SUCCESS;
  59. }                               /* ipCidrRouteTable_init_data */
  60. /**
  61.  * container-cached overview
  62.  *
  63.  */
  64. /***********************************************************************
  65.  *
  66.  * cache
  67.  *
  68.  ***********************************************************************/
  69. /**
  70.  * container initialization
  71.  *
  72.  * @param container_ptr_ptr A pointer to a container pointer. If you
  73.  *        create a custom container, use this parameter to return it
  74.  *        to the MFD helper. If set to NULL, the MFD helper will
  75.  *        allocate a container for you.
  76.  * @param  cache A pointer to a cache structure. You can set the timeout
  77.  *         and other cache flags using this pointer.
  78.  *
  79.  *  This function is called at startup to allow you to customize certain
  80.  *  aspects of the access method. For the most part, it is for advanced
  81.  *  users. The default code should suffice for most cases. If no custom
  82.  *  container is allocated, the MFD code will create one for your.
  83.  *
  84.  *  This is also the place to set up cache behavior. The default, to
  85.  *  simply set the cache timeout, will work well with the default
  86.  *  container. If you are using a custom container, you may want to
  87.  *  look at the cache helper documentation to see if there are any
  88.  *  flags you want to set.
  89.  *
  90.  * @remark
  91.  *  This would also be a good place to do any initialization needed
  92.  *  for you data source. For example, opening a connection to another
  93.  *  process that will supply the data, opening a database, etc.
  94.  */
  95. void
  96. ipCidrRouteTable_container_init(netsnmp_container ** container_ptr_ptr,
  97.                                 netsnmp_cache * cache)
  98. {
  99.     DEBUGMSGTL(("verbose:ipCidrRouteTable:ipCidrRouteTable_container_init",
  100.                 "calledn"));
  101.     if ((NULL == cache) || (NULL == container_ptr_ptr)) {
  102.         snmp_log(LOG_ERR,
  103.                  "bad params to ipCidrRouteTable_container_initn");
  104.         return;
  105.     }
  106.     /*
  107.      * For advanced users, you can use a custom container. If you
  108.      * do not create one, one will be created for you.
  109.      */
  110.     *container_ptr_ptr = NULL;
  111.     /*
  112.      * TODO:345:A: Set up ipCidrRouteTable cache properties.
  113.      *
  114.      * Also for advanced users, you can set parameters for the
  115.      * cache. Do not change the magic pointer, as it is used
  116.      * by the MFD helper.
  117.      */
  118.     cache->timeout = IPCIDRROUTETABLE_CACHE_TIMEOUT;    /* seconds */
  119. }                               /* ipCidrRouteTable_container_init */
  120. /**
  121.  * check entry for update
  122.  *
  123.  */
  124. static void
  125. _snarf_route_entry(netsnmp_route_entry * route_entry,
  126.                    netsnmp_container * container)
  127. {
  128.     ipCidrRouteTable_rowreq_ctx *rowreq_ctx;
  129.     DEBUGTRACE;
  130.     netsnmp_assert(NULL != route_entry);
  131.     netsnmp_assert(NULL != container);
  132.     /*
  133.      * allocate an row context and set the index(es), then add it to
  134.      * the container
  135.      */
  136.     rowreq_ctx = ipCidrRouteTable_allocate_rowreq_ctx(route_entry);
  137.     if ((NULL != rowreq_ctx) &&
  138.         (MFD_SUCCESS == ipCidrRouteTable_indexes_set
  139.          (rowreq_ctx, *((u_long *) route_entry->rt_dest),
  140.           route_entry->rt_mask, route_entry->rt_tos,
  141.           *((u_long *) route_entry->rt_nexthop)))) {
  142.         CONTAINER_INSERT(container, rowreq_ctx);
  143.         rowreq_ctx->ipCidrRouteStatus = ROWSTATUS_ACTIVE;
  144.     } else {
  145.         if (rowreq_ctx) {
  146.             snmp_log(LOG_ERR, "error setting index while loading "
  147.                      "ipCidrRoute cache.n");
  148.             ipCidrRouteTable_release_rowreq_ctx(rowreq_ctx);
  149.         } else
  150.             netsnmp_access_route_entry_free(route_entry);
  151.     }
  152. }
  153. /**
  154.  * load cache data
  155.  *
  156.  * TODO:350:M: Implement ipCidrRouteTable cache load
  157.  *
  158.  * @param container container to which items should be inserted
  159.  *
  160.  * @retval MFD_SUCCESS              : success.
  161.  * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
  162.  * @retval MFD_ERROR                : other error.
  163.  *
  164.  *  This function is called to cache the index(es) (and data, optionally)
  165.  *  for the every row in the data set.
  166.  *
  167.  * @remark
  168.  *  While loading the cache, the only important thing is the indexes.
  169.  *  If access to your data is cheap/fast (e.g. you have a pointer to a
  170.  *  structure in memory), it would make sense to update the data here.
  171.  *  If, however, the accessing the data invovles more work (e.g. parsing
  172.  *  some other existing data, or peforming calculations to derive the data),
  173.  *  then you can limit yourself to setting the indexes and saving any
  174.  *  information you will need later. Then use the saved information in
  175.  *  ipCidrRouteTable_row_prep() for populating data.
  176.  *
  177.  * @note
  178.  *  If you need consistency between rows (like you want statistics
  179.  *  for each row to be from the same time frame), you should set all
  180.  *  data here.
  181.  *
  182.  */
  183. int
  184. ipCidrRouteTable_cache_load(netsnmp_container * container)
  185. {
  186.     netsnmp_container *route_container;
  187.     DEBUGMSGTL(("verbose:ipCidrRouteTable:ipCidrRouteTable_cache_load",
  188.                 "calledn"));
  189.     /*
  190.      * TODO:351:M: |-> Load/update data in the ipCidrRouteTable container.
  191.      * loop over your ipCidrRouteTable data, allocate a rowreq context,
  192.      * set the index(es) [and data, optionally] and insert into
  193.      * the container.
  194.      */
  195.     route_container =
  196.         netsnmp_access_route_container_load(NULL,
  197.                                             NETSNMP_ACCESS_ROUTE_LOAD_IPV4_ONLY);
  198.     if (NULL == route_container)
  199.         return MFD_RESOURCE_UNAVAILABLE;        /* msg already logged */
  200.     /*
  201.      * we just got a fresh copy of route data. snarf data
  202.      */
  203.     CONTAINER_FOR_EACH(route_container,
  204.                        (netsnmp_container_obj_func *) _snarf_route_entry,
  205.                        container);
  206.     /*
  207.      * free the container. we've either claimed each ifentry, or released it,
  208.      * so the dal function doesn't need to clear the container.
  209.      */
  210.     netsnmp_access_route_container_free(route_container,
  211.                                         NETSNMP_ACCESS_ROUTE_FREE_DONT_CLEAR);
  212.     DEBUGMSGT(("verbose:ipCidrRouteTable:ipCidrRouteTable_cache_load",
  213.                "%d recordsn", CONTAINER_SIZE(container)));
  214.     return MFD_SUCCESS;
  215. }                               /* ipCidrRouteTable_cache_load */
  216. /**
  217.  * cache clean up
  218.  *
  219.  * @param container container with all current items
  220.  *
  221.  *  This optional callback is called prior to all
  222.  *  item's being removed from the container. If you
  223.  *  need to do any processing before that, do it here.
  224.  *
  225.  * @note
  226.  *  The MFD helper will take care of releasing all the row contexts.
  227.  *
  228.  */
  229. void
  230. ipCidrRouteTable_cache_free(netsnmp_container * container)
  231. {
  232.     DEBUGMSGTL(("verbose:ipCidrRouteTable:ipCidrRouteTable_cache_free",
  233.                 "calledn"));
  234.     /*
  235.      * TODO:380:M: Free ipCidrRouteTable cache.
  236.      */
  237. }                               /* ipCidrRouteTable_cache_free */
  238. /**
  239.  * prepare row for processing.
  240.  *
  241.  *  When the agent has located the row for a request, this function is
  242.  *  called to prepare the row for processing. If you fully populated
  243.  *  the data context during the index setup phase, you may not need to
  244.  *  do anything.
  245.  *
  246.  * @param rowreq_ctx pointer to a context.
  247.  *
  248.  * @retval MFD_SUCCESS     : success.
  249.  * @retval MFD_ERROR       : other error.
  250.  */
  251. int
  252. ipCidrRouteTable_row_prep(ipCidrRouteTable_rowreq_ctx * rowreq_ctx)
  253. {
  254.     DEBUGMSGTL(("verbose:ipCidrRouteTable:ipCidrRouteTable_row_prep",
  255.                 "calledn"));
  256.     netsnmp_assert(NULL != rowreq_ctx);
  257.     /*
  258.      * TODO:390:o: Prepare row for request.
  259.      * If populating row data was delayed, this is the place to
  260.      * fill in the row for this request.
  261.      */
  262.     return MFD_SUCCESS;
  263. }                               /* ipCidrRouteTable_row_prep */
  264. /** @} */