SNMP移植文档.doc_第1页
SNMP移植文档.doc_第2页
SNMP移植文档.doc_第3页
SNMP移植文档.doc_第4页
SNMP移植文档.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SNMP移植文档说明目录SNMP移植文档说明10.文档读者说明31netSnmp源代码说明31.1netSnmp 源代码的来源和版本号31.2netSnmp 在arm9上跑起来31.2.1配置netSnmp31.2.2编译netSnmp31.3MIB配置42.我们的应用42.1移植42.2相关文件42.2.1Makefile文件42.2.2其他文件修改记录52.3snmp的配置文件53.Makefile和工具链的使用63.1生成并修改完善一个我们需要Makefile63.1.1首先去xl2005/app/DoPatrol 下找到Makefile文件,了解系统api是如何编译出来一个DoPatrol的。63.1.2然后将xl2005/app/DoPatrol/Makefile 头部的索引代码copy到agent/Makefile63.1.3最后我们需要xl2005/inc 的头文件放到net-snmp-5.2.1/include下83.1编译我们的代码用到的工具链:83.2.1工具链下载地址83.2.2工具链信息83.2.3工具链部署83.3其他84.MIB 库文件到代码的实现84.1我们的功能在MIB库上的呈现84.2MIB库到标准版本的代码94.2.1用MIB2C的方式94.2.2自己编写的方式94.2.3注意104.3将我们的API 放入其中105.SNMP中的trap和自动发现115.1设备的自动发现115.1.1GT3000的自动发现的目的:115.1.2GT3000自动发现过程:115.1.3GT3000数据包定义115.1.4备注:115.2snmp中的trap实现126.附表136.1附表一136.2附表二156.2.1Trap 函数接口定义说明156.2.2Trap信息对应的办卡类型156.3附表三170. 文档读者说明此文档的读者必须对SNMP有所了解,知道snmp协议的通信机制,了解snmp协议框架的基本元素。另外一些网上可以轻易查到的SNMP调试文档我就不在这里引用了。1netSnmp源代码说明1.1netSnmp 源代码的来源和版本号netSnmp是开源的代码,我现在用的版本是5.2.1.可以在/download.html 下载到需要的版本。我们下载到的net-snmp-5.2.1.tar.gz,放到linux下用tar 指令解压缩,我们就可以看到一个展开的net-snmp-5.2.1的文件夹了。1.2netSnmp 在arm9上跑起来1.2.1配置netSnmp使用configure文件配置netSnmp之后,Makefile才能正常的编译netSnmp。进入linux的终端,进入到net-snmp-5.2.1目录下,输入下面信息:CC=arm-linux-gcc ./configure -build=i386-linux -host=arm-linux -enable-mini-agent -disable-ipv6 -with-endianness=little -disable-manuals -disable-ucd-snmp-compatibility -enable-as-needed -disable-embedded-perl -without-perl-modules -disable-snmptrapd-subagent -disable-applications -disable-scripts后按Enter。(-without-perl-modules 在5.2.1中没有 disable 只要设置了就会添加perl脚本,所以如果没有安装perl脚本识别环境的都会开启perl模式。可以去掉)在配置的的过程中,需要填写几个值:snmp的版本信息:选择2,管理员个人信息:waye 12345678,公司MIB位置信息: Gtel ,以及log位置(这个可以缺省,我们可以不关注)。最后结束了,配置完成,如果中间出现错误,就需要看看那个配置出问题了。1.2.2编译netSnmp直接make 会调用arm-linux-gcc(工具链的安装和使用在3.2中详细描述)编译之后,可以在net-snmp-5.2.1/agent/下找到snmpd程序,就可以直接放到设备上运行了。还有一个snmp.conf的配置文件需要添加,在2.3中详细说明1.3MIB配置MIB库在snmp中的应用也是通过configure来完成的。在1.2.1中的黑体的配置信息最后可以添加 -with-mib-modules=路径/MIB模块名字,就可以将需要添加到netSnmp中自己定义的MIB 库添加完毕了。(路径是指在net-snmp-5.2.1/agent/mibgroup/路径,MIB模块名字是指路径下MIB模块名字.c 文件的文件名字,不包含.c部分。)举一个例子:Gtel是路径,atm4Table就是MIB模块的名字,可以直接用MIB2C生成。在提交的代码中,net-snmp-5.2.1/agent/mibgroup/Gtel/atm4Table.cpp,生成的代码是.c结尾的,为了添加支持cpp的api,改成cpp编译。注意:在运行1.2.1中黑体配置信息的时候一定要保证路径下的文件名是*.c的后缀,否则配置会无效的。如何将MIB 库导入makefile,在4.2中会有详细描述2. 我们的应用2.1移植我们的api是用C+写的,所以需要将arm-linux-gcc变成arm-linux-g+,这样就会出现很多新的问题,需要我们修改makefile,以及编译的时候会出现很多错误。2.2相关文件2.2.1Makefile文件我们主要需要修改2处的Makefile文件:文件位置修改原应源代码修改后代码备注net-snmp-5.2.1/agent/Makefile不能识别.cpp无.cpp.lo:$(LIBTOOL) -mode=compile $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $ $在#libtool definitions 位置net-snmp-5.2.1/agent/mibgroup/Makefile不能识别.cpp无.cpp.lo:$(LIBTOOL) -mode=compile $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $ $在#libtool definitions 位置net-snmp-5.2.1/agent /Makefile不支持线程CFLAGS = -g -O2 -Dlinux CFLAGS= -g -O2 -Dlinux -lpthread*Makefile中的库文件链接会在3.1中详细描述*C文件不需要修改成CPP文件了。2.2.2其他文件修改记录需要修改的文件查阅,见附表一(6.1)2.3snmp的配置文件Snmp有一个启动引导的配置文件:snmp.conf。这个配置文件,需要放到设备上的路径为:/usr/local/share/snmp/ 下。snmp.conf 配置文件的来源是,安装在x86 环境linux下的snmp.conf copy过来的。(x86下snmpd的安装:只要三个步骤就可以了,打开console在net-snmp-5.2.1 文件路径下运行:1. ./configure 2. Make 3. Make install )在这段配置代码中,我们关注的,或者说启用的,只有几行:# First, map the community name (COMMUNITY) into a security name# (local and mynetwork, depending on where the request is coming# from):子网、掩码和权限的配置(这些配置是预先配置好的,如果修改了需要重新启动服务)# source communitycom2sec local localhost publiccom2sec mynetwork /24 public# Second, map the security names into group names:# sec.model group MyRWGroup v1 local添加用户对组的读写权限,我们一般不用关注,都给读写就可以了。group MyRWGroup v2c localgroup MyRWGroup usm localgroup MyRWGroup v1 mynetworkgroup MyRWGroup v2c mynetworkgroup MyRWGroup usm mynetwork# Third, create a view for us to let the groups have rights to:# incl/excl subtree maskview all included .1 80# Finally, grant the 2 groups access to the 1 view with different# write permissions:# context sec.model sec.level match read write notifaccess MyROGroup any noauth exact all none noneaccess MyRWGroup any noauth exact all all none这个配置文件里面还有很多信息,都是没有启用的,我们也用不关心。将snmpd文件放到目标板/usr/sbin目录下(需要更改访问权限,否则过会不能启动),将snmpd.conf文件放在/usr/local/share/snmp/下(不存在的目录自己创建)。现在可以启动snmpd了:snmpd f Le d.3. Makefile和工具链的使用3.1生成并修改完善一个我们需要Makefile上面修改仅能保证netSnmp源代码的编译通过并在arm9 上面运行起来,如何像我们自己的库文件添加到make中呢。需要修改agent/Makefile 这个文件。3.1.1首先去xl2005/app/DoPatrol 下找到Makefile文件,了解系统api是如何编译出来一个DoPatrol的。阅读xl2005/app/DoPatrol/Makefile 就能了解到了。3.1.2然后将xl2005/app/DoPatrol/Makefile 头部的索引代码copy到agent/Makefile代码如下:(从第10行开始添加)#add for XL2005PRJROOT =$(HOME)/xl2005swINCDIR= -I./ -I$(PRJROOT)/inc# Build settingsOLIBS= -lpthread -lchipsdrv -ldevdrv -lxlapiLIBDIR = -L$(PRJROOT)/libCFLAGS= -Wall -WerrorLDFLAGS= #-staticINCDIR= -I./ -I$(PRJROOT)/incDOBJ_DIR = $(PRJROOT)/devdrv# device driversCOBJ_DIR = $(PRJROOT)/chipsdrv# chips driversAOBJ_DIR = $(PRJROOT)/api# apis.OOBJ_DIR = $(PRJROOT)/api/class# class#class drivers maintenance by HOOBJS = $(OOBJ_DIR)/clXL3000App.o $(AOBJ_DIR)/system/xl3000System.o $(OOBJ_DIR)/clXL3000Brdv2.o $(OOBJ_DIR)/clChip.o OOBJS+= $(OOBJ_DIR)/clMDBus.o $(OOBJ_DIR)/clETHPHYChip.o $(OOBJ_DIR)/clME1111.o#base classOOBJS+= $(OOBJ_DIR)/clPHYChip.o $(OOBJ_DIR)/clSARChip.o #system board.OOBJS += $(OOBJ_DIR)/clSysBrd.o $(OOBJ_DIR)/clG301_SYS.o #TAP boardOOBJS += $(OOBJ_DIR)/clME1145.o $(OOBJ_DIR)/clSAR_TAP.oOOBJS+= $(OOBJ_DIR)/clTAPBrd.o $(OOBJ_DIR)/clG301_4TAP.o#ATM boardOOBJS += $(OOBJ_DIR)/clPM5379.o $(OOBJ_DIR)/clSAR_ATM.oOOBJS+= $(OOBJ_DIR)/clATMBrd.o $(OOBJ_DIR)/clG301_4ATM.o $(OOBJ_DIR)/clG301V_4ATM.o#IMA boardOOBJS += $(OOBJ_DIR)/clPM8310.o OOBJS += $(OOBJ_DIR)/clXLIMAChip.o $(OOBJ_DIR)/clXL128IMAChipv2.o OOBJS+= $(OOBJ_DIR)/clXLIMABrdv2.o $(OOBJ_DIR)/clG301_4IMAv2.o OOBJS += $(OOBJ_DIR)/clRule.o $(OOBJ_DIR)/clMCRule.o $(OOBJ_DIR)/clLBRule.o $(OOBJ_DIR)/clATMRule.o $(OOBJ_DIR)/clTAPRule.o然后将:snmpd$(EXEEXT):$LAGENTOBJS $(USELIBS) $(HELPERLIB) $(LIBTARG) $INSTALLLIBS $(LINK) $(CFLAGS) -o $ $LAGENTOBJS $(LOCAL_LIBS) $LDFLAGS $OUR_AGENT_LIBS $(OOBJS) $(LIBDIR) $(OLIBS)红色为添加的编译时需要用的库部分。这部分的代码内容,会根据api的makefile而改变的,需要注意更新。3.1.3最后我们需要xl2005/inc 的头文件放到net-snmp-5.2.1/include下3.1 编译我们的代码用到的工具链:3.2.1工具链下载地址下载官方地址:/ 3.2.2工具链信息gcc的版本是4.2.2,其实版本并不是越高越好,而是合适就好的。arm-linux-gcc v之后获得的信息。3.2.3工具链部署部署工具链就很简单,简单说下步骤,首先将下载的corss.tar.gz 放到linux下面用tar解压缩,然后:1 将解压缩的文件通过export临时添加,直接在当前console下输入:export PATH=/路径/bin:$PATN2.修改linux etc/profile 下加入export PATH=/路径/bin:$PATN,这样就永久添加了。3.3其他4. MIB 库文件到代码的实现4.1 我们的功能在MIB库上的呈现MIB 库可以参考,snmp源代码中的来编辑,然后用MIB Browser来查看。版本服务器上有我提交的MIB 库文件的备份。MIB Browser的安装程序在:每周提交徐威AdventNet MibBrowser 下可以下载安装。4.2 MIB库到标准版本的代码4.2.1用MIB2C的方式查看linux下是否已经安装了mib2c,如果没有安装可以用apt-get install libsnmp9-dev等指令来协助安装(在Ubuntu 环境下)。将自己编写的MIB文件放到/usr/local/share/snmp/mibs/ 下,查看当前目录是否含有MIB中包含的RFC文件,如果缺少相对应的RFC文件,将导致mib2c无法完成。例如RFC1213-MIB。配置需要mib2c的mib库。配置信息如下:export MIBDIRS=/usr/local/share/snmp/mibs/export MIBS=+GTEL-GT3000-MIB 添加对MIB文件的解释说明:MIB 树结构说明。然后使用mib2c xxxx(xxxx为MIB库中的一个节点或者一个汇聚点,或者一个table),就可以在当前目录下找到生成的.c代码了。例如:MIB2c的例子,完整版。4.2.2自己编写的方式索引实际上面是对OID的匹配。单索引的方式可以直接用mib2c的方式去生成代码,但是索引或者多索引的时候就需要自己编写代码去实现索引了。下面是我平时的笔记:先把原来的实现方案写一些 流程图,然后再看下一步的优化了!简单的描述一下原理就是:我采用了header_genernic的原型,这个原型只能对原始的OID进行匹配而不能对索引匹配完成了基本的匹配之后,自己写下面的这个程序框架完成了双索引的匹配主要是正对getnext的设计说到这里需要对,snmp中的get和getnext有一定了解,如果还不是很清楚,可以随便找本书看看,或者在上网随便google一下就可以了。根据这样的模式,我原来完成代码当中已经有可以看到可以参考的实现了。4.2.3注意Configure 只能识别.c的代码,而我们添加的api是.cpp的,所以我们需要将代码在.c的时候configure,然后修改.c为.cpp 之后编译。4.3 将我们的API 放入其中不论使用mib2c还是手动编写MIB 库文件的实现,我们最后都需要将api的接口放到MIB库文件中。在每一个case中添加对应的api,并按照MIB库定义的数据类型返回值,就可以或者我们需要的接口信息了,其实这个就是snmp中的get(或者是getnext)。如果这个case(也就是叶子节点时可以设置的),我们还需要去为它添加一个写入的函数。函数的申明可以在头文件中找到,详细的信息,我提交的代码参看net-snmp-5.2.1/agent/mibgroup/Gtel/gt3000sys.cpp 可以看到一些参考。5. SNMP中的trap和自动发现5.1设备的自动发现5.1.1GT3000的自动发现的目的:a) GT3000启动时,CMS 可能不知道当前是否在GT3000在运行,b) GT3000异常断线,CMS 可以根据当前GT3000 是否超时连接,5.1.2GT3000自动发现过程:c) 当GT3000设备启动的时候,通过UDP广播发送一个我们已经约定好的数据包,d) GT3000 每60 S发出一个数据包,5.1.3GT3000数据包定义格式:09 04 30 00 AA BB CC DD EE XX YY ZZ数据格式说明: 09 04 报文标志头,2字节 30 00 设备名称,2字节 AA 设备子型号(GT3000E为 01或者GT3000P 为 02)1字节 BB CC DD EE 设备IP地址4字节XX YY ZZ 预留字节3字节 合计:12字节5.1.4备注:修改:1.添加IP地址2.去掉设备Id3.补足预留字节4.定义端口号:50019 5.2snmp中的trap实现Trap做为snmp的报警上报信息非常重要。由于我们需要后台运行一个监控进程,这就决定了我们必须把trap写一个api提出来给后台的程序去运行。Trap的源代码在net-snmp-5.2.1/apps/snmptrap.c 中实现,编译之后生成了snmptrap的命令行。将我们自己的OID的节点添加到源代码中,源代码中如果由我修改的地方都添加了标注,可以搜索关键字waye找到。直接make之后就可以在这个目录下面找到snmptrap。这个就是我们需要的命令了。我将snmptrap封装成了一个sendtrap的接口,然后定义了sendtrap的接口使用说明,可以参看附表二。Sendtrap的源代码已经提交了,可以在版本服务器上拿到。6. 附表 6.1附表一snmp g+环境下编译修改的文件有:文件位置修改方案备注snmplib/mib.c主要是 snmp_strcat 第五个参数的强制转换问题,malloc 的指针强制转换的问题snmplib/snmp_api.c修改malloc 的指针强制转换的问题,以及部分参数类型不匹配的问题snmplib/snmp_parse_args.c修改malloc 的指针强制转换的问题,修改了strings.h 为 string.hsnmplib/system.c将if have utsname 放到函数外面snmplib/read_config.c1625 行参数类型转换snmplib/snmp_debug.c364 行snmplib/tools.c257 行snmplib/snmp_logging.c621 行snmplib/snmpv3.c665 行snmplib/keytools.c107: error: invalid conversion from void* to EVP_MD_CTX*snmplib/scapi.c447: error: invalid conversion from void* to EVP_MD_CTX*snmplib/data_list.c271: error: invalid conversion from void* to netsnmp_data_list_saveinfo*snmplib/oid_stash.c56: error: invalid conversion from void* to netsnmp_oid_stash_node_s*snmplib/snmpUDPDomain.c213: error: invalid conversion from int* to socklen_t*snmplib/snmpTCPDomain.c219: error: netsnmp_sock_buffer_set was not declared in this scopesnmplib/snmpTCPDomain.c49: error: TRANSPORT_DOMAIN_TCP_IP was not declared in this scope /在TCP 中添加UDP代码去掉了netsnmp_sock_buffer_set 编译通过snmplib/snmpUnixDomain.cIn function netsnmp_transport* netsnmp_unix_transport(sockaddr_un*, int):snmplib/container.c79: error: invalid conversion from void (*)(container_type*, void*) to void (*)(void*, void*)去掉79行 编译 通过修改26行,_factory_free()的第一个参数为void*型,然后在内部转换为container_type* 就OK了snmplib/container_binary_array.cIn function int netsnmp_binary_array_insert(netsnmp_container*, const void*):agent/helpers/baby_steps.c105: error: invalid conversion from void* to netsnmp_baby_steps_modes*agent/helpers/cache_handler.c321: error: invalid conversion from void* to char*agent/helpers/instance.c520: error: invalid conversion from u_long* to long int*agent/helpers/scalar.c86: error: invalid conversion from void* to oid*agent/helpers/watcher.c115: error: invalid conversion from void* to const u_char*agent/helpers/old_api.c76: error: invalid conversion from void* to u_char*agent/helpers/stash_cache.c66: error: invalid conversion from void* to netsnmp_oid_stash_node*agent/helpers/table_array.c215: error: invalid conversion from void* to netsnmp_container*agent/helpers/table_container.c320: error: invalid conversion from void* to netsnmp_index*agent/helpers/table_iterator.c246: error: invalid conversion from void* to ti_cache_info*agent/helpers/table_dataset.c177: error: invalid conversion from void* to netsnmp_table_data_set_storage*agent/helpers/table.c1080: error: invalid conversion from const u_char* to const char*agent/helpers/mode_end_call.c107: error: invalid conversion from void* to netsnmp_mode_handler_list*agent/mibgroup/mibII/mibII/vacm_context.c39: error: invalid conversion from char* to const u_char*agent/snmp_agent.c1951: error: invalid conversion from void* to netsnmp_tree_cache*agent/agent_registry.c1678: error: invalid conversion from void* to variable*agent/agent_index.c100: error: invalid conversion from u_char* to const char*agent/agent_trap.c239: error: invalid conversion from void* to char*agent/agent_handler.c964: error: invalid conversion from void* to netsnmp_mib_handler*agent/snmpd.c194: warning: deprecated conversion from string c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论