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

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: inetCidrRouteTable_data_access.c,v 1.8.2.1 2005/02/08 21:58:02 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 "inetCidrRouteTable.h"
  17. #include "inetCidrRouteTable_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 inetCidrRouteTable
  29.  ***
  30.  **********************************************************************
  31.  **********************************************************************/
  32. /*
  33.  * inetCidrRouteTable is subid 7 of ipForward.
  34.  * Its status is Current.
  35.  * OID: .1.3.6.1.2.1.4.24.7, length: 9
  36.  */
  37. /**
  38.  * initialization for inetCidrRouteTable 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 inetCidrRouteTable_reg
  44.  *        Pointer to inetCidrRouteTable_registration
  45.  *
  46.  * @retval MFD_SUCCESS : success.
  47.  * @retval MFD_ERROR   : unrecoverable error.
  48.  */
  49. int
  50. inetCidrRouteTable_init_data(inetCidrRouteTable_registration_ptr
  51.                              inetCidrRouteTable_reg)
  52. {
  53.     DEBUGMSGTL(("verbose:inetCidrRouteTable:inetCidrRouteTable_init_data",
  54.                 "calledn"));
  55.     /*
  56.      * TODO:303:o: Initialize inetCidrRouteTable data.
  57.      */
  58.     return MFD_SUCCESS;
  59. }                               /* inetCidrRouteTable_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. inetCidrRouteTable_container_init(netsnmp_container ** container_ptr_ptr,
  97.                                   netsnmp_cache * cache)
  98. {
  99.     DEBUGMSGTL(("verbose:inetCidrRouteTable:inetCidrRouteTable_container_init", "calledn"));
  100.     if ((NULL == cache) || (NULL == container_ptr_ptr)) {
  101.         snmp_log(LOG_ERR,
  102.                  "bad params to inetCidrRouteTable_container_initn");
  103.         return;
  104.     }
  105.     /*
  106.      * For advanced users, you can use a custom container. If you
  107.      * do not create one, one will be created for you.
  108.      */
  109.     *container_ptr_ptr = NULL;
  110.     /*
  111.      * TODO:345:A: Set up inetCidrRouteTable cache properties.
  112.      *
  113.      * Also for advanced users, you can set parameters for the
  114.      * cache. Do not change the magic pointer, as it is used
  115.      * by the MFD helper.
  116.      */
  117.     cache->timeout = INETCIDRROUTETABLE_CACHE_TIMEOUT;  /* seconds */
  118. }                               /* inetCidrRouteTable_container_init */
  119. /**
  120.  * check entry for update
  121.  */
  122. static void
  123. _snarf_route_entry(netsnmp_route_entry * route_entry,
  124.                    netsnmp_container * container)
  125. {
  126.     inetCidrRouteTable_rowreq_ctx *rowreq_ctx;
  127.     netsnmp_assert(NULL != route_entry);
  128.     netsnmp_assert(NULL != container);
  129.     /*
  130.      * per  inetCidrRouteType:
  131.      *
  132.      * Routes which do not result in traffic forwarding or 
  133.      * rejection should not be displayed even if the  
  134.      * implementation keeps them stored internally.
  135.      */
  136.     if (route_entry->rt_type == 0) {    /* set when route not up */
  137.         DEBUGMSGT(("verbose:inetCidrRouteTable:inetCidrRouteTable_cache_load", "skipping routen"));
  138.         netsnmp_access_route_entry_free(route_entry);
  139.         return;
  140.     }
  141.     /*
  142.      * allocate an row context and set the index(es), then add it to
  143.      * the container
  144.      */
  145.     rowreq_ctx = inetCidrRouteTable_allocate_rowreq_ctx(route_entry);
  146.     if ((NULL != rowreq_ctx) &&
  147.         (MFD_SUCCESS == inetCidrRouteTable_indexes_set
  148.          (rowreq_ctx, route_entry->rt_dest_type,
  149.           route_entry->rt_dest, route_entry->rt_dest_len,
  150.           route_entry->rt_pfx_len,
  151.           route_entry->rt_policy, route_entry->rt_policy_len,
  152.           route_entry->rt_nexthop_type,
  153.           route_entry->rt_nexthop, route_entry->rt_nexthop_len))) {
  154.         CONTAINER_INSERT(container, rowreq_ctx);
  155.         rowreq_ctx->inetCidrRouteStatus = ROWSTATUS_ACTIVE;
  156.     } else {
  157.         if (rowreq_ctx) {
  158.             snmp_log(LOG_ERR, "error setting index while loading "
  159.                      "inetCidrRoute cache.n");
  160.             inetCidrRouteTable_release_rowreq_ctx(rowreq_ctx);
  161.         } else
  162.             netsnmp_access_route_entry_free(route_entry);
  163.     }
  164. }
  165. /**
  166.  * load cache data
  167.  *
  168.  * TODO:350:M: Implement inetCidrRouteTable cache load
  169.  *
  170.  * @param container container to which items should be inserted
  171.  *
  172.  * @retval MFD_SUCCESS              : success.
  173.  * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
  174.  * @retval MFD_ERROR                : other error.
  175.  *
  176.  *  This function is called to cache the index(es) (and data, optionally)
  177.  *  for the every row in the data set.
  178.  *
  179.  * @remark
  180.  *  While loading the cache, the only important thing is the indexes.
  181.  *  If access to your data is cheap/fast (e.g. you have a pointer to a
  182.  *  structure in memory), it would make sense to update the data here.
  183.  *  If, however, the accessing the data invovles more work (e.g. parsing
  184.  *  some other existing data, or peforming calculations to derive the data),
  185.  *  then you can limit yourself to setting the indexes and saving any
  186.  *  information you will need later. Then use the saved information in
  187.  *  inetCidrRouteTable_row_prep() for populating data.
  188.  *
  189.  * @note
  190.  *  If you need consistency between rows (like you want statistics
  191.  *  for each row to be from the same time frame), you should set all
  192.  *  data here.
  193.  *
  194.  */
  195. int
  196. inetCidrRouteTable_cache_load(netsnmp_container * container)
  197. {
  198.     netsnmp_container *route_container;
  199.     DEBUGMSGTL(("verbose:inetCidrRouteTable:inetCidrRouteTable_cache_load",
  200.                 "calledn"));
  201.     /*
  202.      * TODO:351:M: |-> Load/update data in the inetCidrRouteTable container.
  203.      * loop over your inetCidrRouteTable data, allocate a rowreq context,
  204.      * set the index(es) [and data, optionally] and insert into
  205.      * the container.
  206.      *
  207.      * we use the netsnmp data access api to get the data
  208.      */
  209.     route_container =
  210.         netsnmp_access_route_container_load(NULL,
  211.                                             NETSNMP_ACCESS_ROUTE_LOAD_NOFLAGS);
  212.     DEBUGMSGT(("verbose:inetCidrRouteTable:inetCidrRouteTable_cache_load",
  213.                "%d recordsn", CONTAINER_SIZE(route_container)));
  214.     if (NULL == route_container)
  215.         return MFD_RESOURCE_UNAVAILABLE;        /* msg already logged */
  216.     /*
  217.      * we just got a fresh copy of route data. snarf data
  218.      */
  219.     CONTAINER_FOR_EACH(route_container,
  220.                        (netsnmp_container_obj_func *) _snarf_route_entry,
  221.                        container);
  222.     /*
  223.      * free the container. we've either claimed each ifentry, or released it,
  224.      * so the dal function doesn't need to clear the container.
  225.      */
  226.     netsnmp_access_route_container_free(route_container,
  227.                                         NETSNMP_ACCESS_ROUTE_FREE_DONT_CLEAR);
  228.     DEBUGMSGT(("verbose:inetCidrRouteTable:inetCidrRouteTable_cache_load",
  229.                "%d recordsn", CONTAINER_SIZE(container)));
  230.     return MFD_SUCCESS;
  231. }                               /* inetCidrRouteTable_cache_load */
  232. /**
  233.  * cache clean up
  234.  *
  235.  * @param container container with all current items
  236.  *
  237.  *  This optional callback is called prior to all
  238.  *  item's being removed from the container. If you
  239.  *  need to do any processing before that, do it here.
  240.  *
  241.  * @note
  242.  *  The MFD helper will take care of releasing all the row contexts.
  243.  *
  244.  */
  245. void
  246. inetCidrRouteTable_cache_free(netsnmp_container * container)
  247. {
  248.     DEBUGMSGTL(("verbose:inetCidrRouteTable:inetCidrRouteTable_cache_free",
  249.                 "calledn"));
  250.     /*
  251.      * TODO:380:M: Free inetCidrRouteTable cache.
  252.      */
  253. }                               /* inetCidrRouteTable_cache_free */
  254. /**
  255.  * prepare row for processing.
  256.  *
  257.  *  When the agent has located the row for a request, this function is
  258.  *  called to prepare the row for processing. If you fully populated
  259.  *  the data context during the index setup phase, you may not need to
  260.  *  do anything.
  261.  *
  262.  * @param rowreq_ctx pointer to a context.
  263.  *
  264.  * @retval MFD_SUCCESS     : success.
  265.  * @retval MFD_ERROR       : other error.
  266.  */
  267. int
  268. inetCidrRouteTable_row_prep(inetCidrRouteTable_rowreq_ctx * rowreq_ctx)
  269. {
  270.     DEBUGMSGTL(("verbose:inetCidrRouteTable:inetCidrRouteTable_row_prep",
  271.                 "calledn"));
  272.     netsnmp_assert(NULL != rowreq_ctx);
  273.     /*
  274.      * TODO:390:o: Prepare row for request.
  275.      * If populating row data was delayed, this is the place to
  276.      * fill in the row for this request.
  277.      */
  278.     return MFD_SUCCESS;
  279. }                               /* inetCidrRouteTable_row_prep */
  280. /** @} */