nfs-ganesha 1.4

nfs_stats_snmp.c

Go to the documentation of this file.
00001 
00005 #ifdef HAVE_CONFIG_H
00006 #include "config.h"
00007 #endif
00008 
00009 #ifdef _SOLARIS
00010 #include "solaris_port.h"
00011 #endif
00012 
00013 #include <stdio.h>
00014 #include <string.h>
00015 #include <pthread.h>
00016 #include <sys/stat.h>
00017 #include <time.h>
00018 
00019 /* function name resolution */
00020 #include "fsal.h"
00021 #include "cache_inode.h"
00022 #include "nfs_stat.h"
00023 
00024 #include "nfs_core.h"
00025 #include "nfs_stat.h"
00026 #include "nfs_exports.h"
00027 #include "external_tools.h"
00028 #include "snmp_adm.h"
00029 
00030 #include "common_utils.h"
00031 #include "log.h"
00032 #include "abstract_mem.h"
00033 
00034 #define CONF_SNMP_ADM_LABEL  "SNMP_ADM"
00035 /* case unsensitivity */
00036 #define STRCMP   strcasecmp
00037 
00038 static int config_ok = 0;
00039 
00040 int get_snmpadm_conf(config_file_t in_config, external_tools_parameter_t * out_parameter)
00041 {
00042   int err;
00043   int var_max, var_index;
00044   char *key_name;
00045   char *key_value;
00046   config_item_t block;
00047   config_item_t item;
00048 
00049 
00050 
00051    /* Get the config BLOCK */
00052  if((block = config_FindItemByName(in_config, CONF_SNMP_ADM_LABEL)) == NULL)
00053     {
00054       /* cannot read item */
00055       LogCrit(COMPONENT_CONFIG,
00056               "SNMP_ADM: Cannot read item \"%s\" from configuration file",
00057               CONF_SNMP_ADM_LABEL);
00058       /* Expected to be a block */
00059       return ENOENT;
00060     }
00061   else if(config_ItemType(block) != CONFIG_ITEM_BLOCK)
00062      {
00063        LogCrit(COMPONENT_CONFIG,
00064                "SNMP_ADM: Cannot read item \"%s\" from configuration file",
00065                CONF_SNMP_ADM_LABEL);
00066       /* Expected to be a block */
00067        return ENOENT;
00068      }
00069 
00070   /* makes an iteration on the (key, value) couplets */
00071   var_max = config_GetNbItems(block);
00072 
00073   for(var_index = 0; var_index < var_max; var_index++)
00074     {
00075        /* retrieve key's name */
00076       item = config_GetItemByIndex(block, var_index);
00077       err = config_GetKeyValue(item, &key_name, &key_value);
00078 
00079       if(err)
00080         {
00081           LogCrit(COMPONENT_CONFIG,
00082                   "SNMP_ADM: ERROR reading key[%d] from section \"%s\" of configuration file.",
00083                   var_index, CONF_LABEL_FS_SPECIFIC);
00084           return err;
00085         }
00086 
00087       /* what parameter is it ? */
00088 
00089       if(!STRCMP(key_name, "Snmp_Agentx_Socket"))
00090         {
00091           strncpy(out_parameter->snmp_adm.snmp_agentx_socket, key_value, MAXPATHLEN);
00092         }
00093       else if(!STRCMP(key_name, "Product_Id"))
00094         {
00095           out_parameter->snmp_adm.product_id = atoi(key_value);
00096         }
00097       else if(!STRCMP(key_name, "Snmp_adm_log"))
00098         {
00099           strncpy(out_parameter->snmp_adm.snmp_log_file, key_value, MAXPATHLEN);
00100         }
00101       else if(!STRCMP(key_name, "Export_cache_stats"))
00102         {
00103           int bool = StrToBoolean(key_value);
00104           if(bool == -1)
00105             {
00106               LogCrit(COMPONENT_CONFIG,
00107                       "SNMP_ADM: ERROR: Unexpected value for %s: boolean expected.",
00108                       key_name);
00109               return EINVAL;
00110             }
00111           out_parameter->snmp_adm.export_cache_stats = bool;
00112         }
00113       else if(!STRCMP(key_name, "Export_requests_stats"))
00114         {
00115           int bool = StrToBoolean(key_value);
00116           if(bool == -1)
00117             {
00118               LogCrit(COMPONENT_CONFIG,
00119                       "SNMP_ADM: ERROR: Unexpected value for %s: boolean expected.",
00120                       key_name);
00121               return EINVAL;
00122             }
00123           out_parameter->snmp_adm.export_requests_stats = bool;
00124         }
00125       else if(!STRCMP(key_name, "Export_maps_stats"))
00126         {
00127           int bool = StrToBoolean(key_value);
00128           if(bool == -1)
00129             {
00130               LogCrit(COMPONENT_CONFIG,
00131                       "SNMP_ADM: ERROR: Unexpected value for %s: boolean expected.",
00132                       key_name);
00133               return EINVAL;
00134             }
00135           out_parameter->snmp_adm.export_maps_stats = bool;
00136         }
00137       else if(!STRCMP(key_name, "Export_nfs_calls_detail"))
00138         {
00139           int bool = StrToBoolean(key_value);
00140           if(bool == -1)
00141             {
00142               LogCrit(COMPONENT_CONFIG,
00143                       "SNMP_ADM: ERROR: Unexpected value for %s: boolean expected.",
00144                       key_name);
00145               return EINVAL;
00146             }
00147           out_parameter->snmp_adm.export_nfs_calls_detail = bool;
00148         }
00149       else if(!STRCMP(key_name, "Export_FSAL_calls_detail"))
00150         {
00151           int bool = StrToBoolean(key_value);
00152           if(bool == -1)
00153             {
00154               LogCrit(COMPONENT_CONFIG,
00155                       "SNMP_ADM: ERROR: Unexpected value for %s: boolean expected.",
00156                       key_name);
00157               return EINVAL;
00158             }
00159           out_parameter->snmp_adm.export_fsal_calls_detail = bool;
00160         }
00161       else
00162         {
00163           LogCrit(COMPONENT_CONFIG,
00164                   "SNMP_ADM LOAD PARAMETER: ERROR: Unknown or unsettable key: %s (item %s)",
00165                   key_name, CONF_LABEL_FS_SPECIFIC);
00166           return EINVAL;
00167         }
00168     }
00169   config_ok = 1;
00170   return 0;
00171 }
00172 
00173 /* SNMPADM Get Set*/
00174 
00175 static int getuptime(snmp_adm_type_union * param, void *opt)
00176 {
00177   param->time = time(NULL) - ServerBootTime;
00178   return 0;
00179 }
00180 
00181 static int get_hash(snmp_adm_type_union * param, void *opt)
00182 {
00183   hash_stat_t hstat, hstat_reverse;
00184   long cs = (long)opt;
00185 
00186   /* check mask, the structure contain 16 elements, mask is 0xF0 */
00187   if((cs & 0xF0) == 0x00)
00188     {
00189       /* Pinting the cache inode hash stat */
00190       /* This is done only on worker[0]: the hashtable is shared and worker 0 always exists */
00191       HashTable_GetStats(fh_to_cache_entry_ht, &hstat);
00192     }
00193   else if((cs & 0xF0) == 0x10)
00194     {
00195 //TODO: This should have taken care by the following commit.
00196 // Commenting for now. Philippe to fix it ASAP.
00197 // commit 1619edd026ea02b5c9d9edaa93512582ee0e4d3f
00198 //Author: Philippe DENIEL <philippe.deniel@cea.fr>
00199 //Date:   Fri Jan 20 10:18:23 2012 +0100
00200 // DRC : manage UDP and TCP request in two different hashtable. This is a prepa
00201 //
00202 //      nfs_dupreq_get_stats(&hstat);
00203     }
00204   else if((cs & 0xF0) == 0x20)
00205     {
00206       idmap_get_stats(UIDMAP_TYPE, &hstat, &hstat_reverse);
00207     }
00208   else if((cs & 0xF0) == 0x30)
00209     {
00210       idmap_get_stats(UIDMAP_TYPE, &hstat, &hstat_reverse);
00211       memcpy(&hstat, &hstat_reverse, sizeof(hash_stat_t));
00212     }
00213   else if((cs & 0xF0) == 0x40)
00214     {
00215       idmap_get_stats(GIDMAP_TYPE, &hstat, &hstat_reverse);
00216     }
00217   else if((cs & 0xF0) == 0x50)
00218     {
00219       idmap_get_stats(GIDMAP_TYPE, &hstat, &hstat_reverse);
00220       memcpy(&hstat, &hstat_reverse, sizeof(hash_stat_t));
00221     }
00222   else if((cs & 0xF0) == 0x60)
00223     {
00224       nfs_ip_name_get_stats(&hstat);
00225     }
00226   else
00227     {
00228       return 1;
00229     }
00230   /* position in the group */
00231   cs &= 0x0F;
00232   switch (cs)
00233     {
00234     case 0:
00235       param->integer = hstat.entries;
00236       break;
00237     case 1:
00238       param->integer = hstat.min_rbt_num_node;
00239       break;
00240     case 2:
00241       param->integer = hstat.max_rbt_num_node;
00242       break;
00243     case 3:
00244       param->integer = hstat.average_rbt_num_node;
00245       break;
00246     default:
00247       return 1;
00248     }
00249   return 0;
00250 
00251 }
00252 
00253 static int get_workerstat(snmp_adm_type_union * param, void *opt)
00254 {
00255   long cs = (long)opt;
00256   unsigned int i;
00257 
00258   param->integer = 0;
00259 
00260   switch (cs)
00261     {
00262     case 0:
00263       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00264         param->integer += workers_data[i].stats.nb_total_req;
00265       break;
00266     case 1:
00267       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00268         param->integer += workers_data[i].stats.nb_udp_req;
00269       break;
00270     case 2:
00271       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00272         param->integer += workers_data[i].stats.nb_tcp_req;
00273       break;
00274     case 3:
00275       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00276         param->integer += workers_data[i].stats.stat_req.nb_mnt1_req;
00277       break;
00278     case 4:
00279       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00280         param->integer += workers_data[i].stats.stat_req.nb_mnt3_req;
00281       break;
00282     case 5:
00283       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00284         param->integer += workers_data[i].stats.stat_req.nb_nfs2_req;
00285       break;
00286     case 6:
00287       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00288         param->integer += workers_data[i].stats.stat_req.nb_nfs3_req;
00289       break;
00290     case 7:
00291       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00292         param->integer += workers_data[i].stats.stat_req.nb_nfs4_req;
00293       break;
00294     default:
00295       return 1;
00296     }
00297   return 0;
00298 }
00299 
00300 #define MIN_NOT_SET 0xFFFFFFFF
00301 
00302 static int get_pending(snmp_adm_type_union * param, void *opt_arg)
00303 {
00304   long cs = (long)opt_arg;
00305   unsigned int i;
00306 
00307   unsigned min_pending_request = MIN_NOT_SET;
00308   unsigned max_pending_request = 0;
00309   unsigned total_pending_request = 0;
00310   unsigned len_pending_request = 0;
00311 
00312   for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00313     {
00314       len_pending_request = workers_data[i].pending_request_len;
00315       if((len_pending_request < min_pending_request)
00316          || (min_pending_request == MIN_NOT_SET))
00317         min_pending_request = len_pending_request;
00318 
00319       if(len_pending_request > max_pending_request)
00320         max_pending_request = len_pending_request;
00321 
00322       total_pending_request += len_pending_request;
00323     }
00324 
00325   switch (cs)
00326     {
00327     case 0:
00328       param->integer = min_pending_request;
00329       break;
00330     case 1:
00331       param->integer = max_pending_request;
00332       break;
00333     case 2:
00334       param->integer = total_pending_request;
00335       break;
00336     case 3:
00337       param->integer = total_pending_request / nfs_param.core_param.nb_worker;
00338       break;
00339     default:
00340       return 1;
00341     }
00342   return 0;
00343 }
00344 
00345 static int get_mnt1(snmp_adm_type_union * param, void *opt_arg)
00346 {
00347   long cmd = ((long)opt_arg) / 3;
00348   long stat = ((long)opt_arg) % 3;
00349 
00350   unsigned int i;
00351 
00352   param->integer = 0;
00353 
00354   switch (stat)
00355     {
00356     case 0:
00357       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00358         param->integer += workers_data[i].stats.stat_req.stat_req_mnt1[cmd].total;
00359       break;
00360     case 1:
00361       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00362         param->integer += workers_data[i].stats.stat_req.stat_req_mnt1[cmd].success;
00363       break;
00364     case 2:
00365       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00366         param->integer += workers_data[i].stats.stat_req.stat_req_mnt1[cmd].dropped;
00367       break;
00368     default:
00369       return 1;
00370     }
00371   return 0;
00372 }
00373 
00374 static int get_mnt3(snmp_adm_type_union * param, void *opt_arg)
00375 {
00376   long cmd = ((long)opt_arg) / 3;
00377   long stat = ((long)opt_arg) % 3;
00378 
00379   unsigned int i;
00380 
00381   param->integer = 0;
00382 
00383   switch (stat)
00384     {
00385     case 0:
00386       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00387         param->integer += workers_data[i].stats.stat_req.stat_req_mnt3[cmd].total;
00388       break;
00389     case 1:
00390       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00391         param->integer += workers_data[i].stats.stat_req.stat_req_mnt3[cmd].success;
00392       break;
00393     case 2:
00394       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00395         param->integer += workers_data[i].stats.stat_req.stat_req_mnt3[cmd].dropped;
00396       break;
00397     default:
00398       return 1;
00399     }
00400   return 0;
00401 }
00402 
00403 static int get_nfs2(snmp_adm_type_union * param, void *opt_arg)
00404 {
00405   long cmd = ((long)opt_arg) / 3;
00406   long stat = ((long)opt_arg) % 3;
00407 
00408   unsigned int i;
00409 
00410   param->integer = 0;
00411 
00412   switch (stat)
00413     {
00414     case 0:
00415       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00416         param->integer += workers_data[i].stats.stat_req.stat_req_nfs2[cmd].total;
00417       break;
00418     case 1:
00419       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00420         param->integer += workers_data[i].stats.stat_req.stat_req_nfs2[cmd].success;
00421       break;
00422     case 2:
00423       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00424         param->integer += workers_data[i].stats.stat_req.stat_req_nfs2[cmd].dropped;
00425       break;
00426     default:
00427       return 1;
00428     }
00429   return 0;
00430 }
00431 
00432 static int get_nfs3(snmp_adm_type_union * param, void *opt_arg)
00433 {
00434   long cmd = ((long)opt_arg) / 3;
00435   long stat = ((long)opt_arg) % 3;
00436 
00437   unsigned int i;
00438 
00439   param->integer = 0;
00440 
00441   switch (stat)
00442     {
00443     case 0:
00444       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00445         param->integer += workers_data[i].stats.stat_req.stat_req_nfs3[cmd].total;
00446       break;
00447     case 1:
00448       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00449         param->integer += workers_data[i].stats.stat_req.stat_req_nfs3[cmd].success;
00450       break;
00451     case 2:
00452       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00453         param->integer += workers_data[i].stats.stat_req.stat_req_nfs3[cmd].dropped;
00454       break;
00455     default:
00456       return 1;
00457     }
00458   return 0;
00459 }
00460 
00461 static int get_nfs4(snmp_adm_type_union * param, void *opt_arg)
00462 {
00463   long cmd = ((long)opt_arg) / 3;
00464   long stat = ((long)opt_arg) % 3;
00465 
00466   unsigned int i;
00467 
00468   param->integer = 0;
00469 
00470   switch (stat)
00471     {
00472     case 0:
00473       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00474         param->integer += workers_data[i].stats.stat_req.stat_req_nfs4[cmd].total;
00475       break;
00476     case 1:
00477       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00478         param->integer += workers_data[i].stats.stat_req.stat_req_nfs4[cmd].success;
00479       break;
00480     case 2:
00481       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00482         param->integer += workers_data[i].stats.stat_req.stat_req_nfs4[cmd].dropped;
00483       break;
00484     default:
00485       return 1;
00486     }
00487   return 0;
00488 }
00489 
00490 static int get_fsal(snmp_adm_type_union * param, void *opt_arg)
00491 {
00492   long cmd = ((long)opt_arg) / 4;
00493   long stat = ((long)opt_arg) % 4;
00494 
00495   unsigned int i;
00496 
00497   param->integer = 0;
00498 
00499   switch (stat)
00500     {
00501     case 0:
00502       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00503         param->integer += workers_data[i].stats.fsal_stats.func_stats.nb_call[cmd];
00504       break;
00505     case 1:
00506       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00507         param->integer += workers_data[i].stats.fsal_stats.func_stats.nb_success[cmd];
00508       break;
00509     case 2:
00510       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00511         param->integer +=
00512             workers_data[i].stats.fsal_stats.func_stats.nb_err_retryable[cmd];
00513       break;
00514     case 3:
00515       for(i = 0; i < nfs_param.core_param.nb_worker; i++)
00516         param->integer +=
00517             workers_data[i].stats.fsal_stats.func_stats.nb_err_unrecover[cmd];
00518       break;
00519     default:
00520       return 1;
00521     }
00522   return 0;
00523 }
00524 
00525 static register_get_set snmp_export_stat_general[] = {
00526   {"uptime", "Server uptime in sec", SNMP_ADM_TIMETICKS, SNMP_ADM_ACCESS_RO, getuptime,
00527    NULL, NULL}
00528 };
00529 
00530 #define SNMPADM_STAT_GENERAL_COUNT 1
00531 
00532 static register_get_set snmp_export_stat_cache[] = {
00533   {"cache_nb_entries", "cache_inode", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00534    NULL, (void *)0x00},
00535   {"cache_min_rbt_num_node", "cache_inode", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00536    get_hash, NULL, (void *)0x01},
00537   {"cache_max_rbt_num_node", "cache_inode", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00538    get_hash, NULL, (void *)0x02},
00539   {"cache_avg_rbt_num_node", "cache_inode", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00540    get_hash, NULL, (void *)0x03}
00541 };
00542 
00543 #define SNMPADM_STAT_CACHE_COUNT 19
00544 
00545 static register_get_set snmp_export_stat_req[] = {
00546 
00547   {"workers_nb_total_req", "NFS/MOUNT STATISTICS", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00548    get_workerstat, NULL, (void *)0},
00549   {"workers_nb_udp_req", "NFS/MOUNT STATISTICS", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00550    get_workerstat, NULL, (void *)1},
00551   {"workers_nb_tcp_req", "NFS/MOUNT STATISTICS", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00552    get_workerstat, NULL, (void *)2},
00553   {"workers_nb_mnt1_req", "NFS/MOUNT STATISTICS", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00554    get_workerstat, NULL, (void *)3},
00555   {"workers_nb_mnt3_req", "NFS/MOUNT STATISTICS", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00556    get_workerstat, NULL, (void *)4},
00557   {"workers_nb_nfs2_req", "NFS/MOUNT STATISTICS", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00558    get_workerstat, NULL, (void *)5},
00559   {"workers_nb_nfs3_req", "NFS/MOUNT STATISTICS", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00560    get_workerstat, NULL, (void *)6},
00561   {"workers_nb_nfs4_req", "NFS/MOUNT STATISTICS", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00562    get_workerstat, NULL, (void *)7},
00563 
00564   {"min_pending_requests", "NFS/MOUNT STATISTICS", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00565    get_pending, NULL, (void *)0},
00566   {"max_pending_requests", "NFS/MOUNT STATISTICS", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00567    get_pending, NULL, (void *)1},
00568   {"total_pending_requests", "NFS/MOUNT STATISTICS", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00569    get_pending, NULL, (void *)2},
00570   {"average_pending_requests", "NFS/MOUNT STATISTICS", SNMP_ADM_INTEGER,
00571    SNMP_ADM_ACCESS_RO, get_pending, NULL, (void *)3},
00572 
00573   {"dupreq_nb_entries", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00574    NULL, (void *)0x10},
00575   {"dupreq_min_rbt_num_node", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00576    get_hash, NULL, (void *)0x11},
00577   {"dupreq_max_rbt_num_node", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00578    get_hash, NULL, (void *)0x12},
00579   {"dupreq_avg_rvt_num_node", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00580    get_hash, NULL, (void *)0x13},
00581   {"dupreq_nbset_ok", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00582    NULL, (void *)0x14},
00583   {"dupreq_nbset_notfound", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00584    get_hash, NULL, (void *)0x15},
00585   {"dupreq_nbset_err", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00586    NULL, (void *)0x16},
00587   {"dupreq_nbtest_ok", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00588    NULL, (void *)0x17},
00589   {"dupreq_nbtest_notfound", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00590    get_hash, NULL, (void *)0x18},
00591   {"dupreq_nbtest_err", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00592    NULL, (void *)0x19},
00593   {"dupreq_nbget_ok", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00594    NULL, (void *)0x1A},
00595   {"dupreq_nbget_notfound", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00596    get_hash, NULL, (void *)0x1B},
00597   {"dupreq_nbget_err", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00598    NULL, (void *)0x1C},
00599   {"dupreq_nbdel_ok", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00600    NULL, (void *)0x1D},
00601   {"dupreq_nbdel_notfound", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00602    get_hash, NULL, (void *)0x1E},
00603   {"dupreq_nbdel_err", "DUP_REQ_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00604    NULL, (void *)0x1F}
00605 };
00606 
00607 #define SNMPADM_STAT_REQ_COUNT 28
00608 
00609 static register_get_set snmp_export_stat_maps[] = {
00610 
00611   {"uidmap_nb_entries", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00612    NULL, (void *)0x20},
00613   {"uidmap_min_rbt_num_node", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00614    get_hash, NULL, (void *)0x21},
00615   {"uidmap_max_rbt_num_node", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00616    get_hash, NULL, (void *)0x22},
00617   {"uidmap_avg_rvt_num_node", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00618    get_hash, NULL, (void *)0x23},
00619   {"uidmap_nbset_ok", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash, NULL,
00620    (void *)0x24},
00621   {"uidmap_nbset_notfound", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00622    NULL, (void *)0x25},
00623   {"uidmap_nbset_err", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00624    NULL, (void *)0x26},
00625   {"uidmap_nbtest_ok", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00626    NULL, (void *)0x27},
00627   {"uidmap_nbtest_notfound", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00628    get_hash, NULL, (void *)0x28},
00629   {"uidmap_nbtest_err", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00630    NULL, (void *)0x29},
00631   {"uidmap_nbget_ok", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash, NULL,
00632    (void *)0x2A},
00633   {"uidmap_nbget_notfound", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00634    NULL, (void *)0x2B},
00635   {"uidmap_nbget_err", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00636    NULL, (void *)0x2C},
00637   {"uidmap_nbdel_ok", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash, NULL,
00638    (void *)0x2D},
00639   {"uidmap_nbdel_notfound", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00640    NULL, (void *)0x2E},
00641   {"uidmap_nbdel_err", "UIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00642    NULL, (void *)0x2F},
00643 
00644   {"unamemap_nb_entries", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00645    NULL, (void *)0x30},
00646   {"unamemap_min_rbt_num_node", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00647    get_hash, NULL, (void *)0x31},
00648   {"unamemap_max_rbt_num_node", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00649    get_hash, NULL, (void *)0x32},
00650   {"unamemap_avg_rvt_num_node", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00651    get_hash, NULL, (void *)0x33},
00652   {"unamemap_nbset_ok", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00653    NULL, (void *)0x34},
00654   {"unamemap_nbset_notfound", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00655    get_hash, NULL, (void *)0x35},
00656   {"unamemap_nbset_err", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00657    NULL, (void *)0x36},
00658   {"unamemap_nbtest_ok", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00659    NULL, (void *)0x37},
00660   {"unamemap_nbtest_notfound", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00661    get_hash, NULL, (void *)0x38},
00662   {"unamemap_nbtest_err", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00663    NULL, (void *)0x39},
00664   {"unamemap_nbget_ok", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00665    NULL, (void *)0x3A},
00666   {"unamemap_nbget_notfound", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00667    get_hash, NULL, (void *)0x3B},
00668   {"unamemap_nbget_err", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00669    NULL, (void *)0x3C},
00670   {"unamemap_nbdel_ok", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00671    NULL, (void *)0x3D},
00672   {"unamemap_nbdel_notfound", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00673    get_hash, NULL, (void *)0x3E},
00674   {"unamemap_nbdel_err", "UNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00675    NULL, (void *)0x3F},
00676 
00677   {"gidmap_nb_entries", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00678    NULL, (void *)0x40},
00679   {"gidmap_min_rbt_num_node", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00680    get_hash, NULL, (void *)0x41},
00681   {"gidmap_max_rbt_num_node", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00682    get_hash, NULL, (void *)0x42},
00683   {"gidmap_avg_rvt_num_node", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00684    get_hash, NULL, (void *)0x43},
00685   {"gidmap_nbset_ok", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash, NULL,
00686    (void *)0x44},
00687   {"gidmap_nbset_notfound", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00688    NULL, (void *)0x45},
00689   {"gidmap_nbset_err", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00690    NULL, (void *)0x46},
00691   {"gidmap_nbtest_ok", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00692    NULL, (void *)0x47},
00693   {"gidmap_nbtest_notfound", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00694    get_hash, NULL, (void *)0x48},
00695   {"gidmap_nbtest_err", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00696    NULL, (void *)0x49},
00697   {"gidmap_nbget_ok", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash, NULL,
00698    (void *)0x4A},
00699   {"gidmap_nbget_notfound", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00700    NULL, (void *)0x4B},
00701   {"gidmap_nbget_err", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00702    NULL, (void *)0x4C},
00703   {"gidmap_nbdel_ok", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash, NULL,
00704    (void *)0x4D},
00705   {"gidmap_nbdel_notfound", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00706    NULL, (void *)0x4E},
00707   {"gidmap_nbdel_err", "GIDMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00708    NULL, (void *)0x4F},
00709 
00710   {"gnamemap_nb_entries", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00711    NULL, (void *)0x50},
00712   {"gnamemap_min_rbt_num_node", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00713    get_hash, NULL, (void *)0x51},
00714   {"gnamemap_max_rbt_num_node", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00715    get_hash, NULL, (void *)0x52},
00716   {"gnamemap_avg_rvt_num_node", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00717    get_hash, NULL, (void *)0x53},
00718   {"gnamemap_nbset_ok", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00719    NULL, (void *)0x54},
00720   {"gnamemap_nbset_notfound", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00721    get_hash, NULL, (void *)0x55},
00722   {"gnamemap_nbset_err", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00723    NULL, (void *)0x56},
00724   {"gnamemap_nbtest_ok", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00725    NULL, (void *)0x57},
00726   {"gnamemap_nbtest_notfound", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00727    get_hash, NULL, (void *)0x58},
00728   {"gnamemap_nbtest_err", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00729    NULL, (void *)0x59},
00730   {"gnamemap_nbget_ok", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00731    NULL, (void *)0x5A},
00732   {"gnamemap_nbget_notfound", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00733    get_hash, NULL, (void *)0x5B},
00734   {"gnamemap_nbget_err", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00735    NULL, (void *)0x5C},
00736   {"gnamemap_nbdel_ok", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00737    NULL, (void *)0x5D},
00738   {"gnamemap_nbdel_notfound", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00739    get_hash, NULL, (void *)0x5E},
00740   {"gnamemap_nbdel_err", "GNAMEMAP_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00741    NULL, (void *)0x5F},
00742 
00743   {"ipname_nb_entries", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00744    NULL, (void *)0x60},
00745   {"ipname_min_rbt_num_node", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00746    get_hash, NULL, (void *)0x61},
00747   {"ipname_max_rbt_num_node", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00748    get_hash, NULL, (void *)0x62},
00749   {"ipname_avg_rvt_num_node", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00750    get_hash, NULL, (void *)0x63},
00751   {"ipname_nbset_ok", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00752    NULL, (void *)0x64},
00753   {"ipname_nbset_notfound", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00754    get_hash, NULL, (void *)0x65},
00755   {"ipname_nbset_err", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00756    NULL, (void *)0x66},
00757   {"ipname_nbtest_ok", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00758    NULL, (void *)0x67},
00759   {"ipname_nbtest_notfound", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00760    get_hash, NULL, (void *)0x68},
00761   {"ipname_nbtest_err", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00762    NULL, (void *)0x69},
00763   {"ipname_nbget_ok", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00764    NULL, (void *)0x6A},
00765   {"ipname_nbget_notfound", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00766    get_hash, NULL, (void *)0x6B},
00767   {"ipname_nbget_err", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00768    NULL, (void *)0x6C},
00769   {"ipname_nbdel_ok", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00770    NULL, (void *)0x6D},
00771   {"ipname_nbdel_notfound", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO,
00772    get_hash, NULL, (void *)0x6E},
00773   {"ipname_nbdel_err", "IP_NAME_HASH", SNMP_ADM_INTEGER, SNMP_ADM_ACCESS_RO, get_hash,
00774    NULL, (void *)0x6F}
00775 
00776 };
00777 
00778 #define SNMPADM_STAT_MAPS_COUNT 80
00779 
00780 static void create_dyn_mntv1_stat(register_get_set ** p_dyn_gs, int *p_dyn_gs_count)
00781 {
00782   long j;
00783 
00784   *p_dyn_gs_count = 3 * MNT_V1_NB_COMMAND;
00785   *p_dyn_gs =
00786       gsh_calloc(3 * MNT_V1_NB_COMMAND, sizeof(register_get_set));
00787 
00788   for(j = 0; j < 3 * MNT_V1_NB_COMMAND; j += 3)
00789     {
00790       (*p_dyn_gs)[j + 0].label = gsh_calloc(256, sizeof(char));
00791       snprintf((*p_dyn_gs)[j + 0].label, 256, "%sV1_total", mnt_function_names[j / 3]);
00792       (*p_dyn_gs)[j + 0].desc = "Number of mnt1 commands";
00793       (*p_dyn_gs)[j + 0].type = SNMP_ADM_INTEGER;
00794       (*p_dyn_gs)[j + 0].access = SNMP_ADM_ACCESS_RO;
00795       (*p_dyn_gs)[j + 0].getter = get_mnt1;
00796       (*p_dyn_gs)[j + 0].setter = NULL;
00797       (*p_dyn_gs)[j + 0].opt_arg = (void *)(j + 0);
00798 
00799       (*p_dyn_gs)[j + 1].label = gsh_calloc(256, sizeof(char));
00800       snprintf((*p_dyn_gs)[j + 1].label, 256, "%sV1_success", mnt_function_names[j / 3]);
00801       (*p_dyn_gs)[j + 1].desc = "Number of success for this mnt1 command";
00802       (*p_dyn_gs)[j + 1].type = SNMP_ADM_INTEGER;
00803       (*p_dyn_gs)[j + 1].access = SNMP_ADM_ACCESS_RO;
00804       (*p_dyn_gs)[j + 1].getter = get_mnt1;
00805       (*p_dyn_gs)[j + 1].setter = NULL;
00806       (*p_dyn_gs)[j + 1].opt_arg = (void *)(j + 1);
00807 
00808       (*p_dyn_gs)[j + 2].label = gsh_calloc(256, sizeof(char));
00809       snprintf((*p_dyn_gs)[j + 2].label, 256, "%sV1_dropped", mnt_function_names[j / 3]);
00810       (*p_dyn_gs)[j + 2].desc = "Number of drop for this mnt1 command";
00811       (*p_dyn_gs)[j + 2].type = SNMP_ADM_INTEGER;
00812       (*p_dyn_gs)[j + 2].access = SNMP_ADM_ACCESS_RO;
00813       (*p_dyn_gs)[j + 2].getter = get_mnt1;
00814       (*p_dyn_gs)[j + 2].setter = NULL;
00815       (*p_dyn_gs)[j + 2].opt_arg = (void *)(j + 2);
00816     }
00817 }
00818 
00819 static void create_dyn_mntv3_stat(register_get_set ** p_dyn_gs, int *p_dyn_gs_count)
00820 {
00821   long j;
00822 
00823   *p_dyn_gs_count = 3 * MNT_V3_NB_COMMAND;
00824   *p_dyn_gs = gsh_calloc(3 * MNT_V3_NB_COMMAND, sizeof(register_get_set));
00825 
00826   for(j = 0; j < 3 * MNT_V3_NB_COMMAND; j += 3)
00827     {
00828       (*p_dyn_gs)[j + 0].label = gsh_calloc(256, sizeof(char));
00829       snprintf((*p_dyn_gs)[j + 0].label, 256, "%sV3_total", mnt_function_names[j / 3]);
00830       (*p_dyn_gs)[j + 0].desc = "Number of mnt3 commands";;
00831       (*p_dyn_gs)[j + 0].type = SNMP_ADM_INTEGER;
00832       (*p_dyn_gs)[j + 0].access = SNMP_ADM_ACCESS_RO;
00833       (*p_dyn_gs)[j + 0].getter = get_mnt3;
00834       (*p_dyn_gs)[j + 0].setter = NULL;
00835       (*p_dyn_gs)[j + 0].opt_arg = (void *)(j + 0);
00836 
00837       (*p_dyn_gs)[j + 1].label = gsh_calloc(256, sizeof(char));
00838       snprintf((*p_dyn_gs)[j + 1].label, 256, "%sV3_success", mnt_function_names[j / 3]);
00839       (*p_dyn_gs)[j + 1].desc = "Number of success for this mnt3 command";
00840       (*p_dyn_gs)[j + 1].type = SNMP_ADM_INTEGER;
00841       (*p_dyn_gs)[j + 1].access = SNMP_ADM_ACCESS_RO;
00842       (*p_dyn_gs)[j + 1].getter = get_mnt3;
00843       (*p_dyn_gs)[j + 1].setter = NULL;
00844       (*p_dyn_gs)[j + 1].opt_arg = (void *)(j + 1);
00845 
00846       (*p_dyn_gs)[j + 2].label = gsh_calloc(256, sizeof(char));
00847       snprintf((*p_dyn_gs)[j + 2].label, 256, "%sV3_dropped", mnt_function_names[j / 3]);
00848       (*p_dyn_gs)[j + 2].desc = "Number of drop for this mnt3 command";
00849       (*p_dyn_gs)[j + 2].type = SNMP_ADM_INTEGER;
00850       (*p_dyn_gs)[j + 2].access = SNMP_ADM_ACCESS_RO;
00851       (*p_dyn_gs)[j + 2].getter = get_mnt3;
00852       (*p_dyn_gs)[j + 2].setter = NULL;
00853       (*p_dyn_gs)[j + 2].opt_arg = (void *)(j + 2);
00854     }
00855 }
00856 
00857 static void create_dyn_nfsv2_stat(register_get_set ** p_dyn_gs, int *p_dyn_gs_count)
00858 {
00859   long j;
00860 
00861   *p_dyn_gs_count = 3 * NFS_V2_NB_COMMAND;
00862   *p_dyn_gs = gsh_calloc(3 * NFS_V2_NB_COMMAND, sizeof(register_get_set));
00863 
00864   for(j = 0; j < 3 * NFS_V2_NB_COMMAND; j += 3)
00865     {
00866       (*p_dyn_gs)[j + 0].label = gsh_calloc(256, sizeof(char));
00867       snprintf((*p_dyn_gs)[j + 0].label, 256, "%s_total", nfsv2_function_names[j / 3]);
00868       (*p_dyn_gs)[j + 0].desc = "Number of nfs2 commands";
00869       (*p_dyn_gs)[j + 0].type = SNMP_ADM_INTEGER;
00870       (*p_dyn_gs)[j + 0].access = SNMP_ADM_ACCESS_RO;
00871       (*p_dyn_gs)[j + 0].getter = get_nfs2;
00872       (*p_dyn_gs)[j + 0].setter = NULL;
00873       (*p_dyn_gs)[j + 0].opt_arg = (void *)(j + 0);
00874 
00875       (*p_dyn_gs)[j + 1].label = gsh_calloc(256, sizeof(char));
00876       snprintf((*p_dyn_gs)[j + 1].label, 256, "%s_success", nfsv2_function_names[j / 3]);
00877       (*p_dyn_gs)[j + 1].desc = "Number of success for this nfs2 command";
00878       (*p_dyn_gs)[j + 1].type = SNMP_ADM_INTEGER;
00879       (*p_dyn_gs)[j + 1].access = SNMP_ADM_ACCESS_RO;
00880       (*p_dyn_gs)[j + 1].getter = get_nfs2;
00881       (*p_dyn_gs)[j + 1].setter = NULL;
00882       (*p_dyn_gs)[j + 1].opt_arg = (void *)(j + 1);
00883 
00884       (*p_dyn_gs)[j + 2].label = gsh_calloc(256, sizeof(char));
00885       snprintf((*p_dyn_gs)[j + 2].label, 256, "%s_dropped", nfsv2_function_names[j / 3]);
00886       (*p_dyn_gs)[j + 2].desc = "Number of drop for this nfsv2 command";
00887       (*p_dyn_gs)[j + 2].type = SNMP_ADM_INTEGER;
00888       (*p_dyn_gs)[j + 2].access = SNMP_ADM_ACCESS_RO;
00889       (*p_dyn_gs)[j + 2].getter = get_nfs2;
00890       (*p_dyn_gs)[j + 2].setter = NULL;
00891       (*p_dyn_gs)[j + 2].opt_arg = (void *)(j + 2);
00892     }
00893 }
00894 
00895 static void create_dyn_nfsv3_stat(register_get_set ** p_dyn_gs, int *p_dyn_gs_count)
00896 {
00897   long j;
00898 
00899   *p_dyn_gs_count = 3 * NFS_V3_NB_COMMAND;
00900   *p_dyn_gs = gsh_calloc(3 * NFS_V3_NB_COMMAND, sizeof(register_get_set));
00901 
00902   for(j = 0; j < 3 * NFS_V3_NB_COMMAND; j += 3)
00903     {
00904       (*p_dyn_gs)[j + 0].label = gsh_calloc(256, sizeof(char));
00905       snprintf((*p_dyn_gs)[j + 0].label, 256, "%s_total", nfsv3_function_names[j / 3]);
00906       (*p_dyn_gs)[j + 0].desc = "Number of nfs3 commands";
00907       (*p_dyn_gs)[j + 0].type = SNMP_ADM_INTEGER;
00908       (*p_dyn_gs)[j + 0].access = SNMP_ADM_ACCESS_RO;
00909       (*p_dyn_gs)[j + 0].getter = get_nfs3;
00910       (*p_dyn_gs)[j + 0].setter = NULL;
00911       (*p_dyn_gs)[j + 0].opt_arg = (void *)(j + 0);
00912 
00913       (*p_dyn_gs)[j + 1].label = gsh_calloc(256, sizeof(char));
00914       snprintf((*p_dyn_gs)[j + 1].label, 256, "%s_success", nfsv3_function_names[j / 3]);
00915       (*p_dyn_gs)[j + 1].desc = "Number of success for this nfsv3 command";
00916       (*p_dyn_gs)[j + 1].type = SNMP_ADM_INTEGER;
00917       (*p_dyn_gs)[j + 1].access = SNMP_ADM_ACCESS_RO;
00918       (*p_dyn_gs)[j + 1].getter = get_nfs3;
00919       (*p_dyn_gs)[j + 1].setter = NULL;
00920       (*p_dyn_gs)[j + 1].opt_arg = (void *)(j + 1);
00921 
00922       (*p_dyn_gs)[j + 2].label = gsh_calloc(256, sizeof(char));
00923       snprintf((*p_dyn_gs)[j + 2].label, 256, "%s_dropped", nfsv3_function_names[j / 3]);
00924       (*p_dyn_gs)[j + 2].desc = "Number of drop for this nfsv3 command";
00925       (*p_dyn_gs)[j + 2].type = SNMP_ADM_INTEGER;
00926       (*p_dyn_gs)[j + 2].access = SNMP_ADM_ACCESS_RO;
00927       (*p_dyn_gs)[j + 2].getter = get_nfs3;
00928       (*p_dyn_gs)[j + 2].setter = NULL;
00929       (*p_dyn_gs)[j + 2].opt_arg = (void *)(j + 2);
00930     }
00931 }
00932 
00933 static void create_dyn_nfsv4_stat(register_get_set ** p_dyn_gs, int *p_dyn_gs_count)
00934 {
00935   long j;
00936 
00937   *p_dyn_gs_count = 3 * NFS_V4_NB_COMMAND;
00938   *p_dyn_gs = gsh_calloc(3 * NFS_V4_NB_COMMAND, sizeof(register_get_set));
00939 
00940   for(j = 0; j < 3 * NFS_V4_NB_COMMAND; j += 3)
00941     {
00942       (*p_dyn_gs)[j + 0].label = gsh_calloc(256, sizeof(char));
00943       snprintf((*p_dyn_gs)[j + 0].label, 256, "%s_total", nfsv4_function_names[j / 3]);
00944       (*p_dyn_gs)[j + 0].desc = "Number of nfs4 commands";
00945       (*p_dyn_gs)[j + 0].type = SNMP_ADM_INTEGER;
00946       (*p_dyn_gs)[j + 0].access = SNMP_ADM_ACCESS_RO;
00947       (*p_dyn_gs)[j + 0].getter = get_nfs4;
00948       (*p_dyn_gs)[j + 0].setter = NULL;
00949       (*p_dyn_gs)[j + 0].opt_arg = (void *)(j + 0);
00950 
00951       (*p_dyn_gs)[j + 1].label = gsh_calloc(256, sizeof(char));
00952       snprintf((*p_dyn_gs)[j + 1].label, 256, "%s_success", nfsv4_function_names[j / 3]);
00953       (*p_dyn_gs)[j + 1].desc = "Number of success for this nfsv4 command";
00954       (*p_dyn_gs)[j + 1].type = SNMP_ADM_INTEGER;
00955       (*p_dyn_gs)[j + 1].access = SNMP_ADM_ACCESS_RO;
00956       (*p_dyn_gs)[j + 1].getter = get_nfs4;
00957       (*p_dyn_gs)[j + 1].setter = NULL;
00958       (*p_dyn_gs)[j + 1].opt_arg = (void *)(j + 1);
00959 
00960       (*p_dyn_gs)[j + 2].label = gsh_calloc(256, sizeof(char));
00961       snprintf((*p_dyn_gs)[j + 2].label, 256, "%s_dropped", nfsv4_function_names[j / 3]);
00962       (*p_dyn_gs)[j + 2].desc = "Number of drop for this nfsv4 command";
00963       (*p_dyn_gs)[j + 2].type = SNMP_ADM_INTEGER;
00964       (*p_dyn_gs)[j + 2].access = SNMP_ADM_ACCESS_RO;
00965       (*p_dyn_gs)[j + 2].getter = get_nfs4;
00966       (*p_dyn_gs)[j + 2].setter = NULL;
00967       (*p_dyn_gs)[j + 2].opt_arg = (void *)(j + 2);
00968     }
00969 }
00970 
00971 static void create_dyn_fsal_stat(register_get_set ** p_dyn_gs, int *p_dyn_gs_count)
00972 {
00973   long j;
00974 
00975   *p_dyn_gs_count = 4 * FSAL_NB_FUNC;
00976   *p_dyn_gs = gsh_calloc(4 * FSAL_NB_FUNC, sizeof(register_get_set));
00977 
00978   for(j = 0; j < 4 * FSAL_NB_FUNC; j += 4)
00979     {
00980       (*p_dyn_gs)[j + 0].label = gsh_calloc(256, sizeof(char));
00981       snprintf((*p_dyn_gs)[j + 0].label, 256, "%s_nb_call", fsal_function_names[j / 4]);
00982       (*p_dyn_gs)[j + 0].desc = "Number of total calls to FSAL for this function";
00983       (*p_dyn_gs)[j + 0].type = SNMP_ADM_INTEGER;
00984       (*p_dyn_gs)[j + 0].access = SNMP_ADM_ACCESS_RO;
00985       (*p_dyn_gs)[j + 0].getter = get_fsal;
00986       (*p_dyn_gs)[j + 0].setter = NULL;
00987       (*p_dyn_gs)[j + 0].opt_arg = (void *)(j + 0);
00988 
00989       (*p_dyn_gs)[j + 1].label = gsh_calloc(256, sizeof(char));
00990       snprintf((*p_dyn_gs)[j + 1].label, 256, "%s_nb_success",
00991                fsal_function_names[j / 4]);
00992       (*p_dyn_gs)[j + 1].desc = "Number of success calls to FSAL for this function";
00993       (*p_dyn_gs)[j + 1].type = SNMP_ADM_INTEGER;
00994       (*p_dyn_gs)[j + 1].access = SNMP_ADM_ACCESS_RO;
00995       (*p_dyn_gs)[j + 1].getter = get_fsal;
00996       (*p_dyn_gs)[j + 1].setter = NULL;
00997       (*p_dyn_gs)[j + 1].opt_arg = (void *)(j + 1);
00998 
00999       (*p_dyn_gs)[j + 2].label = gsh_calloc(256, sizeof(char));
01000       snprintf((*p_dyn_gs)[j + 2].label, 256, "%s_nb_ret", fsal_function_names[j / 4]);
01001       (*p_dyn_gs)[j + 2].desc = "Number of retryable calls to FSAL for this function";
01002       (*p_dyn_gs)[j + 2].type = SNMP_ADM_INTEGER;
01003       (*p_dyn_gs)[j + 2].access = SNMP_ADM_ACCESS_RO;
01004       (*p_dyn_gs)[j + 2].getter = get_fsal;
01005       (*p_dyn_gs)[j + 2].setter = NULL;
01006       (*p_dyn_gs)[j + 2].opt_arg = (void *)(j + 2);
01007 
01008       (*p_dyn_gs)[j + 3].label = gsh_calloc(256, sizeof(char));
01009       snprintf((*p_dyn_gs)[j + 3].label, 256, "%s_nb_unrec", fsal_function_names[j / 4]);
01010       (*p_dyn_gs)[j + 3].desc = "Number of unrecover calls to FSAL for this function";
01011       (*p_dyn_gs)[j + 3].type = SNMP_ADM_INTEGER;
01012       (*p_dyn_gs)[j + 3].access = SNMP_ADM_ACCESS_RO;
01013       (*p_dyn_gs)[j + 3].getter = get_fsal;
01014       (*p_dyn_gs)[j + 3].setter = NULL;
01015       (*p_dyn_gs)[j + 3].opt_arg = (void *)(j + 3);
01016     }
01017 }
01018 
01019 static void create_dyn_log_control(register_get_set ** p_dyn_gs, int *p_dyn_gs_count)
01020 {
01021   long j;
01022 
01023   *p_dyn_gs_count = COMPONENT_COUNT;
01024   *p_dyn_gs = gsh_calloc(COMPONENT_COUNT, sizeof(register_get_set));
01025 
01026   for(j = 0; j < COMPONENT_COUNT; j ++)
01027     {
01028       (*p_dyn_gs)[j + 0].label = gsh_calloc(256, sizeof(char));
01029       snprintf((*p_dyn_gs)[j].label, 256, "%s", LogComponents[j].comp_name);
01030       (*p_dyn_gs)[j].desc = "Log level for this component";
01031       (*p_dyn_gs)[j].type = SNMP_ADM_STRING;
01032       (*p_dyn_gs)[j].access = SNMP_ADM_ACCESS_RW;
01033       (*p_dyn_gs)[j].getter = getComponentLogLevel;
01034       (*p_dyn_gs)[j].setter = setComponentLogLevel;
01035       (*p_dyn_gs)[j].opt_arg = (void *)j;
01036     }
01037 }
01038 
01039 static void free_dyn(register_get_set * dyn, int count)
01040 {
01041   int i;
01042   for(i = 0; i < count; i++)
01043     gsh_free(dyn[i].label);
01044   gsh_free(dyn);
01045 }
01046 
01051 int stats_snmp(void)
01052 {
01053   int rc = 0;
01054 
01055   register_get_set *dyn_gs;
01056   int dyn_gs_count;
01057 
01058   SetNameFunction("stat_snmp");
01059 
01060   if(!config_ok)
01061     {
01062       LogCrit(COMPONENT_INIT,
01063               "Loading configuration has failed, SNMP_ADM is not activated");
01064       return 1;
01065     }
01066 
01067   /* set SNMP admin library's configuration  */
01068   if((rc = snmp_adm_config_daemon(nfs_param.extern_param.snmp_adm.snmp_agentx_socket,
01069                                   nfs_param.extern_param.snmp_adm.snmp_log_file,
01070                                   nfs_param.extern_param.snmp_adm.product_id)))
01071     {
01072       LogCrit(COMPONENT_INIT,
01073               "Error setting SNMP admin interface configuration");
01074       return 1;
01075     }
01076 
01077   /* always register general statistics */
01078   if((rc =
01079       snmp_adm_register_get_set_function(STAT_OID, snmp_export_stat_general,
01080                                          SNMPADM_STAT_GENERAL_COUNT)))
01081     {
01082       LogCrit(COMPONENT_INIT,
01083               "Error registering statistic variables to SNMP");
01084       return 2;
01085     }
01086 
01087   if(nfs_param.extern_param.snmp_adm.export_cache_stats)
01088     {
01089       if((rc =
01090           snmp_adm_register_get_set_function(STAT_OID, snmp_export_stat_cache,
01091                                              SNMPADM_STAT_CACHE_COUNT)))
01092         {
01093           LogCrit(COMPONENT_INIT,
01094                   "Error registering statistic variables to SNMP");
01095           return 2;
01096         }
01097     }
01098 
01099   if(nfs_param.extern_param.snmp_adm.export_requests_stats)
01100     {
01101       if((rc =
01102           snmp_adm_register_get_set_function(STAT_OID, snmp_export_stat_req,
01103                                              SNMPADM_STAT_REQ_COUNT)))
01104         {
01105           LogCrit(COMPONENT_INIT,
01106                   "Error registering statistic variables to SNMP");
01107           return 2;
01108         }
01109     }
01110 
01111   if(nfs_param.extern_param.snmp_adm.export_maps_stats)
01112     {
01113       if((rc =
01114           snmp_adm_register_get_set_function(STAT_OID, snmp_export_stat_maps,
01115                                              SNMPADM_STAT_MAPS_COUNT)))
01116         {
01117           LogCrit(COMPONENT_INIT,
01118                   "Error registering statistic variables to SNMP");
01119           return 2;
01120         }
01121     }
01122 
01123   if(nfs_param.extern_param.snmp_adm.export_nfs_calls_detail)
01124     {
01125       create_dyn_mntv1_stat(&dyn_gs, &dyn_gs_count);
01126 
01127       if((rc = snmp_adm_register_get_set_function(STAT_OID, dyn_gs, dyn_gs_count)))
01128         {
01129           LogCrit(COMPONENT_INIT,
01130                   "Error registering mntv1 statistic variables to SNMP");
01131           return 2;
01132         }
01133 
01134       free_dyn(dyn_gs, dyn_gs_count);
01135 
01136       create_dyn_mntv3_stat(&dyn_gs, &dyn_gs_count);
01137 
01138       if((rc = snmp_adm_register_get_set_function(STAT_OID, dyn_gs, dyn_gs_count)))
01139         {
01140           LogCrit(COMPONENT_INIT,
01141                   "Error registering mntv3 statistic variables to SNMP");
01142           return 2;
01143         }
01144 
01145       free_dyn(dyn_gs, dyn_gs_count);
01146 
01147       create_dyn_nfsv2_stat(&dyn_gs, &dyn_gs_count);
01148 
01149       if((rc = snmp_adm_register_get_set_function(STAT_OID, dyn_gs, dyn_gs_count)))
01150         {
01151           LogCrit(COMPONENT_INIT,
01152                   "Error registering nfsv2 statistic variables to SNMP");
01153           return 2;
01154         }
01155 
01156       free_dyn(dyn_gs, dyn_gs_count);
01157 
01158       create_dyn_nfsv3_stat(&dyn_gs, &dyn_gs_count);
01159 
01160       if((rc = snmp_adm_register_get_set_function(STAT_OID, dyn_gs, dyn_gs_count)))
01161         {
01162           LogCrit(COMPONENT_INIT,
01163                   "Error registering nfsv3 statistic variables to SNMP");
01164           return 2;
01165         }
01166 
01167       free_dyn(dyn_gs, dyn_gs_count);
01168 
01169       create_dyn_nfsv4_stat(&dyn_gs, &dyn_gs_count);
01170 
01171       if((rc = snmp_adm_register_get_set_function(STAT_OID, dyn_gs, dyn_gs_count)))
01172         {
01173           LogCrit(COMPONENT_INIT,
01174                   "Error registering nfsv4 statistic variables to SNMP");
01175           return 2;
01176         }
01177 
01178       free_dyn(dyn_gs, dyn_gs_count);
01179     }
01180 
01181   if(nfs_param.extern_param.snmp_adm.export_fsal_calls_detail)
01182     {
01183       create_dyn_fsal_stat(&dyn_gs, &dyn_gs_count);
01184 
01185       if((rc = snmp_adm_register_get_set_function(STAT_OID, dyn_gs, dyn_gs_count)))
01186         {
01187           LogCrit(COMPONENT_INIT,
01188                   "Error registering nfsv4 statistic variables to SNMP");
01189           return 2;
01190         }
01191 
01192       free_dyn(dyn_gs, dyn_gs_count);
01193     }
01194 
01195   /*
01196    * Set up logging snmp adm control
01197    */
01198 
01199   /* always register general logging variables */
01200   create_dyn_log_control(&dyn_gs, &dyn_gs_count);
01201 
01202   if((rc = snmp_adm_register_get_set_function(LOG_OID, dyn_gs, dyn_gs_count)))
01203     {
01204       LogCrit(COMPONENT_INIT,
01205               "Error registering logging component variables to SNMP");
01206       return 2;
01207     }
01208 
01209   free_dyn(dyn_gs, dyn_gs_count);
01210 
01211 #ifdef _ERROR_INJECTION
01212   rc = init_error_injector();
01213   if(rc != 0)
01214     return rc;
01215 #endif
01216 
01217   /* finally, start the admin thread */
01218   if((rc = snmp_adm_start()))
01219     {
01220       LogCrit(COMPONENT_INIT,
01221               "Error starting SNMP administration service");
01222       return 3;
01223     }
01224 
01225   return 0;
01226 
01227 }
01228 
01229       /* Now managed IP stats dump */
01230 /* FIXME 
01231       nfs_ip_stats_dump(  ht_ip_stats, 
01232                           nfs_param.core_param.nb_worker, 
01233                           nfs_param.core_param.stats_per_client_directory  ) ;
01234 */