1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (c) 2005 Cluster File Systems, Inc.
5 * Author: PJ Kirner <pjkirner@clusterfs.com>
7 * This file is part of Lustre, http://www.lustre.org.
9 * Lustre is free software; you can redistribute it and/or
10 * modify it under the terms of version 2 of the GNU General Public
11 * License as published by the Free Software Foundation.
13 * Lustre is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with Lustre; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include <net-snmp/net-snmp-config.h>
24 #include <net-snmp/net-snmp-includes.h>
25 #include <net-snmp/agent/net-snmp-agent-includes.h>
26 #include <net-snmp/utilities.h>
28 #include "lustre-snmp.h"
31 * clusterFileSystems_variables_oid:
32 * this is the top level oid that we want to register under. This
33 * is essentially a prefix, with the suffix appearing in the
38 oid clusterFileSystems_variables_oid[] = { 1,3,6,1,4,1,13140 };
42 * variable7 clusterFileSystems_variables:
43 * this variable defines function callbacks and type return information
44 * for the clusterFileSystems mib section
48 struct variable7 clusterFileSystems_variables[] = {
49 /* magic number , variable type , ro/rw , callback fn , L, oidsuffix */
51 /* sytemInformation 2.1.1. */
52 { SYSVERSION , ASN_OCTET_STR , RONLY , var_clusterFileSystems, 4, { 2,1,1,1 } },
53 { SYSKERNELVERSION , ASN_OCTET_STR , RONLY , var_clusterFileSystems, 4, { 2,1,1,2 } },
54 { SYSHEALTHCHECK , ASN_OCTET_STR , RONLY , var_clusterFileSystems, 4, { 2,1,1,3 } },
55 { SYSSTATUS , ASN_INTEGER , RWRITE, var_clusterFileSystems, 4, { 2,1,1,4 } },
57 /* objectStorageTargets 2.1.2 */
58 { OSDNUMBER , ASN_UNSIGNED , RONLY , var_clusterFileSystems, 4, { 2,1,2,1 } },
60 /* objectStorageTargets.osdTable.osdEntry 2.1.2.2.1 */
61 { OSDUUID , ASN_OCTET_STR , RONLY , var_osdTable, 6, { 2,1,2,2,1,2 } },
62 { OSDCOMMONNAME , ASN_OCTET_STR , RONLY , var_osdTable, 6, { 2,1,2,2,1,3 } },
63 { OSDCAPACITY , ASN_COUNTER64 , RONLY , var_osdTable, 6, { 2,1,2,2,1,4 } },
64 { OSDFREECAPACITY , ASN_COUNTER64 , RONLY , var_osdTable, 6, { 2,1,2,2,1,5 } },
65 { OSDOBJECTS , ASN_COUNTER64 , RONLY , var_osdTable, 6, { 2,1,2,2,1,6 } },
66 { OSDFREEOBJECTS , ASN_COUNTER64 , RONLY , var_osdTable, 6, { 2,1,2,2,1,7 } },
68 /* objectStorageClients 2.1.3 */
69 { OSCNUMBER , ASN_UNSIGNED , RONLY , var_clusterFileSystems, 4, { 2,1,3,1 } },
71 /* objectStorageClients.oscTable.oscEntry 2.1.3.2.1 */
72 { OSCUUID , ASN_OCTET_STR , RONLY , var_oscTable, 6, { 2,1,3,2,1,2 } },
73 { OSCCOMMONNAME , ASN_OCTET_STR , RONLY , var_oscTable, 6, { 2,1,3,2,1,3 } },
74 { OSCOSTSERVERUUID , ASN_OCTET_STR , RONLY , var_oscTable, 6, { 2,1,3,2,1,4 } },
75 { OSCCAPACITY , ASN_COUNTER64 , RONLY , var_oscTable, 6, { 2,1,3,2,1,5 } },
76 { OSCFREECAPACITY , ASN_COUNTER64 , RONLY , var_oscTable, 6, { 2,1,3,2,1,6 } },
77 { OSCOBJECTS , ASN_COUNTER64 , RONLY , var_oscTable, 6, { 2,1,3,2,1,7 } },
78 { OSCFREEOBJECTS , ASN_COUNTER64 , RONLY , var_oscTable, 6, { 2,1,3,2,1,8 } },
81 /* metaDataServers 2.1.4 */
82 { MDDNUMBER , ASN_UNSIGNED , RONLY , var_clusterFileSystems, 4, { 2,1,4,1 } },
84 /* metaDataServers.mddTable.mddEntry 2.1.4.2.1 */
85 { MDDUUID , ASN_OCTET_STR , RONLY , var_mdsTable, 6, { 2,1,4,2,1,2 } },
86 { MDDCOMMONNAME , ASN_OCTET_STR , RONLY , var_mdsTable, 6, { 2,1,4,2,1,3 } },
87 { MDDCAPACITY , ASN_COUNTER64 , RONLY , var_mdsTable, 6, { 2,1,4,2,1,4 } },
88 { MDDFREECAPACITY , ASN_COUNTER64 , RONLY , var_mdsTable, 6, { 2,1,4,2,1,5 } },
89 { MDDFILES , ASN_COUNTER64 , RONLY , var_mdsTable, 6, { 2,1,4,2,1,6 } },
90 { MDDFREEFILES , ASN_COUNTER64 , RONLY , var_mdsTable, 6, { 2,1,4,2,1,7 } },
91 { MDSNBSAMPLEDREQ , ASN_COUNTER64 , RONLY , var_mdsNbSampledReq, 4, { 2,1,4,3 } },
93 /* metaDataClients 2.1.5 */
94 { MDCNUMBER , ASN_UNSIGNED , RONLY , var_clusterFileSystems, 4, { 2,1,5,1 } },
96 /* metaDataClients.mdcTable.mdcEntry 2.1.5.2.1 */
97 { MDCUUID , ASN_OCTET_STR , RONLY , var_mdcTable, 6, { 2,1,5,2,1,2 } },
98 { MDCCOMMONNAME , ASN_OCTET_STR , RONLY , var_mdcTable, 6, { 2,1,5,2,1,3 } },
99 { MDCMDSSERVERUUID , ASN_OCTET_STR , RONLY , var_mdcTable, 6, { 2,1,5,2,1,4 } },
100 { MDCCAPACITY , ASN_COUNTER64 , RONLY , var_mdcTable, 6, { 2,1,5,2,1,5 } },
101 { MDCFREECAPACITY , ASN_COUNTER64 , RONLY , var_mdcTable, 6, { 2,1,5,2,1,6 } },
102 { MDCOBJECTS , ASN_COUNTER64 , RONLY , var_mdcTable, 6, { 2,1,5,2,1,7 } },
103 { MDCFREEOBJECTS , ASN_COUNTER64 , RONLY , var_mdcTable, 6, { 2,1,5,2,1,8 } },
105 /* lustreClients 2.1.6 */
106 { CLIMOUNTNUMBER , ASN_UNSIGNED , RONLY , var_clusterFileSystems, 4, { 2,1,6,1 } },
108 /* lustreClients.cliMountTable.cliMountEntry 2.1.6.2.1 */
109 { CLIUUID , ASN_OCTET_STR , RONLY , var_cliTable, 6, { 2,1,6,2,1,2 } },
110 { CLICOMMONNAME , ASN_OCTET_STR , RONLY , var_cliTable, 6, { 2,1,6,2,1,3 } },
111 { CLIMDCUUID , ASN_OCTET_STR , RONLY , var_cliTable, 6, { 2,1,6,2,1,4 } },
112 { CLIMDCCOMMONNAME , ASN_OCTET_STR , RONLY , var_cliTable, 6, { 2,1,6,2,1,5 } },
113 { CLIUSESLOV , ASN_INTEGER , RONLY , var_cliTable, 6, { 2,1,6,2,1,6 } },
114 { CLILOVUUID , ASN_OCTET_STR , RONLY , var_cliTable, 6, { 2,1,6,2,1,7 } },
115 { CLILOVCOMMONNAME , ASN_OCTET_STR , RONLY , var_cliTable, 6, { 2,1,6,2,1,8 } },
117 /* logicalObjectVolume 2.1.7 */
118 { LOVNUMBER , ASN_UNSIGNED , RONLY , var_clusterFileSystems, 4, { 2,1,7,1 } },
120 /* logicalObjectVolume.osdTable.lovTable 2.1.2.2.1 */
121 { LOVUUID , ASN_OCTET_STR , RONLY , var_lovTable, 6, { 2,1,7,2,1,2 } },
122 { LOVCOMMONNAME , ASN_OCTET_STR , RONLY , var_lovTable, 6, { 2,1,7,2,1,3 } },
123 { LOVNUMOBD , ASN_UNSIGNED , RONLY , var_lovTable, 6, { 2,1,7,2,1,4 } },
124 { LOVNUMACTIVEOBD , ASN_UNSIGNED , RONLY , var_lovTable, 6, { 2,1,7,2,1,5 } },
125 { LOVCAPACITY , ASN_COUNTER64 , RONLY , var_lovTable, 6, { 2,1,7,2,1,6 } },
126 { LOVFREECAPACITY , ASN_COUNTER64 , RONLY , var_lovTable, 6, { 2,1,7,2,1,7 } },
127 { LOVFILES , ASN_COUNTER64 , RONLY , var_lovTable, 6, { 2,1,7,2,1,8 } },
128 { LOVFREEFILES , ASN_COUNTER64 , RONLY , var_lovTable, 6, { 2,1,7,2,1,9 } },
129 { LOVSTRIPECOUNT , ASN_UNSIGNED , RONLY , var_lovTable, 6, { 2,1,7,2,1,10} },
130 { LOVSTRIPEOFFSET , ASN_UNSIGNED , RONLY , var_lovTable, 6, { 2,1,7,2,1,11} },
131 { LOVSTRIPESIZE , ASN_UNSIGNED , RONLY , var_lovTable, 6, { 2,1,7,2,1,12} },
132 { LOVSTRIPETYPE , ASN_UNSIGNED , RONLY , var_lovTable, 6, { 2,1,7,2,1,13} },
134 /* lustreLDLM 2.1.8 */
135 { LDLMNUMBER , ASN_UNSIGNED , RONLY , var_clusterFileSystems, 4, { 2,1,8,1 } },
137 /* lustreLDLM.ldlmTable.ldlmEntry 2.1.8.2.1 */
138 { LDLMNAMESPACE , ASN_OCTET_STR , RONLY , var_ldlmTable, 6, { 2,1,8,2,1,2 } },
139 { LDLMLOCKCOUNT , ASN_UNSIGNED , RONLY , var_ldlmTable, 6, { 2,1,8,2,1,3 } },
140 { LDLMUNUSEDLOCKCOUNT , ASN_UNSIGNED , RONLY , var_ldlmTable, 6, { 2,1,8,2,1,4 } },
141 { LDLMRESOURCECOUNT , ASN_UNSIGNED , RONLY , var_ldlmTable, 6, { 2,1,8,2,1,5 } },
145 /*****************************************************************************
146 * Function: init_cfsNetSNMPPlugin
148 * Description: Called when the agent starts up
154 ****************************************************************************/
156 void init_lustresnmp(void) {
158 /* register ourselves with the agent to handle our mib tree */
159 REGISTER_MIB("clusterFileSystems", clusterFileSystems_variables, variable7,
160 clusterFileSystems_variables_oid);
162 initilize_trap_handler();
164 DEBUGMSGTL(("lsnmpd", "%s %s \n", __FUNCTION__, "Initialization Done"));
167 /*****************************************************************************
168 * Function: deinit_cfsNetSNMPPlugin
170 * Description: Called when the agent terminates up
176 ****************************************************************************/
178 void deinit_lustresnmp(void) {
180 /* deregister ourselves with the agent */
181 unregister_mib(clusterFileSystems_variables_oid,
182 sizeof(clusterFileSystems_variables_oid)/sizeof(clusterFileSystems_variables_oid));
184 terminate_trap_handler();
186 DEBUGMSGTL(("lsnmpd", "%s %s \n", __FUNCTION__, "Termination Done"));
189 /*****************************************************************************
190 * Function: var_clusterFileSystems
192 ****************************************************************************/
194 var_clusterFileSystems(struct variable *vp,
199 WriteMethod **write_method)
203 /* variables we may use later */
204 static long long_ret;
205 static u_long ulong_ret;
206 static unsigned char string[SPRINT_MAX_LEN];
207 char file_path[MAX_PATH_SIZE];
211 if (header_generic(vp,name,length,exact,var_len,write_method)
217 * this is where we do the value assignments for the mib results.
222 sprintf(file_path, "%s%s", LUSTRE_PATH,"version");
223 if( SUCCESS != read_string(file_path, string,sizeof(string)))
225 *var_len = strlen(string);
226 return (unsigned char *) string;
228 case SYSKERNELVERSION:
229 sprintf(file_path, "%s%s", LUSTRE_PATH,"kernel_version");
230 if( SUCCESS != read_string(file_path, string,sizeof(string)))
232 *var_len = strlen(string);
233 return (unsigned char *) string;
236 sprintf(file_path, "%s%s", LUSTRE_PATH,FILENAME_SYSHEALTHCHECK);
237 if( SUCCESS != read_string(file_path, string,sizeof(string)))
239 *var_len = strlen(string);
240 return (unsigned char *) string;
243 *write_method = write_sysStatus;
244 long_ret = (long) get_sysstatus();
245 if (long_ret != ERROR)
246 return (unsigned char *) &long_ret;
250 if( 0 == (dir_list = get_file_list(OSD_PATH, DIR_TYPE, &num)))
252 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",OSD_PATH,num));
255 return (unsigned char *) &ulong_ret;
258 if( 0 == (dir_list = get_file_list(OSC_PATH, DIR_TYPE, &num)))
260 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",OSC_PATH,num));
263 return (unsigned char *) &ulong_ret;
266 if( 0 == (dir_list = get_file_list(MDS_PATH, DIR_TYPE, &num)))
268 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",MDS_PATH,num));
271 return (unsigned char *) &ulong_ret;
274 if( 0 == (dir_list = get_file_list(MDC_PATH, DIR_TYPE, &num)))
276 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",MDC_PATH,num));
279 return (unsigned char *) &ulong_ret;
282 if( 0 == (dir_list = get_file_list(CLIENT_PATH, DIR_TYPE, &num)))
284 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",CLIENT_PATH,num));
287 return (unsigned char *) &ulong_ret;
290 if( 0 == (dir_list = get_file_list(LOV_PATH, DIR_TYPE, &num)))
292 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",LOV_PATH,num));
295 return (unsigned char *) &ulong_ret;
298 if( 0 == (dir_list = get_file_list(LDLM_PATH, DIR_TYPE, &num)))
300 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",LDLM_PATH,num));
303 return (unsigned char *) &ulong_ret;
311 struct oid_table osd_table[] =
313 { OSDUUID,FILENAME_UUID,oid_table_string_handler},
314 { OSDCOMMONNAME,0,oid_table_obj_name_handler},
315 { OSDCAPACITY,FILENAME_KBYTES_TOTAL, oid_table_c64_kb_handler},
316 { OSDFREECAPACITY,FILENAME_KBYTES_FREE, oid_table_c64_kb_handler},
317 { OSDOBJECTS,FILENAME_FILES_TOTAL, oid_table_c64_kb_handler},
318 { OSDFREEOBJECTS,FILENAME_FILES_FREE, oid_table_c64_kb_handler},
319 { 0,0,0 } /*End of table*/
323 /*****************************************************************************
324 * Function: var_osdTable
326 ****************************************************************************/
328 var_osdTable(struct variable *vp,
333 WriteMethod **write_method)
335 return var_genericTable(vp,name,length,exact,var_len,write_method,
339 struct oid_table osc_table[] =
341 { OSCUUID,FILENAME_UUID,oid_table_string_handler},
342 { OSCCOMMONNAME,0,oid_table_obj_name_handler},
343 { OSCOSTSERVERUUID,"ost_server_uuid",oid_table_string_handler},
344 { OSCCAPACITY,FILENAME_KBYTES_TOTAL, oid_table_c64_kb_handler},
345 { OSCFREECAPACITY,FILENAME_KBYTES_FREE, oid_table_c64_kb_handler},
346 { OSCOBJECTS,FILENAME_FILES_TOTAL, oid_table_c64_kb_handler},
347 { OSCFREEOBJECTS,FILENAME_FILES_FREE, oid_table_c64_kb_handler},
348 { 0,0,0 } /*End of table*/
351 /*****************************************************************************
352 * Function: var_oscTable
354 ****************************************************************************/
356 var_oscTable(struct variable *vp,
361 WriteMethod **write_method)
363 return var_genericTable(vp,name,length,exact,var_len,write_method,
367 struct oid_table mds_table[] =
369 { MDDUUID,FILENAME_UUID,oid_table_string_handler},
370 { MDDCOMMONNAME,0,oid_table_obj_name_handler},
371 { MDDCAPACITY,FILENAME_KBYTES_TOTAL, oid_table_c64_kb_handler},
372 { MDDFREECAPACITY,FILENAME_KBYTES_FREE, oid_table_c64_kb_handler},
373 { MDDFILES,FILENAME_FILES_TOTAL, oid_table_c64_kb_handler},
374 { MDDFREEFILES,FILENAME_FILES_FREE, oid_table_c64_kb_handler},
375 { 0,0,0 } /*End of table*/
378 /*****************************************************************************
379 * Function: var_mdsTable
381 ****************************************************************************/
383 var_mdsTable(struct variable *vp,
388 WriteMethod **write_method)
390 return var_genericTable(vp,name,length,exact,var_len,write_method,
394 struct oid_table mdc_table[] =
396 { MDCUUID,FILENAME_UUID,oid_table_string_handler},
397 { MDCCOMMONNAME,0,oid_table_obj_name_handler},
398 { MDCMDSSERVERUUID,"mds_server_uuid",oid_table_string_handler},
399 { MDCCAPACITY,FILENAME_KBYTES_TOTAL, oid_table_c64_kb_handler},
400 { MDCFREECAPACITY,FILENAME_KBYTES_FREE, oid_table_c64_kb_handler},
401 { MDCOBJECTS,FILENAME_FILES_TOTAL, oid_table_c64_kb_handler},
402 { MDCFREEOBJECTS,FILENAME_FILES_FREE, oid_table_c64_kb_handler},
403 { 0,0,0 } /*End of table*/
407 /*****************************************************************************
408 * Function: var_mdcTable
410 ****************************************************************************/
412 var_mdcTable(struct variable *vp,
417 WriteMethod **write_method)
419 return var_genericTable(vp,name,length,exact,var_len,write_method,
424 struct oid_table cli_table[] =
426 { CLIUUID,FILENAME_UUID,oid_table_string_handler},
427 { CLICOMMONNAME,0,oid_table_obj_name_handler},
428 { CLIMDCUUID,"mdc/" FILENAME_UUID,oid_table_string_handler},
429 { CLIMDCCOMMONNAME,"mdc/" FILENAME_COMMON_NAME,oid_table_string_handler},
430 { CLIUSESLOV,"lov/",oid_table_is_directory_handler},
431 { CLILOVUUID,"lov/" FILENAME_UUID,oid_table_string_handler},
432 { CLILOVCOMMONNAME,"lov/" FILENAME_COMMON_NAME,oid_table_string_handler},
433 { 0,0,0 } /*End of table*/
436 /*****************************************************************************
437 * Function: var_cliTable
439 ****************************************************************************/
441 var_cliTable(struct variable *vp,
446 WriteMethod **write_method)
448 return var_genericTable(vp,name,length,exact,var_len,write_method,
449 CLIENT_PATH,cli_table);
453 struct oid_table lov_table[] =
455 { LOVUUID,FILENAME_UUID,oid_table_string_handler},
456 { LOVCOMMONNAME,0,oid_table_obj_name_handler},
457 { LOVNUMOBD,"numobd", oid_table_ulong_handler},
458 { LOVNUMACTIVEOBD,"activeobd", oid_table_ulong_handler},
459 { LOVCAPACITY,FILENAME_KBYTES_TOTAL, oid_table_c64_kb_handler},
460 { LOVFREECAPACITY,FILENAME_KBYTES_FREE, oid_table_c64_kb_handler},
461 { LOVFILES,FILENAME_FILES_TOTAL, oid_table_c64_kb_handler},
462 { LOVFREEFILES,FILENAME_FILES_FREE, oid_table_c64_kb_handler},
463 { LOVSTRIPECOUNT,"stripecount", oid_table_ulong_handler},
464 { LOVSTRIPEOFFSET,"stripeoffset", oid_table_ulong_handler},
465 { LOVSTRIPESIZE,"stripesize", oid_table_ulong_handler},
466 { LOVSTRIPETYPE,"stripetype", oid_table_ulong_handler},
467 { 0,0,0 } /*End of table*/
471 /*****************************************************************************
472 * Function: var_lovTable
474 ****************************************************************************/
476 var_lovTable(struct variable *vp,
481 WriteMethod **write_method)
483 return var_genericTable(vp,name,length,exact,var_len,write_method,
487 struct oid_table ldlm_table[] =
489 { LDLMNAMESPACE,0,oid_table_obj_name_handler},
490 { LDLMLOCKCOUNT,"lock_count", oid_table_ulong_handler},
491 { LDLMUNUSEDLOCKCOUNT,"lock_unused_count", oid_table_ulong_handler},
492 { LDLMRESOURCECOUNT,"resource_count", oid_table_ulong_handler},
493 { 0,0,0 } /*End of table*/
497 /*****************************************************************************
498 * Function: var_ldlmTable
500 ****************************************************************************/
502 var_ldlmTable(struct variable *vp,
507 WriteMethod **write_method)
509 return var_genericTable(vp,name,length,exact,var_len,write_method,
510 LDLM_PATH,ldlm_table);
514 /*****************************************************************************
515 * Function: var_mdsNbSampledReq
517 ****************************************************************************/
519 var_mdsNbSampledReq(struct variable *vp,
524 WriteMethod **write_method)
526 unsigned long long nb_sample=0,min=0,max=0,sum=0,sum_square=0;
527 static counter64 c64;
529 if (header_generic(vp,name,length,exact,var_len,write_method)
533 if( mds_stats_values(STR_REQ_WAITIME,&nb_sample,&min,&max,&sum,&sum_square) == ERROR) return NULL;
535 c64.low = (u_long) (0x0FFFFFFFF & nb_sample);
537 c64.high = (u_long) (0x0FFFFFFFF & nb_sample);
539 *var_len = sizeof(c64);
540 return (unsigned char *) &c64;
544 /*****************************************************************************
545 * Function: write_sysStatus
547 ****************************************************************************/
549 write_sysStatus(int action,
557 static long *long_ret;
565 if (var_val_type != ASN_INTEGER){
566 fprintf(stderr, "write to sysStatus not ASN_INTEGER\n");
567 return SNMP_ERR_WRONGTYPE;
569 if (var_val_len > sizeof(long_ret)){
570 fprintf(stderr,"write to sysStatus: bad length\n");
571 return SNMP_ERR_WRONGLENGTH;
573 if ((*var_val != ONLINE) &&
574 (*var_val != OFFLINE) &&
575 (*var_val != RESTART)){
576 report("%s %s:line %d %s", __FILE__, __FUNCTION__, __LINE__,
577 "sysStatus value is invalid.");
578 return SNMP_ERR_WRONGVALUE;
585 long_ret = (long *) var_val;
592 /* Release any resources that have been allocated */
597 /* The variable has been stored in long_ret for
598 you to use, and you have just been asked to do something with
599 it. Note that anything done here must be reversable in the UNDO case */
600 new_value = *(int *) var_val;
603 lustrefs_ctrl(ONLINE);
607 lustrefs_ctrl(OFFLINE);
611 lustrefs_ctrl(RESTART);
621 /* Back out any changes made in the ACTION case */
626 /* Things are working well, so it's now safe to make the change
627 permanently. Make sure that anything done here can't fail! */
630 return SNMP_ERR_NOERROR;