【转】与大家分享uclinux上的ucd-snmp开发过程
http://linux.chinaunix.net/bbs/viewthread.php?tid=903536
最近在做arm上的网关系统,现将uclinux上的ucd-snmp开发过程与大家分享,希望大侠们多多指教!
由于上传文件大小限制,不能上传完整的doc文件,需要的可以和我联系。
_________________________________________________________________
一、开发环境:
1. 操作系统:uClinux-ifax-2007-03-16.tar.gz
2. 交叉编译工具:arm-elf-tools-20030314.sh
3. 硬件平台:Samsung 4510B (snds-100)
二、编译ucdsnmp主要步骤
1.配置uClinux
修改config/config.in文件,确保改文件中有如下内容:
配置用户程序,选中ucd-snmp
2.使用snmpconf工具生成配置文件,内容如下:
- ###########################################################################
- #
- # snmpd.conf
- #
- # - created by the snmpconf configuration program
- #
- ###########################################################################
- # SECTION: System Information Setup
- #
- # This section defines some of the information reported in
- # the "system" mib group in the mibII tree.
- # syslocation: The [typically physical] location of the system.
- # Note that setting this value here means that when trying to
- # perform an snmp SET operation to the sysLocation.0 variable will make
- # the agent return the "notWritable" error code. IE, including
- # this token in the snmpd.conf file will disable write access to
- # the variable.
- # arguments: location_string
- syslocation xi'an
- # syscontact: The contact information for the administrator
- # Note that setting this value here means that when trying to
- # perform an snmp SET operation to the sysContact.0 variable will make
- # the agent return the "notWritable" error code. IE, including
- # this token in the snmpd.conf file will disable write access to
- # the variable.
- # arguments: contact_string
- syscontact [email]lazy_linux@126.com[/email]
- # sysservices: The proper value for the sysServices object.
- # arguments: sysservices_number
- sysservices 77
- sysservices 0*1 + 0*2 + 0*4 + 0*8 + 0*64
- sysservices 0*1 + 0*2 + 1*4 + 1*8 + 0*64
- ###########################################################################
- # SECTION: Access Control Setup
- #
- # This section defines who is allowed to talk to your running
- # snmp agent.
- # rwuser: a SNMPv3 read-write user
- # arguments: user [noauth|auth|priv] [restriction_oid]
- rwuser rw3 noauth
- # rwcommunity: a SNMPv1/SNMPv2c read-write access community name
- # arguments: community [default|hostname|network/bits] [oid]
- rwcommunity rw12
- ###########################################################################
- # SECTION: Trap Destinations
- #
- # Here we define who the agent will send traps to.
- # trap2sink: A SNMPv2c trap receiver
- # arguments: host [community] [portnum]
- trap2sink 202.117.129.75
3.编译生成image.rom并下载到目标板上,运行如下:
4.在开发主机上进行验证
三、扩展ucdsnmp主要步骤
1.主要修改的文件
MIB文件:定义扩展的MIB库
编译的头文件:需要修改头文件,使得编译时包括用户扩展的功能
.c文件:实现SNMP get,set,trap等功能
.h文件:头文件
2.MIB文件
/uClinux-dist/user/ucdsnmp/mibs/UCD-DEMO-MIB.txt
其中定义了用户扩展的agent管理节点
- UCD-DEMO-MIB DEFINITIONS ::= BEGIN
- IMPORTS
- MODULE-IDENTITY, OBJECT-TYPE, Integer32 FROM SNMPv2-SMI
- ucdavis FROM UCD-SNMP-MIB;
- ucdDemoMIB MODULE-IDENTITY
- LAST-UPDATED "9912090000Z"
- ORGANIZATION "University of California, Davis"
- CONTACT-INFO
- "The ucd-snmp-coders mailing list is the best place to
- write for public questions about the ucd-snmp
- project: [email]ucd-snmp-coders@ucd-snmp.ucdavis.edu[/email]
- Primary Author: Wes Hardaker
- postal: IT-DCAS
- UCDavis
- Davis CA 95616
- phone: +1 530 754-7571
- email: [email]wjhardaker@ucdavis.edu[/email]"
- DESCRIPTION
- "The UCD-SNMP Demonstration MIB."
- REVISION "9912090000Z"
- DESCRIPTION
- "SMIv2 version converted from older MIB definitions."
- ::= { ucdavis 14 }
- //该节点位于ucdavis下的第14个节点
- ucdDemoMIBObjects OBJECT IDENTIFIER ::= { ucdDemoMIB 1 }
- //在UCD-SNMP-MIB中定义,
- // -- ucdDemoMIB OBJECT IDENTIFIER ::= { ucdavis 14 } - UCD-DEMO-MIB
- //OID: ucdavis.14.1
- ucdDemoPublic OBJECT IDENTIFIER ::= { ucdDemoMIBObjects 1 }
- //OID: ucdavis.14.1.1
- ucdDemoResetKeys OBJECT-TYPE
- SYNTAX Integer32 (0..2147483647)
- MAX-ACCESS read-write
- STATUS current
- DESCRIPTION
- "A set of value 1 to this object resets the
- demonstration user's auth and priv keys to the
- keys based on the P->Ku->Kul transformation of the
- value of the ucdDemoPasspharse object.
- Values other than 1 are ignored."
- ::= { ucdDemoPublic 1 }
- //OID: ucdavis.14.1.1
- ucdDemoPublicString OBJECT-TYPE
- SYNTAX OCTET STRING (SIZE(0..1024))
- MAX-ACCESS read-write
- STATUS current
- DESCRIPTION
- "A publicly settable string that can be set for testing
- snmpsets. This value has no real usage other than
- testing purposes."
- ::= { ucdDemoPublic 2 }
- ucdDemoUserList OBJECT-TYPE
- SYNTAX OCTET STRING
- MAX-ACCESS read-only
- STATUS current
- DESCRIPTION
- "The list of users affected by the ucdDemoResetKeys object."
- ::= { ucdDemoPublic 3 }
- ucdDemoPassphrase OBJECT-TYPE
- SYNTAX OCTET STRING
- MAX-ACCESS read-only
- STATUS current
- DESCRIPTION
- "The demo passphrase that ucdDemoResetKeys changes each
- users localized key to based on the P->Ku->Kul transformation."
- ::= { ucdDemoPublic 4 }
- //定义了2个trap类型的节点
- TheTrap1 NOTIFICATION-TYPE
- STATUS current
- DESCRIPTION
- "This is 1st trap."
- ::= { ucdDemoPublic 5 }
- //OID: ucdavis.14.1.5
- TheTrap2 NOTIFICATION-TYPE
- SYNTAX Integer32
- MAX-ACCESS read-write
- STATUS mandatory
- DESCRIPTION
- "This is 2nd trap."
- ::= { ucdDemoPublic 6 }
- //OID: ucdavis.14.1.6
- END
2.编译的头文件
/uClinux-dist/user/ucdsnmp/agent/Makefile
在MIBOBJS中增加需要编译的c文件的目标文件名称:
- MIBOBJS = mibgroup/mibII/system_mib.o mibgroup/misc/ipfwacc.o mibgroup/mibII/sysORTable.o mibgroup/mibII/at.o mibgroup/mibII/interfaces.o mibgroup/mibII/snmp_mib.o mibgroup/mibII/tcp.o mibgroup/mibII/icmp.o mibgroup/mibII/ip.o mibgroup/mibII/udp.o mibgroup/mibII/vacm_vars.o mibgroup/ucd-snmp/memory.o mibgroup/ucd-snmp/proc.o mibgroup/ucd-snmp/versioninfo.o mibgroup/ucd-snmp/pass.o mibgroup/ucd-snmp/pass_persist.o mibgroup/ucd-snmp/disk.o mibgroup/ucd-snmp/loadave.o mibgroup/ucd-snmp/extensible.o mibgroup/ucd-snmp/errormib.o mibgroup/ucd-snmp/registry.o mibgroup/ucd-snmp/file.o mibgroup/snmpv3/snmpEngine.o mibgroup/snmpv3/snmpMPDStats.o mibgroup/snmpv3/usmStats.o mibgroup/snmpv3/usmUser.o mibgroup/util_funcs.o mibgroup/mibII/var_route.o mibgroup/mibII/route_write.o mib_modules.o mibgroup/examples/ucdDemoPublic.o
- /uClinux-dist/user/ucdsnmp/agent/mibgroup/Makefile
OBJS和SRCS中增加目标文件名称和c文件名称
- OBJS = misc/ipfwacc.o mibII/system_mib.o mibII/sysORTable.o mibII/at.o mibII/interfaces.o mibII/snmp_mib.o mibII/tcp.o mibII/icmp.o mibII/ip.o mibII/udp.o mibII/vacm_vars.o ucd-snmp/memory.o ucd-snmp/proc.o ucd-snmp/versioninfo.o ucd-snmp/pass.o ucd-snmp/pass_persist.o ucd-snmp/disk.o ucd-snmp/loadave.o ucd-snmp/extensible.o ucd-snmp/errormib.o ucd-snmp/registry.o ucd-snmp/file.o snmpv3/snmpEngine.o snmpv3/snmpMPDStats.o snmpv3/usmStats.o snmpv3/usmUser.o util_funcs.o mibII/var_route.o mibII/route_write.o examples/ucdDemoPublic.o
- SRCS = misc/ipfwacc.c mibII/system_mib.c mibII/sysORTable.c mibII/at.c mibII/interfaces.c mibII/snmp_mib.c mibII/tcp.c mibII/icmp.c mibII/ip.c mibII/udp.c mibII/vacm_vars.c ucd-snmp/memory.c ucd-snmp/proc.c ucd-snmp/versioninfo.c ucd-snmp/pass.c ucd-snmp/pass_persist.c ucd-snmp/disk.c ucd-snmp/loadave.c ucd-snmp/extensible.c ucd-snmp/errormib.c ucd-snmp/registry.c ucd-snmp/file.c snmpv3/snmpEngine.c snmpv3/snmpMPDStats.c snmpv3/usmStats.c snmpv3/usmUser.c util_funcs.c mibII/var_route.c mibII/route_write.c examples/ucdDemoPublic.c
/uClinux-dist/user/ucdsnmp/agent/mibgroup/mib_module_inits.h
中增加自定义的初始化函数名称
- /* This file is automatically generated by configure. Do not modify by hand. */
- init_system_mib();
- init_sysORTable();
- init_at();
- init_interfaces();
- init_snmp_mib();
- init_tcp();
- init_icmp();
- init_ip();
- init_udp();
- init_vacm_vars();
- init_memory();
- init_proc();
- init_versioninfo();
- init_pass();
- init_pass_persist();
- init_disk();
- init_loadave();
- init_extensible();
- init_errormib();
- init_registry();
- init_file();
- init_snmpEngine();
- init_snmpMPDStats();
- init_usmStats();
- init_usmUser();
- init_var_route();
- init_ipfwacc();
- init_ucdDemoPublic();
/uClinux-dist/user/ucdsnmp/agent/mibgroup/mib_module_includes.h
中增加自定义的头文件名称
- /* This file is automatically generated by configure. Do not modify by hand. */
- #include "mibgroup/mibII.h"
- #include "mibgroup/ucd_snmp.h"
- #include "mibgroup/snmpv3mibs.h"
- #include "mibgroup/mibII/system_mib.h"
- #include "mibgroup/mibII/sysORTable.h"
- #include "mibgroup/mibII/at.h"
- #include "mibgroup/mibII/interfaces.h"
- #include "mibgroup/mibII/snmp_mib.h"
- #include "mibgroup/mibII/tcp.h"
- #include "mibgroup/mibII/icmp.h"
- #include "mibgroup/mibII/ip.h"
- #include "mibgroup/mibII/udp.h"
- #include "mibgroup/mibII/vacm_vars.h"
- #include "mibgroup/ucd-snmp/memory.h"
- #include "mibgroup/ucd-snmp/proc.h"
- #include "mibgroup/ucd-snmp/versioninfo.h"
- #include "mibgroup/ucd-snmp/pass.h"
- #include "mibgroup/ucd-snmp/pass_persist.h"
- #include "mibgroup/ucd-snmp/disk.h"
- #include "mibgroup/ucd-snmp/loadave.h"
- #include "mibgroup/ucd-snmp/extensible.h"
- #include "mibgroup/ucd-snmp/errormib.h"
- #include "mibgroup/ucd-snmp/registry.h"
- #include "mibgroup/ucd-snmp/file.h"
- #include "mibgroup/snmpv3/snmpEngine.h"
- #include "mibgroup/snmpv3/snmpMPDStats.h"
- #include "mibgroup/snmpv3/usmStats.h"
- #include "mibgroup/snmpv3/usmUser.h"
- #include "mibgroup/util_funcs.h"
- #include "mibgroup/mibII/var_route.h"
- #include "mibgroup/mibII/route_write.h"
- #include "mibgroup/misc/ipfwacc.h"
- #include "mibgroup/examples/ucdDemoPublic.h"
3..c文件:实现SNMP get,set,trap等功能
/uClinux-dist/user/ucdsnmp/agent/mibgroup/examples/ucdDemoPublic.c
- /* ucdDemoPublic.c */
- #include <stdio.h>
- #include <errno.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <config.h>
- #include "mibincl.h"
- #include "snmpv3.h"
- #include "snmpusm.h"
- #include "agent_read_config.h"
- #include "ucdDemoPublic.h"
- #include "util_funcs.h"
- #define MYMAX 1024
- #define MAXUSERS 10
- int num=0;
- static char demoUsers[MAXUSERS][MYMAX+1];
- static char demopass[MYMAX+1];
- char mynode_str[300];
- void ucdDemo_parse_user(const char *word, char *line) {
- if (num == MAXUSERS)
- return;
- if (strlen(line) > MYMAX)
- return;
-
- strcpy(demoUsers[num++], line);
- }
- void ucdDemo_parse_userpass(const char *word, char *line) {
- if (strlen(line) > MYMAX)
- return;
-
- strcpy(demopass, line);
- }
- /* this variable defines function callbacks and type return information
- for the ucdDemoPublic mib */
- //与MIB中的定义相对应
- struct variable2 ucdDemoPublic_variables[] = {
- { UCDDEMORESETKEYS , ASN_INTEGER , RWRITE, var_ucdDemoPublic, 1, { 1 } },
- { UCDDEMOPUBLICSTRING , ASN_OCTET_STR , RWRITE, var_ucdDemoPublic, 1, { 2 } },
- { UCDDEMOUSERLIST , ASN_OCTET_STR , RWRITE, var_ucdDemoPublic, 1, { 3 } },
- { UCDDEMOPASSPHRASE , ASN_OCTET_STR , RWRITE, var_ucdDemoPublic, 1, { 4 } },
- { 5, ASN_INTEGER, RWRITE, var_ucdDemoPublic, 1, {5}},
- { 6, ASN_INTEGER, RWRITE, var_ucdDemoPublic, 1, {6}}
- };
- /* Define the OID pointer to the top of the mib tree that we're
- registering underneath */
- oid ucdDemoPublic_variables_oid[] = { 1,3,6,1,4,1,2021,14,1,1 };
- void init_ucdDemoPublic(void) {
- REGISTER_MIB( "examples/ucdDemoPublic", ucdDemoPublic_variables,
- variable2, ucdDemoPublic_variables_oid);
- snmpd_register_config_handler("demoUser", ucdDemo_parse_user, NULL, "USER");
- snmpd_register_config_handler("demoPass", ucdDemo_parse_userpass, NULL, "PASSPHASE");
- //定义定时的trap发送
- snmp_alarm_register(10, SA_REPEAT, snmploop_callback, NULL);
- }
- //定义自定义的定时trap动作
- void snmploop_callback(unsigned int reg, void *clientarg){
- send_easy_trap(SNMP_TRAP_ENTERPRISESPECIFIC, 1);
- }
- unsigned char publicString[MYMAX+1];
- long long_ret;
- unsigned char *
- var_ucdDemoPublic(
- struct variable *vp,
- oid *name,
- size_t *length,
- int exact,
- size_t *var_len,
- WriteMethod **write_method)
- {
- // static long long_ret;
- static char string[MYMAX+1], *cp;
- int i;
-
- *write_method = 0; /* assume it isnt writable for the time being */
- *var_len = sizeof(long_ret); /* assume an integer and change later if not */
- if (header_generic(vp,name,length,exact,var_len,write_method))
- return 0;
- /* this is where we do the value assignments for the mib results. */
- switch(vp->magic) {
- case UCDDEMORESETKEYS:
- *write_method = write_ucdDemoResetKeys;
- //long_ret = 0;
- return (unsigned char *) &long_ret;
- case UCDDEMOPUBLICSTRING:
- *write_method = write_ucdDemoPublicString;
- *var_len = strlen(publicString);
- return (unsigned char *) publicString;
- case UCDDEMOUSERLIST:
- cp = string;
- for(i=0; i < num; i++) {
- sprintf(cp, " %s", demoUsers[i]);
- cp = cp + strlen(cp);
- }
- *var_len = strlen(string);
- return (unsigned char *) string;
-
- case UCDDEMOPASSPHRASE:
- *var_len = strlen(demopass);
- return (unsigned char *) demopass;
- case 5:
- long_ret=0;
- *write_method = write_mynodetrap;
- return (u_char *)&long_ret;
- case 6:
- /*
- * This object is essentially "write-only".
- * It only exists to trigger the sending of a v2 trap.
- * Reading it will always return 0.
- */
- long_ret = 0; /*FIX*/
- *write_method = write_mynodetrap2;
- return (u_char *)&long_ret;
-
- default:
- DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ucdDemoPublic\n", vp->magic));
- }
- return 0;
- }
- int
- write_ucdDemoResetKeys(
- int action,
- u_char *var_val,
- u_char var_val_type,
- size_t var_val_len,
- u_char *statP,
- oid *name,
- size_t name_len)
- {
- /* variables we may use later */
- //static long long_ret;
- static unsigned char string[1500];
- static oid objid[MAX_OID_LEN];
- static struct counter64 c64;
- int bigsize=1000;
- unsigned char *engineID;
- int engineIDLen;
- int i;
- struct usmUser *user;
- if (var_val_type != ASN_INTEGER) {
- printf("ASN_INTEGER\n");
- DEBUGMSGTL(("ucdDemoPublic","write to ucdDemoResetKeys not ASN_INTEGER\n"));
- return SNMP_ERR_WRONGTYPE;
- }
- if (var_val_len > sizeof(long_ret)) {
- DEBUGMSGTL(("ucdDemoPublic","write to ucdDemoResetKeys: bad length\n"));
- return SNMP_ERR_WRONGLENGTH;
- }
- if (action == COMMIT) {
- int fd = open("/dev/lamp", O_RDWR, 0644);
- if(fd<0){
- printf("open /dev/lamp error\n");
- return SNMP_ERR_NOERROR;
- }
- printf("new value: %x\n", *(long*)var_val);
- if( *(long *)var_val == 0) write(fd,"00\n", 3);
- if( *(long *)var_val == 1) write(fd,"01\n", 3);
- if( *(long *)var_val == 2) write(fd,"10\n", 3);
- if( *(long *)var_val == 3) write(fd,"11\n", 3);
- close(fd);
-
- long_ret = *((long *) var_val);
- /*if (long_ret == 1) {
- engineID = snmpv3_generate_engineID(&engineIDLen);
- for(i=0; i < num; i++) {
- user = usm_get_user(engineID, engineIDLen, demoUsers[i]);
- if (user) {
- usm_set_user_password(user, "userSetAuthPass", demopass);
- usm_set_user_password(user, "userSetPrivPass", demopass);
- }
- }
- reset the keys
- }*/
- }
- return SNMP_ERR_NOERROR;
- }
- int
- write_ucdDemoPublicString(
- int action,
- u_char *var_val,
- u_char var_val_type,
- size_t var_val_len,
- u_char *statP,
- oid *name,
- size_t name_len)
- {
- if (var_val_type != ASN_OCTET_STR) {
- DEBUGMSGTL(("ucdDemoPublic","write to ucdDemoPublicString not ASN_OCTET_STR\n"));
- return SNMP_ERR_WRONGTYPE;
- }
- if (var_val_len > MYMAX) {
- DEBUGMSGTL(("ucdDemoPublic","write to ucdDemoPublicString: bad length\n"));
- return SNMP_ERR_WRONGLENGTH;
- }
- if (action == COMMIT) {
- strcpy(publicString, var_val);
- }
- return SNMP_ERR_NOERROR;
- }
- int
- write_mynodetrap(int action,
- u_char * var_val,
- u_char var_val_type,
- size_t var_val_len,
- u_char * statP, oid * name, size_t name_len)
- {
- long intval;
- DEBUGMSGTL(("mynode", "write_mynodetrap entered: action=%d\n",
- action));
- switch (action) {
- case RESERVE1:
- /*
- * The only acceptable value is the integer 1
- */
- if (var_val_type != ASN_INTEGER) {
- DEBUGMSGTL(("mynode", "%x not integer type", var_val_type));
- return SNMP_ERR_WRONGTYPE;
- }
- if (var_val_len > sizeof(long)) {
- DEBUGMSGTL(("mynode", "wrong length %x", var_val_len));
- return SNMP_ERR_WRONGLENGTH;
- }
- intval = *((long *) var_val);
- if (intval != 1) {
- DEBUGMSGTL(("mynode", "wrong value %x", intval));
- return SNMP_ERR_WRONGVALUE;
- }
- break;
- case RESERVE2:
- /*
- * No resources are required....
- */
- break;
- case FREE:
- /*
- * ... so no resources need be freed
- */
- break;
- case ACTION:
- /*
- * Having triggered the sending of a trap,
- * it would be impossible to revoke this,
- * so we can't actually invoke the action here.
- */
- break;
- case UNDO:
- /*
- * We haven't done anything yet,
- * so there's nothing to undo
- */
- break;
- case COMMIT:
- /*
- * Everything else worked, so it's now safe
- * to trigger the trap.
- * Note that this is *only* acceptable since
- * the trap sending routines are "failsafe".
- * (In fact, they can fail, but they return no
- * indication of this, which is the next best thing!)
- */
- DEBUGMSGTL(("mynode", "write_mynodetrap sending the trap\n",
- action));
- send_easy_trap(SNMP_TRAP_ENTERPRISESPECIFIC, 99);
- DEBUGMSGTL(("mynode", "write_mynodetrap trap sent\n", action));
- break;
- }
- return SNMP_ERR_NOERROR;
- }
- /*
- * this documents how to send a SNMPv2 (and higher) trap via the
- * send_v2trap() API.
- *
- * Coding SNMP-v2 Trap:
- *
- * The SNMPv2-Trap PDU contains at least a pair of object names and
- * values: - sysUpTime.0 whose value is the time in hundredths of a
- * second since the netwok management portion of system was last
- * reinitialized. - snmpTrapOID.0 which is part of the trap group SNMPv2
- * MIB whose value is the object-id of the specific trap you have defined
- * in your own MIB. Other variables can be added to caracterize the
- * trap.
- *
- * The function send_v2trap adds automaticallys the two objects but the
- * value of snmpTrapOID.0 is 0.0 by default. If you want to add your trap
- * name, you have to reconstruct this object and to add your own
- * variable.
- *
- */
- int
- write_mynodetrap2(int action,
- u_char * var_val,
- u_char var_val_type,
- size_t var_val_len,
- u_char * statP, oid * name, size_t name_len)
- {
- long intval;
- /*
- * these variales will be used when we send the trap
- */
- oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };/* snmpTrapOID.0 */
- oid demo_trap[] = { 1, 3, 6, 1, 4, 1, 2021, 13, 990 }; /*demo-trap */
- oid mynode_string_oid[] =
- { 1, 3, 6, 1, 4, 1, 2021, 254, 1, 0 };
- static struct variable_list var_trap;
- static struct variable_list var_obj;
- DEBUGMSGTL(("mynode", "write_mynodetrap2 entered: action=%d\n",
- action));
- switch (action) {
- case RESERVE1:
- /*
- * The only acceptable value is the integer 1
- */
- if (var_val_type != ASN_INTEGER) {
- DEBUGMSGTL(("mynode", "%x not integer type", var_val_type));
- return SNMP_ERR_WRONGTYPE;
- }
- if (var_val_len > sizeof(long)) {
- DEBUGMSGTL(("mynode", "wrong length %x", var_val_len));
- return SNMP_ERR_WRONGLENGTH;
- }
- intval = *((long *) var_val);
- if (intval != 1) {
- DEBUGMSGTL(("mynode", "wrong value %x", intval));
- return SNMP_ERR_WRONGVALUE;
- }
- break;
- case RESERVE2:
- /*
- * No resources are required....
- */
- break;
- case FREE:
- /*
- * ... so no resources need be freed
- */
- break;
- case ACTION:
- /*
- * Having triggered the sending of a trap,
- * it would be impossible to revoke this,
- * so we can't actually invoke the action here.
- */
-
- //mynode_int = intval;
- //Temp_ret=intval;
- break;
- case UNDO:
- /*
- * We haven't done anything yet,
- * so there's nothing to undo
- */
-
- break;
- case COMMIT:
- /*
- * Everything else worked, so it's now safe
- * to trigger the trap.
- * Note that this is *only* acceptable since
- * the trap sending routines are "failsafe".
- * (In fact, they can fail, but they return no
- * indication of this, which is the next best thing!)
- */
- /*
- * trap definition objects
- */
- //Temp_ret=intval;
- var_trap.next_variable = &var_obj; /* next variable */
- var_trap.name = objid_snmptrap; /* snmpTrapOID.0 */
- var_trap.name_length = sizeof(objid_snmptrap) / sizeof(oid); /* number of sub-ids */
- var_trap.type = ASN_OBJECT_ID;
- var_trap.val.objid = demo_trap; /* demo-trap objid */
- var_trap.val_len = sizeof(demo_trap); /* length in bytes (not number of subids!) */
- /*
- * additional objects
- */
-
- strcpy(mynode_str, "HHHHHHHHHHH");
- var_obj.next_variable = NULL; /* No more variables after this one */
- var_obj.name = mynode_string_oid;
- var_obj.name_length = sizeof(mynode_string_oid) / sizeof(oid); /* number of sub-ids */
- var_obj.type = ASN_OCTET_STR; /* type of variable */
- var_obj.val.string = mynode_str; /* value */
- var_obj.val_len = strlen(mynode_str);
- DEBUGMSGTL(("mynode", "write_mynodetrap2 sending the v2 trap\n",
- action));
- send_v2trap(&var_trap);
- DEBUGMSGTL(("mynode", "write_mynodetrap2 v2 trap sent\n",
- action));
- break;
- }
- return SNMP_ERR_NOERROR;
- }
4..h文件:头文件
/uClinux-dist/user/ucdsnmp/agent/mibgroup/examples/ ucdDemoPublic.h
- /* ucdDemoPublic.h */
- #ifndef _MIBGROUP_UCDDEMOPUBLIC_H
- #define _MIBGROUP_UCDDEMOPUBLIC_H
- #include <snmp_api.h>
- #include <snmp_alarm.h>
- /* we use header_generic and checkmib from the util_funcs module */
- config_require(util_funcs)
- /* Magic number definitions: */
- #define UCDDEMORESETKEYS 1
- #define UCDDEMOPUBLICSTRING 2
- #define UCDDEMOUSERLIST 3
- #define UCDDEMOPASSPHRASE 4
- /* function definitions */
- extern void init_ucdDemoPublic(void);
- extern FindVarMethod var_ucdDemoPublic;
- //自定义的定时trap函数
- SNMPAlarmCallback snmploop_callback;
- WriteMethod write_ucdDemoResetKeys;
- WriteMethod write_ucdDemoPublicString;
- //自定义的函数声明
- WriteMethod write_mynodetrap;
- WriteMethod write_mynodetrap2;
- #endif /* _MIBGROUP_UCDDEMOPUBLIC_H */
四、调试输出
1.开发板的命令运行:
snmptrapd –c /etc/snmpd.conf -V
其中-c /etc/snmpd.conf 用来指定配置文件
2.开发主机的测试命令及其输出:
可以看到可以使用get,set来读取并设置节点的值,由于1.3.6.1.4.1.2021.14.1.1.6.0是trap节点,所以当其值被设置后,就会自动向管理站发送trap。
如果需要检测agent的trap报文,需要在管理站运行snmptrapd命令,可以如下使用:
snmptrapd –f –Lo
另外,如果agent上有定时的trap报文,同样可以使用snmptrapd命令进行检测,如图为10秒中一次的定时trap报文的接收情况。