深入理解Net-Snmp
上QQ阅读APP看书,第一时间看更新

2.7 宏定义

在SNMP中大量使用了宏,有必要作个了解。宏作为ASN.1中对数据类型的一种扩展机制,提供了一种新的定义对象的形式。与构造类型不同的是:宏可以定义新的标记形式,并且能构造更复杂的结构,描述更详细的语义。使用它定义的类型或值都具有相同的标记形式,因为它们都是宏定义的“模板”的实例。

与模块的定义类似,宏的定义也很简单:MACRO作为宏定义的关键字,由BEGIN开始,END结束。其定义形式如下:

<macro name> MACRO ::=
BEGIN
    TYPE NOTATION ::=  -- 类型定义
    VALUE NOTATION ::= -- 值定义
END

ASN.1中标记方式的本质就是对类型的和类型值的定义。一个对象一旦完成对类型和值的赋值,该对象也就确定了。上述的TYPE NOTATION和VALUE NOTATION就是对类型和值的定义。下面看看RFC1212中定义的OBJECT-TYPE宏(省略了部分内容),有了前面的知识应该很容易看懂该宏的实现:

OBJECT-TYPE MACRO ::=
        BEGIN
            TYPE NOTATION ::=
              --双引号作为终结符,里面的内容在使用时直接照写
              -- RFC1155中的 ObjectSyntax
             "SYNTAX" type(ObjectSyntax)
            "ACCESS" Access
             "STATUS" Status
             DescrPart
         -- value (VALUE X) 该格式将value值限制为X类型
          VALUE NOTATION ::= value (VALUE ObjectName)
             Access ::= "read-only"
                         | "read-write"
                         | "write-only"
                         | "not-accessible"
             Status ::= "mandatory"
                         | "optional"
                         | "obsolete"
                         | "deprecated"
             DescrPart ::=
                    "DESCRIPTION" value (description DisplayString)
                         | empty
        END

以下是使用OBJECT-TYPE宏定义对象的例子:

alarmNumber      OBJECT-TYPE
                  SYNTAX                  INTERGER  ( 0 .. 32767  )
                  MAX-ACCESS            read-only
                  STATUS                  current
                  DESCRIPTION            "how many real alarm now"
                  ::=  {  zcqRealAlarm  1  } 

注意

宏一般在模块中定义,并导出供其他模块使用。由宏定义的对象的传输编码与所使用的具体类型一致,也就是上述代码注释部分的X类型。