SNMP开发系列(二)SNMP Agent的设计要点

SNMP在IT运营、网络设备管理、通信网元管理、物联网上应用广泛。以下章节将分析Linux/pSos等嵌入式环境下SNMP Agent流程特点及使用嵌入式设计SNMP Agent的技术细节(其中涉及到信息模型设计、C/C++语言等内容请各位看官提前学习哈)。本章也可以作为嵌入式下SNMP Agent的软件开发开发指导书。

(一)SNMP协议体系及技术要点

(二)SNMP Agent的设计要点

(三)SNMP Agent的实现

SNMP开发系列(二)SNMP Agent的设计要点

1 (二)SNMP Agent的设计要点

1.1 SNMP体系结构

SNMP(Simple Network Management Protocol)是被广泛接受并投入使用的工业标准,它的目标是保证管理信息在任意两点中传送,便于网络管理员在网络上的任何节点检索信息,进行修改,寻找故障;完成故障诊断,容量规划和报告生成。它采用轮询机制,提供最基本的功能集。最适合小型、快速、低价格的环境使用。它只要求无证实的传输层协议UDP,受到许多产品的广泛支持。

1.2 SMI与MIB文件和管理变量

SMI(Struct of Management Information)是ASN.1(抽象语法记法一)的一个子集,其中定义了几个SNMP常用类型和一个用来定义管理对象类型的宏,另外还作了几个重要的赋值。

SMI是定义管理对象类型的基础。

Management Inpormation Base 是所监控网络设备的标准变量定义的集合。SNMP用层次结构命名方案来识别管理对象,就象一棵树,树的节点表示管理对象,它可以用从根开始的一条路径来无二义的识别。

在Agent中这棵树是用较复杂的数据结构来实现的,不过这个工作可由MIB编译器完成。在树的叶节点中,存放有访问函数的指针,Agent就是通过调用这些函数来从相关模块取得管理变量的值的。

管理变量表示管理对象类型的值(或称该类型的实例),SNMP以管理变量作为操作对象。

管理变量的表示方法是这样规定的:形如x.y,其中x是管理对象的OBJECT IDENTIFER。y是能唯一确定对象类型值的一组数字;在简单变量(非表型)中为0,在表型变量中是这个表的索引,比如路由表中的目的网络地址等等 。

如:

计数器udpInDatagrams,它的对象标志为1.3.6.1.2.1.7.1,它的实例标记为1.3.6.1.2.1.7.1.0,对应的文字名为iso.org.dod.internet.mgmt.mib.udp.udpInDatagrams.0,可以简写为udpInDatagrams.0。

表型变量的表示要复杂一些。以UDP监听表为例,该表定义了两个变量的联合索引:

SNMP开发系列(二)SNMP Agent的设计要点

假设该表有三个实例: 假设该表有三个实例:

SNMP开发系列(二)SNMP Agent的设计要点

这三个实例经过处理后的对象标识表示为:

SNMP开发系列(二)SNMP Agent的设计要点

在MIB种对对象标识进行排序时时按照字典顺序进行排序的,排序后的情况如下:

SNMP开发系列(二)SNMP Agent的设计要点

所以对表形变量有以下两个结论:

· 表格中的一个给定变量的所有实例都在下一个变量实例之前显示;及表格的操作是“先列后行”;

· 表格中对行的排序与索引值的顺序有关;

这些概念对编写变量存取接口函数比较重要,希望开发人员能了解一些。

1.3 SNMP Agent处理流程

1.3.1 几个重要数据结构

几个重要的数据结构应该了解。

1. OID_T:标识变量名的一串数字中的一个成员,如:1.2.3.4

typedef unsigend long OIDC_T;

2. OBJ_ID_T:表示变量名,process_received_SNMP­_process函数将根据它搜索mib树

typedef struct OBJ_ID_S
{
 int num; //串中成员的个数
 OIDC_T* list; //变量名串
}OBJ_ID_T;

3. VarBind:变量与值对(pair)绑定;

typedef struct VB_S
 { 
 struct VB_S * vb_link; //指向下一个VB_T的指针
 ALENGTH_T vb_seq_size; //VarBind表的总长
 OBJ_ID_T vb_obj_id; 
 OCTET_T vb_data_flags_n_type; // VarBind的数据类型
 OCTET_T vb_flags; //VarBind的状态符号位
 ALENGTH_T vb_data_length; // 数据长度
 MIBLOC_T vb_ml; // 与此VarBind相关的mib-leaf
/***********************
 变量值
************************/ 
 union {
 INT_32_T v_number; // Integer kinds of things 
 UINT_32_T v_counter; 
 EBUFFER_T v_string; //八位字串
 OBJ_ID_T v_object; 
 unsigned char v_network_address[4]; //网络地址
 UINT_64_T v_counter64; 
 BITSTRING_T v_bitstring;
 } value_u;
 
 PTR_T vb_priv; /* storage space for moving info */ /* between test and set routines */
 VBPRIVPROC_T * vb_free_priv; /* pointer to routine to free the private storage space */
 UNDOPROC_T * undoproc; /* 指向取消设置的规程*/
 } VB_T;

4. VarBind List:它由一系列VarBind构成,列出一次请求中所有待操作的变量

typedef struct VBL_S
{
 ALENGTH_T vbl_length; /* VarBind表的长度*/
 int vbl_count; /*VarBind表中的VarBind数目 */
 VB_T *vblist; /* 指向VarBind的指针*/
 struct VBL_S *vblp; /* 用于GetBulkRequest操作的指针(SNMPv2中使用) */
} VBL_T;
 

5. SNMP_PKT_T: SNMP 数据包结构的内部表示

typedef struct SNMP_PKT_S
{
 ALENGTH_T buffer_needed; /* Buffer长度 */
 ALENGTH_T overall_length; /* 报文序列长度*/
 UINT_32_T mib_view; /* 设置mib视图 */
 OCTET_T flags; /*Packet的状态符号位 */
 UINT_16_T lcl_ident; /* Local transaction identifer*/
 SNMPADDR_T pkt_src; /* SNMP packet的源地址 . */
 SNMPADDR_T pkt_dst; /* SNMP packet的目地址 . */
 IO_COMPLETE_T *io_complete; /*处理此packet时调用的规程 */
 ERR_COMPLETE_T *error_complete; /*出错时调用的规程*/
 PTR_T async_cookie; /*cookie for use with completions */
 OCTET_T phase; /* what phase we are running, should be the same size as vb_flags */
 ALENGTH_T maxpkt; /*可编码生成的packet的最大长度 */
 char * user_private; /* Anything one wants */
 INT_32_T snmp_version; /*SNMP的版本号 */
 UINT_16_T view_index; /*视图的索引 */
 EBUFFER_T community; /*SNMPv1中的community名*/
 
 ATVALUE_T pdu_type; /* PDU类型 */
 ALENGTH_T pdu_length; /* PDU长度 */
 union {
 /* For GetRequest, GetNextRequest, */
 /* GetResponse, SetRequest, */
 /* GetBulkRequest, InformRequest, */
 /* and Trap2 PDUs. */
 struct { /* 参见RFC 1157 */
 INT_32_T request_id;
 INT_32_T error_status;
 INT_32_T error_index;
 VBL_T std_vbl;
 VBL_T saved_vbl;
 INT_32_T max_reps;
 int non_reps;
 } std_pdu;
} pdu;
 MIBNODE_T * mib_root; /*MIB tree的根节点*/
 OCTET_T lockflags; /*加LOCK的符号*/
 OCTET_T gate_decr; /*gate描述*/
} SNMP_PKT_T;

1.3.2 基本处理流程设计

SNMP开发系列(二)SNMP Agent的设计要点

Agent_Task处理流程

SNMP开发系列(二)SNMP Agent的设计要点

Agent_Init流程

SNMP开发系列(二)SNMP Agent的设计要点

Agent_body流程

SNMP开发系列(二)SNMP Agent的设计要点

Process_Rcvd_SNMP_Packet_Async()处理流程

理解了SNMP Agent处理过程,我们终于可以进入最期待的部分了! J

下一章节我们将讲解如何实现一个完整的SNMP Agent。

(未完待续…)

(三)SNMP Agent的实现


分享到:


相關文章: