一、 定义MIB库文件:
可使用adventnet 工具包下的mibedit工具来定义私有MIB库文件。
二、 在linux环境下安装net-snmp 。安装过程如下:
1、 解压源码包:
tar –zxvf net-snmp-5.6.1.1.tar.gz
2、 进入解压后的文件目录:
cd net-snmp-5.6.1.1
3、 执行文件目录下的configure可执行文件,如果想指定程序包的安装路径,那么您首先建立相应的文件夹来存放安装信息,您可以写成./configure –prefix=/您指定的路径名。参数—prefix用来告诉系统安装信息存放的路径,如果您没有指定路径,直接执行./configure,那么程序包都会安装在系统默认的目录下,通常为:/usr/local下。例如:
./configure --prefix=/usr/local/snmp //配置 指定安装目录,安装过程会询问您以下的信息:
注意:以下问题似乎不怎么重要,那好像仅仅是官方想了解使用本软件方的信息,可以直接回车而不用回答,系统会采用默认信息,其中日志文件默认安装在/var/log/snmpd.log.数据存贮目录默认存放在/var/net-snmp下。
default version of-snmp-version(3): 3(在这里版本通常有三种形式:1,2c,3)
Systemcontact information(配置该设备的联系信息): heaven(也可以是邮箱地址)
System location (该系统设备的地理位置):BEIJING P.R China
Location to write logfile (日志文件位置): /var/log/snmpd.log
Location to Write persistent(数据存储目录): /var/net-snmp
4、 #make
编译源码包文件,通常只需要执行make命令,系统会根据Makefile层层进行编译,第一次编译需要的时间比较长. 如果make 成功的话,那么紧接着安装程序了,这一步一般不会出现错误.
#make install
5、 完成以上步骤后net-snmp的开发环境就搭建好了。如果不在PC上使用SNMP服务的话是不需要再进一步配置的。
三、 生成MIB 源文件(C格式):
1、 首先需要介绍一下MIB库和C源文件的转换工具命令:
Net-snmp安装包提供了mib2c工具, 用户可使用该工具将MIB库文件转换成C源码格式。命令:MIBS=”+param1” mib2c param2 其中param1代表需要被转换的MIB库文件,param2代表希望转换该MIB库文件下的哪一个节点相关数据。下面以AERODEV-MIB.txt中的portTrunk功能节点为例来介绍整个转换过程。
2、 将编辑好的MIB库文件拷贝到linux下net-snmp安装目录中的mibs目录。在终端下cd 到该目录,然后执行MIBS=”+AERODEV-MIB.txt” mib2c portTrunk命令即可生成portTrunk子树下的非表节点处理源码,再执行MIBS=”+AERODEV-MIB.txt” mib2c portTrkGroupTable即可生成portTrunk子树下的表portTrkGroupTable对应的C源码。对于非表节点按照提示输入1即可生成该功能对应的源文件portTrunk.c 和portTrunk.h,对于表节点需要按照提示分别输入 2,2,1,2。
3、 将生成的源码拷贝到我们的开发源码树下的user/net-snmp/agent/mibgroups/switch/private 目录下。
四、 修改相应的C源文件
1、 修改portTrunk.c和portTrunk.h源文件以实现portTrkEna和trunkType两个读写节点的功能:
1) 首先介绍一下非表节点C源码中的数据定义和函数功能:oid portTrunk_variables_oid为portTrunk子树根节点的OID值。Struct variable4 portTrunk_variables[]结构体数组为 portTrunk下的节点定义(包括非表节点和表节点的定义)。因为表节点我们稍后将会采用另外一种方式来处理,所以在此处我们将表节点相应的几个定义删去。其中包括TRKGRPINDEX、PORTTRUNKGROUPNUMBER、PORTTRUNKGROUPENABLE、PORTTRUNKGROUPMEMBER。
Void init_portTrunk(void)函数为初始化函数,会将相应节点的定义信息注册到agent的OID信息树里。
Unsigned char * var_portTrunk(struct variable *vp,oid *name,size_t *length, int exact, size_t *var_len, WriteMethod ** write_method); 函数为模块处理函数。Vp为请求的结构体指针,name为相应OID的指针,length为OID长度,var_len为参数长度,write_method为节点写函数指针。
该函数中switch(vp->magic)为查询需要操作的节点,对于PORTTRKENA这个读写节点来说,*write_method = write_portTrkEna为操作函数指针赋值,VAR = VALUE 中的VAR为接收返回值的变量,VALUE为返回值,这两个变量需要自己定义和处理。
Var_portTrkGroupTable 函数为表portTrkGroupTable的处理函数,这里直接删去。
Int write_portTrkEna(…)为节点portTrkEna 的写操作处理函数。其中RESERVE2 状态中,value接收到的值即为agent收到的write request的修改值。ACTION状态中需要填入对该节点修改的具体代码,UNDO状态中需要填入对该节点恢复的具体代码。在ACTION状态中进行操作的时候,需要注意保存该节点的当前值,便于UNDO进行恢复
Int write_trunkType(…)为节点trunkType节点的写处理函数。与portTrkEna节点类似。
2) 修改后的代码可参照broadcom/uClinuxv12/user/net-snmp/agent/mibgroup/switch/private下的portTrunk.c和portTrunk.h文件。其中使用的结构体和函数均可在broadcom/uClinuxv12/user/bcmcfg 下相应功能的源文件中找到。要使用user/bcmcfg下的函数和数据结构,需要将bcmcfg下的相应C文件生成的.o文件链接成.a库并在net-snmp编译参数中加入相应的头文件引用和库文件引用,目前这个步骤已经完成,具体可参照user/bcmcfg下的makefile文件。
3) 代码修改完成后,需要修改user/net-snmp/agent/mibgroup/下的default_modules.h文件,如要加入上面新修改的功能,则需要在default_modules.h文件中添加config_require(switch/private/portTrunk);
4) 以上步骤均完成后可重新编译源码树,编译完成后的snmpd即可实现对新节点操作功能。
2、 修改portTrkGroupTable.c和portTrkGroupTable.h文件以实现端口汇聚表的监控功能。
1) 数据结构和函数介绍:
Void init_portTrkGroupTable(void)为模块初始化函数,其中调用的initialize_table_portTrkGroupTable(void)为表初始化函数。
表的数据初始化工作应该在这里完成。
struct portTrkGroupTable_entry 为表的链表结构定义。其中包含了表索引定义和表内容及内容长度定义。相应的字符串数据的长度需要用户自己调整。
Struct portTrkGroupTable_entry * portTrkGroupTable_head;定义了该表的链表。整个表的操作实际上就是针对该链表的。
Struct portTrkGroupTable_entry * portTrkGroupTable_createEntry(…)为表的行创建函数。其中具体的传入参数和数据处理需要用户自己实现。
Void portTrkGroupTable_removeEntry(…)为行删除函数。在行数确定的情况下无需使用。
Int portTrkGroupTable_handler(…)函数未表的操作函数。表中数据的读取需要在MODE_GET下实现。数据的修改需要在MODE_SET_ACTION下实现。另外MODE_SET_UNDO的处理方式同非表节点。
修改后的代码可参照broadcom/uClinuxv12/user/net-snmp/agent/mibgroup/switch/private下的portTrkGroupTable.c和portTrkGroupTable.h文件。
2) 源文件修改完成后,其他的操作同portTrunk.c。
五、 已开发的相关私有MIB功能源文件位置均在开发源码树中user/net-snmp/agent/mibgroups/switch/private目录下
user/net-snmp/agent/mibgroups/switch/dealport/目录下为不同型号的交换机的OID定义。
六、 已开发的公有MIB功能源文件均在源码树user/net-snmp/agent/mibgroups/mibII目录下。具体可参考user/net-snmp/agent/mibgroups/default_modules.h中相应的内容。
七、 RMON对应的MIB源文件均在user/net-snmp/agent/mibgroups/RMON 目录下。