snmp源码分析1.docx
- 文档编号:30559816
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:15
- 大小:19.91KB
snmp源码分析1.docx
《snmp源码分析1.docx》由会员分享,可在线阅读,更多相关《snmp源码分析1.docx(15页珍藏版)》请在冰豆网上搜索。
snmp源码分析1
#include
#include
#include
#ifHAVE_STDLIB_H
#include
#endif
#ifTIME_WITH_SYS_TIME
#ifdefWIN32
#include
#else
#include
#endif
#include
#else
#ifHAVE_SYS_TIME_H
#include
#else
#include
#endif
#endif
#include"util_funcs.h"
包含自己的头文件
#include"Display_time.h"
#defineEXAMPLE_STR_LEN300
#defineEXAMPLE_STR_DEFAULT"lifetheuniverseandeverything"
int example_int=42;
char example_str[EXAMPLE_STR_LEN];
void example_parse_config_exampleint(constchar*token,char*cptr);
void example_parse_config_examplestr(constchar*token,char*cptr);
void example_free_config_exampleint(void);
void example_free_config_examplestr(void);
这个数组的类型是structvariableN,其中N是这个数组中OID号的最长的数,
即:
结构体最后一个成员(这个成员是个数组)定义了MIBTreeOID的底层数字。
N定义了MIBTreeOID的底层的层数(也就是这个数组的长度)。
所有有效的N数字都定义在了
structvariableN类型成员的说明:
1):
FoxmailINT:
这个magicnumber是在自己的头文件Display_time.h中宏定义,
这个参数被用来传递给CallBack例程,用来决定那个object被查询。
2):
ASN_INTEGER:
这个参数说明了object的类型,所有有效的类型在snmp_impl.h文件中列表说明。
3):
RONLY:
这个参数说明了object是否能够被set。
4):
var_foxmail:
当有object被查询时,这个CallBack例程被调用。
一般的情况下,同一个文件中的所有的object使用相同的allBack例程。
5):
1:
MIBTreeOID的底层数字的层数。
(这个数字决定了structvariableN中的N)
6):
{1}:
MIBTreeOID的底层数字。
structvariable2example_variables[]={
{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}},
{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}}
};
下面这个数组定义了MIBTreeOID的顶层数字。
oid example_variables_oid[]={1,3,6,1,4,1,2021,254};
这个例程在Agent程序开始的时候被调用,用来初始化可能被查询的Object。
voidinit_example(void)
{
注册我们自己的MIBTree,以便Agent查询的时候能够处理。
参数:
1)descr:
描述这个MIBTree
2)var:
变量结构体,类型structvariableN。
3)vartype:
类型structvariableN
4)theoid:
MIBTree的顶层数字
REGISTER_MIB("example",example_variables,variable2,
example_variables_oid);
把example_str变量设上默认字符串。
example_int已经在上面初始化了。
strncpy(example_str,EXAMPLE_STR_DEFAULT,EXAMPLE_STR_LEN);
*Registerconfighandlersforthetwoobjectsthatcanbeset
*viaconfigurationfiledirective
snmpd_register_config_handler("exampleint",
example_parse_config_exampleint,
example_free_config_exampleint,
"exampleintvalue");
snmpd_register_config_handler("examplestr",
example_parse_config_examplestr,
example_free_config_examplestr,
"examplestrvalue");
snmpd_register_config_handler("examplestring",
example_parse_config_examplestr,
example_free_config_examplestr,
"examplestringvalue");
我们经常需要读取内核中的数据,我们需要在这里进行一些必要的初始化。
以加快我们读取这些内核信息的速度,快速反应查询请求。
}
配置文件处理函数
void
example_parse_config_exampleint(constchar*token,char*cptr)
{
example_int=atoi(cptr);
}
void
example_parse_config_examplestr(constchar*token,char*cptr)
{
必须确保字符串长度小于分配的空间。
if(strlen(cptr) strcpy(example_str,cptr); else{ 如果需要的话,截断这个字符串。 strncpy(example_str,cptr,EXAMPLE_STR_LEN-4); example_str[EXAMPLE_STR_LEN-4]=0; strcat(example_str,"..."); example_str[EXAMPLE_STR_LEN-1]=0; } } 当关闭Agent时需要的清除工作。 void example_free_config_exampleint(void) { } void example_free_config_examplestr(void) { } 当有请求访问这个MIBTree的object时,就会调用这个处理函数。 参数: 1)vp 被请求访问的object的example_variables的入口地址 2)name 被请求访问的object的OID 3)lengthOID的长度 4)exact 指示这个request是“exact”(GET/SET)请求,还是“inexact”(GETNEXT/GETBULK)请求 四个参数被用来返回信息: 1)name 被请求访问的object的OID 2)length OID的长度 3)var_len 返回应答的长度 4)write_method 被请求访问的object的SET函数的指针 u_char* var_example(structvariable*vp, oid*name, size_t*length, intexact,size_t*var_len,WriteMethod**write_method) { 从这个函数返回的值必须是一个staticdata的指针,这样才能够从函数外来访问。 staticchar string[EXAMPLE_STR_LEN]; staticoid oid_ret[8]; staticlong long_ret; 在进行应答请求之前,需要检查这个请求objectOID是否是一个有效的OID。 header_generic()函数能够用来检查scalarobjects。 header_simple_table()函数能够用来检查simpletable。 这些函数也当检查正确时,设置默认的返回值。 *Thenameandlengtharesetsuitablyforthecurrentobject, *var_lenassumesthattheresultisanintegerofsomeform, *andwrite_methodassumesthattheobjectcannotbeset. DEBUGMSGTL(("example","var_exampleentered\n")); if(header_generic(vp,name,length,exact,var_len,write_method)== MATCH_FAILED) returnNULL; 我们使用structvariableN结构体中的magicnumber来决定那个object被请求。 switch(vp->magic){ caseEXAMPLESTRING: sprintf(string,example_str); 在上面时假设返回值是integer,但是并不是,所以需要重新设置var_len。 *var_len=strlen(string); return(u_char*)string; caseEXAMPLEINTEGER: 这种情况,上面的假设的长度是正确的,但是这个object是可以写的,所以需要设置write_method。 long_ret=example_int; *write_method=write_exampleint; return(u_char*)&long_ret; caseEXAMPLEOBJECTID: oid_ret[0]=1; oid_ret[1]=3; oid_ret[2]=6; oid_ret[3]=1; oid_ret[4]=4; oid_ret[5]=oid_ret[6]=oid_ret[7]=42; 这种情况,上面的假设的长度是错误的。 *var_len=8*sizeof(oid); return(u_char*)oid_ret; caseEXAMPLETIMETICKS: 这种情况,上面的假设的长度是正确的,直接返回。 long_ret=363136200; return(u_char*)&long_ret; caseEXAMPLEIPADDRESS: long_ret=ntohl(INADDR_LOOPBACK); return(u_char*)&long_ret; caseEXAMPLECOUNTER: long_ret=42; return(u_char*)&long_ret; caseEXAMPLEGAUGE: long_ret=42; return(u_char*)&long_ret; caseEXAMPLETRIGGERTRAP: 这个object是只能够写的“write-only”。 它的作用是只能够产生一个“trap”,当读它的时候只能够返回0。 long_ret=0; *write_method=write_exampletrap; return(u_char*)&long_ret; caseEXAMPLETRIGGERTRAP2: 这个object是只能够写的“write-only”。 它的作用是只能够产生一个SNMPv2版本的“trap”,当读它的时候只能够返回0。 long_ret=0; *write_method=write_exampletrap2; return(u_char*)&long_ret; default: 这种情况,报告一个错误,并把错误写入log。 DEBUGMSGTL(("snmpd","unknownsub-id%dinexamples/var_example\n", vp->magic)); } returnNULL; } 当某个object是可写的时候,需要设置SET处理例程。 int write_exampleint(intaction, u_char*var_val, u_charvar_val_type, size_tvar_val_len, u_char*statP,oid*name,size_tname_len) { 定义一个允许访问的最大数值,它是任意的。 #defineMAX_EXAMPLE_INT100 staticlong intval; staticlong old_intval; switch(action){ caseRESERVE1: 检查要设置的值是否符合条件。 if(var_val_type! =ASN_INTEGER){ DEBUGMSGTL(("example","%xnotintegertype",var_val_type)); returnSNMP_ERR_WRONGTYPE; } if(var_val_len>sizeof(long)){ DEBUGMSGTL(("example","wronglength%x",var_val_len)); returnSNMP_ERR_WRONGLENGTH; } intval=*((long*)var_val); if(intval>MAX_EXAMPLE_INT){ DEBUGMSGTL(("example","wrongvalue%x",intval)); returnSNMP_ERR_WRONGVALUE; } break; caseRESERVE2: break; caseFREE: break; caseACTION: 按照请求设置数值,但是这个请求可能被撤销,所以需要保存原来的值。 old_intval=example_int; example_int=intval; break; caseUNDO: 撤销上一个请求,恢复原来的值。 example_int=old_intval; break; caseCOMMIT: break; } returnSNMP_ERR_NOERROR; } int write_exampletrap(intaction, u_char*var_val, u_charvar_val_type, size_tvar_val_len, u_char*statP,oid*name,size_tname_len) { long intval; DEBUGMSGTL(("example","write_exampletrapentered: action=%d\n", action)); switch(action){ caseRESERVE1: if(var_val_type! =ASN_INTEGER){ DEBUGMSGTL(("example","%xnotintegertype",var_val_type)); returnSNMP_ERR_WRONGTYPE; } if(var_val_len>sizeof(long)){ DEBUGMSGTL(("example","wronglength%x",var_val_len)); returnSNMP_ERR_WRONGLENGTH; } intval=*((long*)var_val); if(intval! =1){ DEBUGMSGTL(("example","wrongvalue%x",intval)); returnSNMP_ERR_WRONGVALUE;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- snmp 源码 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)