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的實現


分享到:


相關文章: