nfs-ganesha 1.4
|
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 */