资源描述
用来编译和更新WindNet
(3)$(WIND_BASE)/target/src/snmpv1/下的程序描述
凡注明“WindNet”的文件均是WindNet软件包提供的,否则就是本人创建和编写的。在本小节内提到的“Agent”指狭义的SNMP Agent,除此之外,“Agent”均指广义的网管Agent,即本人所做的工作在整个系统中所扮演的角色。
一级子目录agent/:
Makefile
用来编译和更新WindNet。
snmpIoLib.c(WindNet)
SNMP Agent I/O, 包含了 snmpIoInit(),,snmpIoClose(),snmpIoMain(),snmpIoBody(),snmpIoCommunityValidate()等函数,可根据实际情况修改,特别是snmpIoWrite()和snmpIoCommunityValidate(),一定要做相应的配置。这些函数的具体描述请参阅WindNet SNMPv1/v2c,P47)。
snmpMib2.mib(WindNet)
MIB2的控制文件,决定MIB Method Routines的函数名等。控制MIB主要用到三个关键字:FORCE-INCLUDE,DEFAULT,EXCLUDE,具体用法请参阅WindNet SNMPv1/v2c,P80:mibcomp Extensions。
ilmiMib.mib
ILMI MIBs的控制文件。
anmPrivMib.mib
ATM网管自定义MIB的控制文件。
snmpMib2.c,mibhand.h,mibleaf.h
mibcomp的生成文件,snmpMib2.c定义了MIB的内部存储格式,mibhand.h是对Method Routines的声明,mibleaf.h是对MIB常量的定义。
二级子目录agent/anm_rtns:
二级子目录agent/ilmi_rtns:
二级子目录agent/snmp_rtns(WindNet):
各个MIB的Method Routines,每个文件对应于一个Group。在写这些函数时,可先用mibcomp –stub生成.c文件,再在此文件上做修改,这样可省却许多录入工作。
一级子目录rfc_mibs/(WindNet):
标准的RFC MIBs,如rfc1213.mib等。
一级子目录anm_mibs/:
ILMI MIBs,ATM Private MIB等与ATM相关的非RFC MIBs。
(4)在开发阶段编译Agent的一般步骤
环境: 主机为tmn2,WindNet源程序也在tmn2上;
当前用户为wrs,这是专为调试而建立的用户;
目标机为mv162,其CPU为MC68LC040。
(a) 设置环境变量:
% source ~wrs/.cshrcsnmp
.cshrcsnmp是本人建立的一个配置文件,定义了有关SNMP的环境变量和mibcomp、cc68k的一些常用选项。它不是系统的缺省文件,所以需要手动执行。.cshrc才是系统的缺省配置文件,在用户登录时自动执行。
(b) 编译WindNet:
% cd ~wrs/wind/target/src/snmpv1/agent
% make CPU=MC68LC040 TOOL=gnu
此举将编译本目录下Makefile中所列出的相关文件,make的结果是得到最新版本的~wrs/wind/target/lib/libMC68LC040gnuvx.a
(c) 配置和编译vxWorks:
% launch&
(如果是开机后第一次运行Tornado的调试工具,则执行 source ~wrs/startit&)
选择target server:mv162@tmn2;
(如果该target server不存在,请先创建它,target server的配置如下:
tgtsvr <target_IP> -A –V –n mv162 –B wdbrpc –f a.out
具体的用法请参阅Tornado User’s Guide:The Tornado Launcher,P105)
在launch面板上选择WindCFG,在随后打开的配置窗口依次选择mv162lc,windNet,注意必须有以下两项内容:
#INCLUDE_MIB2_ALL
#INCLUDE_SNMPD
在上面打开的配置窗口中依次点击Config按钮和Build按钮,开始编译vxWorks内核。
(d) 重新启动目标机。
(e) 编译其它Agent程序:
在$(ATMNET_BASE)/目录下运行make,将最终的目标文件下载到目标机调试。
(5)在开发阶段扩展MIB的一般步骤
(a) 用ASN.1编写MIB。如果要实现已有MIB中被控制MIB EXCLUDE掉的Group,则将相应的EXCLUDE语句注释掉。
(b) 写Method Routines。这可能会涉及到修改或创建以下三个文件:xxxMib.h,xxxInfoLib.h,xxxInfoLib.c,其中xxxMib.h是该MIB的类型和常量定义,xxxInfoLib.c为method routines提供支持,是后者的信息来源。
(c) 在~wrs/wind/target/src/snmpv1/agent/目录下的Makefile中OBJS一项增补相应的.o文件。
(d) make。见前述“在开发阶段编译Agent的一般步骤”(a)~(d)。
(四)讲讲开发过程中遇到的一些令人头疼的问题
在开发过程中经常遇到一些小问题,它们一开始总是以令人迷惘的面貌出现,本人不才,往往花了很长时间,才得以摆脱这种山穷水尽的境地。今天把这些问题抖出来,或简或易,也许对大家有所帮助,为维护本人声誉,望家丑不要外扬。问题排名不分先后,想到哪,写到哪。
(1) 问:我的Agent SNMP Daemon已经起来了。我在同一个目标机或者开发主机上运行Manager程序,能够Get/Set;但是有一台远端的计算机运行Manager程序,Agent的IP地址、UDP端口(161)、Community都没有给错,却总是超时。怎搞?
答:如果Manager和Agent不在一个网段上的话,就必须在Agent所在目标机上配置路由表,具体做法如下:
在WindSh中,键入:routeAdd <manager_IP> <gateway_IP>
当然罗,也可以在程序中以函数的形式配置,routeAdd()的调用格式请参阅VxWorks 5.3.1 Reference Manual。
(2) 问:我有两个程序,A.c和B.c,A.c引用了B.c中定义的变量或函数,B.c引用了A.c中定义的变量或函数。这样,无论我先下载哪个程序,都会出现这样的warning:xxx undefined,当程序执行到调用这个“undefined”的函数时,就会报:Illegal Instruction,如果是变量也会出错。如果我不想改程序,那该怎么办哪?
答:步骤如下:
(a)两个程序先分别编译(记住别链接喔,别忘了在ccxxx后面跟上-c);
(b)静态链接,ldxxx –r –o C.o A.o B.o,-r 表示在下载时允许在次链接(Relocateable!);
(c)下载C.o。
(3) 问:我看WindNet天价提供的MIB2 Method Routines中,Scalar Groups都没有_next() Routine,俺可不可以也不写呀?
答:可以啊,在控制MIB中用DEFAULT关键字声明,比如:
system OBJECT-TYPE
--DEFAULT next-function-async std-next-async
::= { mib-2 1 }
不过,std-next-async只适用于Scalar Objects,对于Tabular Objects,_next()是一定要人写的。有关控制MIB的关键字DEFAULT的用法,可参阅WindNet SNMPv1/v2c ,P82。
(4) 问:有些MIB有obsolete或者deprecated的对象,在响应Get/Get-next时,我懒得给它们赋值(说真的我也不知道该赋什么好),但是又不想返回错误,你说怎么办嘛!如果我什么都不做,即在xxx_get_value()中,如下写:
case LEAF_xxx: /* 假设该leaf是obsolete或deprecated */
break;
则会引起tSnmpd任务死掉的!
答:可用如下语句替代上述语句:
case LEAF_xxx: /* 假设该leaf是obsolete或deprecated */
getproc_got_empty (pktp, vbp);
break;
这就是给它赋了NULL了。
(5) 问:如何共享另一台工作站上的目录?
答:假设px是资源提供者,tmn2是要求共享者,可做如下操作:
px:
# /usr/lib/nfs/mountd
# /usr/lib/nfs/nfsd
# share –o ro <share_dir>
其中#表示超级用户,ro表示Read Only;若要可读可写,则选择rw。
tmn2:
# mount px:<share_dir> <mount_dir>
其中<mount_dir> 是tmn2上的一个目录,它原来的内容将被隐藏,当umount之后再还我庐山真面目。
这样,对tmn2的用户来说,<mount_dir>中的目录和文件虽然位于px上,但是其显示和操作就跟在本地机上的一样。
(一)
4
展开阅读全文