基于NET-SNMP和uclinux的SNMP代理服务开发

自作多情 提交于 2021-02-07 02:46:05

SNMP MIB 功能开发详细步骤

一、      定义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库文件拷贝到linuxnet-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.cportTrunk.h源文件以实现portTrkEnatrunkType两个读写节点的功能:

1)   首先介绍一下非表节点C源码中的数据定义和函数功能:oid portTrunk_variables_oidportTrunk子树根节点的OID值。Struct variable4 portTrunk_variables[]结构体数组为 portTrunk下的节点定义(包括非表节点和表节点的定义)。因为表节点我们稍后将会采用另外一种方式来处理,所以在此处我们将表节点相应的几个定义删去。其中包括TRKGRPINDEXPORTTRUNKGROUPNUMBERPORTTRUNKGROUPENABLEPORTTRUNKGROUPMEMBER

Void init_portTrunk(void)函数为初始化函数,会将相应节点的定义信息注册到agentOID信息树里。

Unsigned char * var_portTrunk(struct variable *vp,oid *name,size_t *length, int exact, size_t *var_len, WriteMethod ** write_method); 函数为模块处理函数。Vp为请求的结构体指针,name为相应OID的指针,lengthOID长度,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.cportTrunk.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.cportTrkGroupTable.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.cportTrkGroupTable.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 目录下。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!