snmp源码分析[1].doc

上传人:豆**** 文档编号:33461704 上传时间:2022-08-11 格式:DOC 页数:14 大小:72KB
返回 下载 相关 举报
snmp源码分析[1].doc_第1页
第1页 / 共14页
snmp源码分析[1].doc_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《snmp源码分析[1].doc》由会员分享,可在线阅读,更多相关《snmp源码分析[1].doc(14页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、如有侵权,请联系网站删除,仅供学习与交流snmp源码分析1【精品文档】第 14 页#include #include #include #if HAVE_STDLIB_H#include #endif#if TIME_WITH_SYS_TIME# ifdef WIN32# include # else# include # endif# include #else# if HAVE_SYS_TIME_H# include # else# include # endif#endif#include util_funcs.h包含自己的头文件#include Display_time.h#defin

2、e EXAMPLE_STR_LEN 300#define EXAMPLE_STR_DEFAULT life the universe and everythingint example_int = 42;char example_strEXAMPLE_STR_LEN;void example_parse_config_exampleint(const char *token, char *cptr);void example_parse_config_examplestr(const char *token, char *cptr);void example_free_config_examp

3、leint(void);void example_free_config_examplestr(void);这个数组的类型是struct variableN, 其中N是这个数组中OID号的最长的数,即:结构体最后一个成员(这个成员是个数组)定义了MIB Tree OID的底层数字。 N定义了MIB Tree OID的底层的层数(也就是这个数组的长度)。 所有有效的N数字都定义在了文件中。struct variableN类型成员的说明: 1):FoxmailINT:这个magic number是在自己的头文件Display_time.h中宏定义, 这个参数被用来传递给CallBack 例程,用来

4、决定那个object被查询。 2):ASN_INTEGER:这个参数说明了object的类型,所有有效的类型在snmp_impl.h文件中列表说明。 3):RONLY:这个参数说明了object是否能够被set。 4):var_foxmail:当有object被查询时,这个CallBack 例程被调用。 一般的情况下,同一个文件中的所有的object使用相同的allBack 例程。 5):1:MIB Tree OID的底层数字的层数。(这个数字决定了struct variableN中的N) 6):1:MIB Tree OID的底层数字。struct variable2 example_vari

5、ables = EXAMPLESTRING, ASN_OCTET_STR, RONLY, var_example, 1, 1, EXAMPLEINTEGER, ASN_INTEGER, RWRITE, var_example, 2, 2, 1, EXAMPLEOBJECTID, ASN_OBJECT_ID, RONLY, var_example, 2, 2, 2, EXAMPLETIMETICKS, ASN_TIMETICKS, RONLY, var_example, 1, 3, EXAMPLEIPADDRESS, ASN_IPADDRESS, RONLY, var_example, 1, 4

6、, EXAMPLECOUNTER, ASN_COUNTER, RONLY, var_example, 1, 5, EXAMPLEGAUGE, ASN_GAUGE, RONLY, var_example, 1, 6, EXAMPLETRIGGERTRAP, ASN_INTEGER, RWRITE, var_example, 1, 7, EXAMPLETRIGGERTRAP2, ASN_INTEGER, RWRITE, var_example, 1, 8;下面这个数组定义了MIB Tree OID的顶层数字。oid example_variables_oid = 1, 3, 6, 1, 4, 1,

7、 2021, 254 ;这个例程在Agent程序开始的时候被调用,用来初始化可能被查询的Object。void init_example(void) 注册我们自己的MIB Tree,以便Agent查询的时候能够处理。 参数: 1)descr: 描述这个MIB Tree 2)var: 变量结构体,类型struct variableN。 3)vartype: 类型struct variableN 4)theoid: MIB Tree的顶层数字 REGISTER_MIB(example, example_variables, variable2, example_variables_oid); 把e

8、xample_str变量设上默认字符串。example_int已经在上面初始化了。 strncpy(example_str, EXAMPLE_STR_DEFAULT, EXAMPLE_STR_LEN); * Register config handlers for the two objects that can be set * via configuration file directive snmpd_register_config_handler(exampleint, example_parse_config_exampleint, example_free_config_examp

9、leint, exampleint value); snmpd_register_config_handler(examplestr, example_parse_config_examplestr, example_free_config_examplestr, examplestr value); snmpd_register_config_handler(examplestring, example_parse_config_examplestr, example_free_config_examplestr, examplestring value); 我们经常需要读取内核中的数据,我

10、们需要在这里进行一些必要的初始化。 以加快我们读取这些内核信息的速度,快速反应查询请求。配置文件处理函数voidexample_parse_config_exampleint(const char *token, char *cptr) example_int = atoi(cptr);voidexample_parse_config_examplestr(const char *token, char *cptr) 必须确保字符串长度小于分配的空间。 if (strlen(cptr) magic) case EXAMPLESTRING: sprintf(string, example_str

11、); 在上面时假设返回值是integer,但是并不是,所以需要重新设置var_len。 *var_len = strlen(string); return (u_char *) string; case EXAMPLEINTEGER: 这种情况,上面的假设的长度是正确的,但是这个object是可以写的,所以需要设置write_method。 long_ret = example_int; *write_method = write_exampleint; return (u_char *) & long_ret; case EXAMPLEOBJECTID: oid_ret0 = 1; oid_

12、ret1 = 3; oid_ret2 = 6; oid_ret3 = 1; oid_ret4 = 4; oid_ret5 = oid_ret6 = oid_ret7 = 42; 这种情况,上面的假设的长度是错误的。 *var_len = 8 * sizeof(oid); return (u_char *) oid_ret; case EXAMPLETIMETICKS: 这种情况,上面的假设的长度是正确的,直接返回。 long_ret = 363136200; return (u_char *) & long_ret; case EXAMPLEIPADDRESS: long_ret = ntoh

13、l(INADDR_LOOPBACK); return (u_char *) & long_ret; case EXAMPLECOUNTER: long_ret = 42; return (u_char *) & long_ret; case EXAMPLEGAUGE: long_ret = 42; return (u_char *) & long_ret; case EXAMPLETRIGGERTRAP: 这个object是只能够写的“write-only”。 它的作用是只能够产生一个“trap”,当读它的时候只能够返回0。 long_ret = 0; *write_method = writ

14、e_exampletrap; return (u_char *) & long_ret; case EXAMPLETRIGGERTRAP2: 这个object是只能够写的“write-only”。 它的作用是只能够产生一个SNMP v2版本的“trap”,当读它的时候只能够返回0。 long_ret = 0; *write_method = write_exampletrap2; return (u_char *) & long_ret; default: 这种情况,报告一个错误,并把错误写入log。 DEBUGMSGTL(snmpd, unknown sub-id %d in example

15、s/var_examplen, vp-magic); return NULL;当某个object是可写的时候,需要设置SET处理例程。intwrite_exampleint(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len) 定义一个允许访问的最大数值,它是任意的。#define MAX_EXAMPLE_INT 100 static long intval; static long old_intval; switc

16、h (action) case RESERVE1: 检查要设置的值是否符合条件。 if (var_val_type != ASN_INTEGER) DEBUGMSGTL(example, %x not integer type, var_val_type); return SNMP_ERR_WRONGTYPE; if (var_val_len sizeof(long) DEBUGMSGTL(example, wrong length %x, var_val_len); return SNMP_ERR_WRONGLENGTH; intval = *(long *) var_val); if (i

17、ntval MAX_EXAMPLE_INT) DEBUGMSGTL(example, wrong value %x, intval); return SNMP_ERR_WRONGVALUE; break; case RESERVE2: break; case FREE: break; case ACTION: 按照请求设置数值,但是这个请求可能被撤销,所以需要保存原来的值。 old_intval = example_int; example_int = intval; break; case UNDO: 撤销上一个请求,恢复原来的值。 example_int = old_intval; bre

18、ak; case COMMIT: break; return SNMP_ERR_NOERROR;intwrite_exampletrap(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len) long intval; DEBUGMSGTL(example, write_exampletrap entered: action=%dn, action); switch (action) case RESERVE1: if

19、(var_val_type != ASN_INTEGER) DEBUGMSGTL(example, %x not integer type, var_val_type); return SNMP_ERR_WRONGTYPE; if (var_val_len sizeof(long) DEBUGMSGTL(example, wrong length %x, var_val_len); return SNMP_ERR_WRONGLENGTH; intval = *(long *) var_val); if (intval != 1) DEBUGMSGTL(example, wrong value

20、%x, intval); return SNMP_ERR_WRONGVALUE; break; case RESERVE2: break; case FREE: break; case ACTION: break; case UNDO: break; case COMMIT: 产生一个“trap” DEBUGMSGTL(example, write_exampletrap sending the trapn, action); send_easy_trap(SNMP_TRAP_ENTERPRISESPECIFIC, 99); DEBUGMSGTL(example, write_examplet

21、rap trap sentn, action); break; return SNMP_ERR_NOERROR;intwrite_exampletrap2(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len) long intval; oid objid_snmptrap = 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 ; oid demo_trap = 1, 3, 6, 1, 4, 1, 2021

22、, 13, 990 ; oid example_string_oid = 1, 3, 6, 1, 4, 1, 2021, 254, 1, 0 ; static netsnmp_variable_list var_trap; static netsnmp_variable_list var_obj; DEBUGMSGTL(example, write_exampletrap2 entered: action=%dn, action); switch (action) case RESERVE1: if (var_val_type != ASN_INTEGER) DEBUGMSGTL(exampl

23、e, %x not integer type, var_val_type); return SNMP_ERR_WRONGTYPE; if (var_val_len sizeof(long) DEBUGMSGTL(example, wrong length %x, var_val_len); return SNMP_ERR_WRONGLENGTH; intval = *(long *) var_val); if (intval != 1) DEBUGMSGTL(example, wrong value %x, intval); return SNMP_ERR_WRONGVALUE; break;

24、 case RESERVE2: break; case FREE: break; case ACTION: break; case UNDO: break; case COMMIT: 产生一个 SNMP v2版本的“trap” var_trap.next_variable = &var_obj; var_trap.name = objid_snmptrap; var_trap.name_length = sizeof(objid_snmptrap) / sizeof(oid); var_trap.type = ASN_OBJECT_ID; var_trap.val.objid = demo_t

25、rap; var_trap.val_len = sizeof(demo_trap); var_obj.next_variable = NULL; var_obj.name = example_string_oid; var_obj.name_length = sizeof(example_string_oid) / sizeof(oid); var_obj.type = ASN_OCTET_STR; var_obj.val.string = example_str; var_obj.val_len = strlen(example_str); DEBUGMSGTL(example, write

26、_exampletrap2 sending the v2 trapn, action); send_v2trap(&var_trap); DEBUGMSGTL(example, write_exampletrap2 v2 trap sentn, action); break; return SNMP_ERR_NOERROR;REGISTER_MIB()宏定义最终调用的是netsnmp_register_old_api函数。里面用到了这个结构体。typedef struct netsnmp_handler_registration_s char *handlerName; char *conte

27、xtName; oid *rootoid; size_t rootoid_len; netsnmp_mib_handler *handler; int modes; int priority; int range_subid; oid range_ubound; int timeout; int global_cacheid; void * my_reg_void; netsnmp_handler_registration;在调用netsnmp_register_handler(reginfo)函数注册netsnmp_handler_registration 类型的reginfo变量。nets

28、nmp_register_handler()在agent/agent_handler.c文件中定义。有调用netsnmp_register_mib()函数这个函数构建一个netsnmp_subtree 类型的变量subtree进行注册。typedef struct netsnmp_subtree_s oid *name_a; u_char namelen; oid *start_a; u_char start_len; oid *end_a; u_char end_len; struct variable *variables; int variables_len; int variables

29、_width; char *label_a; netsnmp_session *session; u_char flags; u_char priority; int timeout; struct netsnmp_subtree_s *next; struct netsnmp_subtree_s *prev; struct netsnmp_subtree_s *children; int range_subid; oid range_ubound; netsnmp_handler_registration *reginfo; int cacheid; int global_cacheid; netsnmp_subtree;调用这个函数netsnmp_subtree_load()进行注册。转自:分享 0顶

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com