Network Working Group                                         F. Strauss
Request for Comments: 3780                               TU Braunschweig
Category: Experimental                                  J. Schoenwaelder
                                         International University Bremen
                                                                May 2004
        
Network Working Group                                         F. Strauss
Request for Comments: 3780                               TU Braunschweig
Category: Experimental                                  J. Schoenwaelder
                                         International University Bremen
                                                                May 2004
        

SMIng - Next Generation Structure of Management Information

SMIng—下一代管理信息结构

Status of this Memo

本备忘录的状况

This memo defines an Experimental Protocol for the Internet community. It does not specify an Internet standard of any kind. Discussion and suggestions for improvement are requested. Distribution of this memo is unlimited.

这份备忘录为互联网社区定义了一个实验性协议。它没有规定任何类型的互联网标准。要求进行讨论并提出改进建议。本备忘录的分发不受限制。

Copyright Notice

版权公告

Copyright (C) The Internet Society (2004). All Rights Reserved.

版权所有(C)互联网协会(2004年)。版权所有。

Abstract

摘要

This memo defines the base SMIng (Structure of Management Information, Next Generation) language. SMIng is a data definition language that provides a protocol-independent representation for management information. Separate RFCs define mappings of SMIng to specific management protocols, including SNMP.

本备忘录定义了基本SMIng(管理信息结构,下一代)语言。SMIng是一种数据定义语言,为管理信息提供独立于协议的表示。单独的RFC定义SMIng到特定管理协议(包括SNMP)的映射。

Table of Contents

目录

   1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
       1.1.  The History of SMIng . . . . . . . . . . . . . . . . . .  4
       1.2.  Terms of Requirement Levels. . . . . . . . . . . . . . .  5
   2.  SMIng Data Modeling. . . . . . . . . . . . . . . . . . . . . .  5
       2.1.  Identifiers. . . . . . . . . . . . . . . . . . . . . . .  6
   3.  Base Types and Derived Types . . . . . . . . . . . . . . . . .  7
       3.1.  OctetString. . . . . . . . . . . . . . . . . . . . . . .  8
       3.2.  Pointer. . . . . . . . . . . . . . . . . . . . . . . . .  9
       3.3.  ObjectIdentifier . . . . . . . . . . . . . . . . . . . .  9
       3.4.  Integer32. . . . . . . . . . . . . . . . . . . . . . . . 10
       3.5.  Integer64. . . . . . . . . . . . . . . . . . . . . . . . 11
       3.6.  Unsigned32 . . . . . . . . . . . . . . . . . . . . . . . 12
       3.7.  Unsigned64 . . . . . . . . . . . . . . . . . . . . . . . 13
       3.8.  Float32. . . . . . . . . . . . . . . . . . . . . . . . . 13
       3.9.  Float64. . . . . . . . . . . . . . . . . . . . . . . . . 14
       3.10. Float128 . . . . . . . . . . . . . . . . . . . . . . . . 15
       3.11. Enumeration. . . . . . . . . . . . . . . . . . . . . . . 17
       3.12. Bits . . . . . . . . . . . . . . . . . . . . . . . . . . 17
        
   1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
       1.1.  The History of SMIng . . . . . . . . . . . . . . . . . .  4
       1.2.  Terms of Requirement Levels. . . . . . . . . . . . . . .  5
   2.  SMIng Data Modeling. . . . . . . . . . . . . . . . . . . . . .  5
       2.1.  Identifiers. . . . . . . . . . . . . . . . . . . . . . .  6
   3.  Base Types and Derived Types . . . . . . . . . . . . . . . . .  7
       3.1.  OctetString. . . . . . . . . . . . . . . . . . . . . . .  8
       3.2.  Pointer. . . . . . . . . . . . . . . . . . . . . . . . .  9
       3.3.  ObjectIdentifier . . . . . . . . . . . . . . . . . . . .  9
       3.4.  Integer32. . . . . . . . . . . . . . . . . . . . . . . . 10
       3.5.  Integer64. . . . . . . . . . . . . . . . . . . . . . . . 11
       3.6.  Unsigned32 . . . . . . . . . . . . . . . . . . . . . . . 12
       3.7.  Unsigned64 . . . . . . . . . . . . . . . . . . . . . . . 13
       3.8.  Float32. . . . . . . . . . . . . . . . . . . . . . . . . 13
       3.9.  Float64. . . . . . . . . . . . . . . . . . . . . . . . . 14
       3.10. Float128 . . . . . . . . . . . . . . . . . . . . . . . . 15
       3.11. Enumeration. . . . . . . . . . . . . . . . . . . . . . . 17
       3.12. Bits . . . . . . . . . . . . . . . . . . . . . . . . . . 17
        
       3.13. Display Formats. . . . . . . . . . . . . . . . . . . . . 18
   4.  The SMIng File Structure . . . . . . . . . . . . . . . . . . . 20
       4.1.  Comments . . . . . . . . . . . . . . . . . . . . . . . . 20
       4.2.  Textual Data . . . . . . . . . . . . . . . . . . . . . . 21
       4.3.  Statements and Arguments . . . . . . . . . . . . . . . . 21
   5.  The module Statement . . . . . . . . . . . . . . . . . . . . . 21
       5.1.  The module's import Statement. . . . . . . . . . . . . . 22
       5.2.  The module's organization Statement. . . . . . . . . . . 23
       5.3.  The module's contact Statement . . . . . . . . . . . . . 23
       5.4.  The module's description Statement . . . . . . . . . . . 23
       5.5.  The module's reference Statement . . . . . . . . . . . . 23
       5.6.  The module's revision Statement. . . . . . . . . . . . . 23
             5.6.1. The revision's date Statement . . . . . . . . . . 24
             5.6.2. The revision's description Statement. . . . . . . 24
       5.7.  Usage Example. . . . . . . . . . . . . . . . . . . . . . 24
   6.  The extension Statement. . . . . . . . . . . . . . . . . . . . 25
       6.1.  The extension's status Statement . . . . . . . . . . . . 25
       6.2.  The extension's description Statement. . . . . . . . . . 26
       6.3.  The extension's reference Statement. . . . . . . . . . . 26
       6.4.  The extension's abnf Statement . . . . . . . . . . . . . 26
       6.5.  Usage Example. . . . . . . . . . . . . . . . . . . . . . 26
   7.  The typedef Statement. . . . . . . . . . . . . . . . . . . . . 27
       7.1.  The typedef's type Statement . . . . . . . . . . . . . . 27
       7.2.  The typedef's default Statement. . . . . . . . . . . . . 27
       7.3.  The typedef's format Statement . . . . . . . . . . . . . 27
       7.4.  The typedef's units Statement. . . . . . . . . . . . . . 28
       7.5.  The typedef's status Statement . . . . . . . . . . . . . 28
       7.6.  The typedef's description Statement. . . . . . . . . . . 29
       7.7.  The typedef's reference Statement. . . . . . . . . . . . 29
       7.8.  Usage Examples . . . . . . . . . . . . . . . . . . . . . 29
   8.  The identity Statement . . . . . . . . . . . . . . . . . . . . 30
       8.1.  The identity's parent Statement. . . . . . . . . . . . . 30
       8.2.  The identity's status Statement. . . . . . . . . . . . . 30
       8.3.  The identity' description Statement. . . . . . . . . . . 31
       8.4.  The identity's reference Statement . . . . . . . . . . . 31
       8.5.  Usage Examples . . . . . . . . . . . . . . . . . . . . . 31
   9.  The class Statement. . . . . . . . . . . . . . . . . . . . . . 32
       9.1.  The class' extends Statement . . . . . . . . . . . . . . 32
       9.2.  The class' attribute Statement . . . . . . . . . . . . . 32
             9.2.1. The attribute's type Statement. . . . . . . . . . 32
             9.2.2. The attribute's access Statement. . . . . . . . . 32
             9.2.3. The attribute's default Statement . . . . . . . . 33
             9.2.4. The attribute's format Statement. . . . . . . . . 33
             9.2.5. The attribute's units Statement . . . . . . . . . 33
             9.2.6. The attribute's status Statement. . . . . . . . . 34
             9.2.7. The attribute's description Statement . . . . . . 34
             9.2.8. The attribute's reference Statement . . . . . . . 34
       9.3.  The class' unique Statement. . . . . . . . . . . . . . . 35
        
       3.13. Display Formats. . . . . . . . . . . . . . . . . . . . . 18
   4.  The SMIng File Structure . . . . . . . . . . . . . . . . . . . 20
       4.1.  Comments . . . . . . . . . . . . . . . . . . . . . . . . 20
       4.2.  Textual Data . . . . . . . . . . . . . . . . . . . . . . 21
       4.3.  Statements and Arguments . . . . . . . . . . . . . . . . 21
   5.  The module Statement . . . . . . . . . . . . . . . . . . . . . 21
       5.1.  The module's import Statement. . . . . . . . . . . . . . 22
       5.2.  The module's organization Statement. . . . . . . . . . . 23
       5.3.  The module's contact Statement . . . . . . . . . . . . . 23
       5.4.  The module's description Statement . . . . . . . . . . . 23
       5.5.  The module's reference Statement . . . . . . . . . . . . 23
       5.6.  The module's revision Statement. . . . . . . . . . . . . 23
             5.6.1. The revision's date Statement . . . . . . . . . . 24
             5.6.2. The revision's description Statement. . . . . . . 24
       5.7.  Usage Example. . . . . . . . . . . . . . . . . . . . . . 24
   6.  The extension Statement. . . . . . . . . . . . . . . . . . . . 25
       6.1.  The extension's status Statement . . . . . . . . . . . . 25
       6.2.  The extension's description Statement. . . . . . . . . . 26
       6.3.  The extension's reference Statement. . . . . . . . . . . 26
       6.4.  The extension's abnf Statement . . . . . . . . . . . . . 26
       6.5.  Usage Example. . . . . . . . . . . . . . . . . . . . . . 26
   7.  The typedef Statement. . . . . . . . . . . . . . . . . . . . . 27
       7.1.  The typedef's type Statement . . . . . . . . . . . . . . 27
       7.2.  The typedef's default Statement. . . . . . . . . . . . . 27
       7.3.  The typedef's format Statement . . . . . . . . . . . . . 27
       7.4.  The typedef's units Statement. . . . . . . . . . . . . . 28
       7.5.  The typedef's status Statement . . . . . . . . . . . . . 28
       7.6.  The typedef's description Statement. . . . . . . . . . . 29
       7.7.  The typedef's reference Statement. . . . . . . . . . . . 29
       7.8.  Usage Examples . . . . . . . . . . . . . . . . . . . . . 29
   8.  The identity Statement . . . . . . . . . . . . . . . . . . . . 30
       8.1.  The identity's parent Statement. . . . . . . . . . . . . 30
       8.2.  The identity's status Statement. . . . . . . . . . . . . 30
       8.3.  The identity' description Statement. . . . . . . . . . . 31
       8.4.  The identity's reference Statement . . . . . . . . . . . 31
       8.5.  Usage Examples . . . . . . . . . . . . . . . . . . . . . 31
   9.  The class Statement. . . . . . . . . . . . . . . . . . . . . . 32
       9.1.  The class' extends Statement . . . . . . . . . . . . . . 32
       9.2.  The class' attribute Statement . . . . . . . . . . . . . 32
             9.2.1. The attribute's type Statement. . . . . . . . . . 32
             9.2.2. The attribute's access Statement. . . . . . . . . 32
             9.2.3. The attribute's default Statement . . . . . . . . 33
             9.2.4. The attribute's format Statement. . . . . . . . . 33
             9.2.5. The attribute's units Statement . . . . . . . . . 33
             9.2.6. The attribute's status Statement. . . . . . . . . 34
             9.2.7. The attribute's description Statement . . . . . . 34
             9.2.8. The attribute's reference Statement . . . . . . . 34
       9.3.  The class' unique Statement. . . . . . . . . . . . . . . 35
        
       9.4.  The class' event Statement . . . . . . . . . . . . . . . 35
             9.4.1. The event's status Statement. . . . . . . . . . . 35
             9.4.2. The event's description Statement . . . . . . . . 35
             9.4.3. The event's reference Statement . . . . . . . . . 36
       9.5.  The class' status Statement. . . . . . . . . . . . . . . 36
       9.6.  The class' description Statement . . . . . . . . . . . . 36
       9.7.  The class' reference Statement . . . . . . . . . . . . . 37
       9.8.  Usage Example. . . . . . . . . . . . . . . . . . . . . . 37
   10. Extending a Module . . . . . . . . . . . . . . . . . . . . . . 38
   11. SMIng Language Extensibility . . . . . . . . . . . . . . . . . 39
   12. Security Considerations. . . . . . . . . . . . . . . . . . . . 41
   13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 41
   14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 42
       14.1. Normative References . . . . . . . . . . . . . . . . . . 42
       14.2. Informative References . . . . . . . . . . . . . . . . . 42
   Appendix A.  NMRG-SMING Module . . . . . . . . . . . . . . . . . . 44
   Appendix B.  SMIng ABNF Grammar. . . . . . . . . . . . . . . . . . 53
   Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 63
   Full Copyright Statement . . . . . . . . . . . . . . . . . . . . . 64
        
       9.4.  The class' event Statement . . . . . . . . . . . . . . . 35
             9.4.1. The event's status Statement. . . . . . . . . . . 35
             9.4.2. The event's description Statement . . . . . . . . 35
             9.4.3. The event's reference Statement . . . . . . . . . 36
       9.5.  The class' status Statement. . . . . . . . . . . . . . . 36
       9.6.  The class' description Statement . . . . . . . . . . . . 36
       9.7.  The class' reference Statement . . . . . . . . . . . . . 37
       9.8.  Usage Example. . . . . . . . . . . . . . . . . . . . . . 37
   10. Extending a Module . . . . . . . . . . . . . . . . . . . . . . 38
   11. SMIng Language Extensibility . . . . . . . . . . . . . . . . . 39
   12. Security Considerations. . . . . . . . . . . . . . . . . . . . 41
   13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 41
   14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 42
       14.1. Normative References . . . . . . . . . . . . . . . . . . 42
       14.2. Informative References . . . . . . . . . . . . . . . . . 42
   Appendix A.  NMRG-SMING Module . . . . . . . . . . . . . . . . . . 44
   Appendix B.  SMIng ABNF Grammar. . . . . . . . . . . . . . . . . . 53
   Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 63
   Full Copyright Statement . . . . . . . . . . . . . . . . . . . . . 64
        
1. Introduction
1. 介绍

In traditional management systems, management information is viewed as a collection of managed objects, residing in a virtual information store, termed the Management Information Base (MIB). Collections of related objects are defined in MIB modules. These modules are written in conformance with a specification language, the Structure of Management Information (SMI). There are different versions of the SMI. The SMI version 1 (SMIv1) is defined in [RFC1155], [RFC1212], [RFC1215], and the SMI version 2 (SMIv2) in [RFC2578], [RFC2579], and [RFC2580]. Both are based on adapted subsets of OSI's Abstract Syntax Notation One, ASN.1 [ASN1].

在传统管理系统中,管理信息被视为托管对象的集合,驻留在虚拟信息存储中,称为管理信息库(MIB)。相关对象的集合在MIB模块中定义。这些模块是按照规范语言管理信息结构(SMI)编写的。SMI有不同的版本。SMI版本1(SMIv1)在[RFC1155]、[RFC1212]、[RFC1215]中定义,SMI版本2(SMIv2)在[RFC2578]、[RFC2579]和[RFC2580]中定义。两者都基于OSI抽象语法符号ASN.1[ASN1]的自适应子集。

In a similar fashion, policy provisioning information is viewed as a collection of Provisioning Classes (PRCs) and Provisioning Instances (PRIs) residing in a virtual information store, termed the Policy Information Base (PIB). Collections of related Provisioning Classes are defined in PIB modules. PIB modules are written using the Structure of Policy Provisioning Information (SPPI) [RFC3159] which is an adapted subset of SMIv2.

以类似的方式,策略供应信息被视为驻留在虚拟信息存储中的供应类(PRC)和供应实例(PRI)的集合,称为策略信息库(PIB)。相关资源调配类的集合在PIB模块中定义。PIB模块是使用策略供应信息(SPPI)[RFC3159]的结构编写的,该结构是SMIv2的一个子集。

The SMIv1 and the SMIv2 are bound to the Simple Network Management Protocol (SNMP) [RFC3411], while the SPPI is bound to the Common Open Policy Service Provisioning (COPS-PR) Protocol [RFC3084]. Even though the languages have common rules, it is hard to use common data definitions with both protocols. It is the purpose of this document to define a common data definition language, named SMIng, that can

SMIv1和SMIv2绑定到简单网络管理协议(SNMP)[RFC3411],而SPPI绑定到公共开放策略服务提供(COPS-PR)协议[RFC3084]。尽管这两种语言有共同的规则,但很难在两种协议中使用共同的数据定义。本文档的目的是定义一种通用的数据定义语言,名为SMIng,它可以

formally specify data models independent of specific protocols and applications. The appendix of this document defines a core module that supplies common SMIng definitions.

正式指定独立于特定协议和应用程序的数据模型。本文档的附录定义了一个核心模块,该模块提供通用的SMIng定义。

A companion document contains an SMIng language extension to define SNMP specific mappings of SMIng definitions in compatibility with SMIv2 MIB modules [RFC3781]. Additional language extensions may be added in the future, e.g., to define COPS-PR specific mappings of SMIng definitions in a way that is compatible with SPPI PIBs.

附带文档包含一个SMIng语言扩展,用于定义与SMIv2 MIB模块兼容的SMIng定义的SNMP特定映射[RFC3781]。将来可能会添加其他语言扩展,例如,以与SPPI PIB兼容的方式定义SMIng定义的COPS-PR特定映射。

Section 2 gives an overview of the basic concepts of data modeling using SMIng, while the subsequent sections present the concepts of the SMIng language in detail: the base types, the SMIng file structure, and all SMIng core statements.

第2节概述了使用SMIng进行数据建模的基本概念,随后的几节详细介绍了SMIng语言的概念:基本类型、SMIng文件结构和所有SMIng核心语句。

The remainder of the document describes extensibility features of the language and rules to follow when changes are applied to a module. Appendix B contains the grammar of SMIng in ABNF [RFC2234] notation.

文档的其余部分描述了该语言的可扩展性特性,以及将更改应用于模块时要遵循的规则。附录B包含ABNF[RFC2234]符号中的SMIng语法。

1.1. The History of SMIng
1.1. 斯明的历史

SMIng started in 1999 as a research project to address some drawbacks of SMIv2, the current data modeling language for management information bases. Primarily, its partial dependence on ASN.1 and a number of exception rules turned out to be problematic. In 2000, the work was handed over to the IRTF Network Management Research Group where it was significantly detailed. Since the work of the RAP Working Group on COPS-PR and SPPI emerged in 1999/2000, SMIng was split into two parts: a core data definition language (defined in this document) and protocol mappings to allow the application of core definitions through (potentially) multiple management protocols. The replacement of SMIv2 and SPPI by a single merged data definition language was also a primary goal of the IETF SMING Working Group that was chartered at the end of 2000.

SMIng始于1999年,是一个研究项目,旨在解决SMIv2(当前用于管理信息库的数据建模语言)的一些缺点。首先,它对ASN.1和一些异常规则的部分依赖最终证明是有问题的。2000年,这项工作移交给了IRTF网络管理研究小组,该小组对这项工作进行了详细说明。自1999/2000年COPS-PR和SPPI RAP工作组的工作出现以来,SMIng被分为两部分:核心数据定义语言(在本文件中定义)和协议映射,以允许通过(可能的)多个管理协议应用核心定义。用单一的合并数据定义语言替换SMIv2和SPPI也是2000年底特许成立的IETF SMING工作组的主要目标。

The requirements for a new data definition language were discussed several times within the IETF SMING Working Group and changed significantly over time [RFC3216], so that another proposal (in addition to SMIng), named SMI Data Structures (SMI-DS), was presented to the Working Group. In the end, neither of the two proposals found enough consensus and support, and the attempt to merge the existing concepts did not succeed, resulting in the Working Group being closed down in April 2003.

IETF SMIN工作组多次讨论了新数据定义语言的要求,并随着时间的推移发生了重大变化[RFC3216],因此,向工作组提交了另一个提案(除SMIN外),名为SMI数据结构(SMI-DS)。最后,两项提案都没有得到足够的共识和支持,合并现有概念的尝试也没有成功,导致工作组于2003年4月关闭。

In order to record the work of the NMRG (Network Management Research Group) on SMIng, this memo and the accompanying memo on the SNMP protocol mapping [RFC3781] have been published for informational purposes.

为了记录NMRG(网络管理研究小组)在SMIng方面的工作,发布了本备忘录和随附的SNMP协议映射备忘录[RFC3781],以供参考。

Note that throughout these documents, the term "SMIng" refers to the specific data modeling language that is specified in this document, whereas the term "SMING" refers to the general effort within the IETF Working Group to define a new management data definition language as an SMIv2 successor and probably an SPPI merger, for which "SMIng" and "SMI-DS" were two specific proposals.

请注意,在所有这些文件中,术语“SMIng”指的是本文件中规定的特定数据建模语言,而术语“SMIng”指的是IETF工作组内的一般工作,以定义新的管理数据定义语言作为SMIv2的继承者和可能的SPPI合并,为此,“SMIng”和“SMI-DS”是两个具体的提案。

1.2. Terms of Requirement Levels
1.2. 需求水平条款

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119].

本文件中的关键词“必须”、“不得”、“必需”、“应”、“不应”、“应”、“不应”、“建议”、“可”和“可选”应按照[RFC2119]中所述进行解释。

2. SMIng Data Modeling
2. SMIng数据建模

SMIng is a language designed to specify management information in a structured way readable to computer programs, e.g., MIB compilers, as well as to human readers.

SMIng是一种设计用于以计算机程序(如MIB编译器)以及人类读者可读的结构化方式指定管理信息的语言。

Management information is modeled in classes. Classes can be defined from scratch or by derivation from a parent class. Derivation from multiple parent classes is not possible. The concept of classes is described in Section 9.

管理信息在类中建模。类可以从头定义,也可以从父类派生。无法从多个父类派生。第9节介绍了类的概念。

Each class has a number of attributes. Each attribute represents an atomic piece of information of a base type, a sub-type of a base type, or another class. The concept of attributes is described in Section 9.2.

每个类都有许多属性。每个属性表示基类型、基类型的子类型或其他类的原子信息。第9.2节描述了属性的概念。

The base types of SMIng include signed and unsigned integers, octet strings, enumeration types, bitset types, and pointers. Pointers are references to class instances, attributes of class instances, or arbitrary identities. The SMIng type system is described in Section 3.

SMIng的基本类型包括有符号和无符号整数、八位字符串、枚举类型、位集类型和指针。指针是对类实例、类实例属性或任意标识的引用。第3节介绍了SMIng型系统。

Related class and type definitions are defined in modules. A module may refer to definitions from other modules by importing identifiers from those modules. Each module may serve one or multiple purposes:

相关的类和类型定义在模块中定义。模块可以通过从其他模块导入标识符来引用这些模块的定义。每个模块可用于一个或多个目的:

o the definition of management classes,

o 管理类的定义,

o the definition of events,

o 事件的定义,

o the definition of derived types,

o 派生类型的定义,

o the definition of arbitrary untyped identities serving as values of pointers,

o 作为指针值的任意非类型标识的定义,

o the definition of SMIng extensions allowing the local module or other modules to specify information beyond the scope of the base SMIng in a machine readable notation. Some extensions for the application of SMIng in the SNMP framework are defined in [RFC3781],

o SMIng扩展的定义,允许本地模块或其他模块以机器可读的表示法指定超出基本SMIng范围的信息。[RFC3781]中定义了SNMP框架中SMIng应用程序的一些扩展,

o the definition of information beyond the scope of the base SMIng statements, based on locally defined or imported SMIng extensions.

o 基于本地定义或导入的SMIng扩展,超出基本SMIng语句范围的信息定义。

Each module is identified by an upper-case identifier. The names of all standard modules must be unique (but different versions of the same module should have the same name). Developers of enterprise modules are encouraged to choose names for their modules that will have a low probability of colliding with standard or other enterprise modules, e.g., by using the enterprise or organization name as a prefix.

每个模块由大写标识符标识。所有标准模块的名称必须唯一(但同一模块的不同版本应具有相同的名称)。鼓励企业模块的开发人员为其模块选择与标准模块或其他企业模块发生冲突的可能性较低的名称,例如使用企业或组织名称作为前缀。

2.1. Identifiers
2.1. 标识符

Identifiers are used to identify different kinds of SMIng items by name. Each identifier is valid in a namespace which depends on the type of the SMIng item being defined:

标识符用于按名称标识不同类型的SMIng项。每个标识符在命名空间中都有效,该命名空间取决于所定义的SMIng项的类型:

o The global namespace contains all module identifiers.

o 全局命名空间包含所有模块标识符。

o Each module defines a new namespace. A module's namespace may contain definitions of extension identifiers, derived type identifiers, identity identifiers, and class identifiers. Furthermore, a module may import identifiers of these kinds from other modules. All these identifiers are also visible within all inner namespaces of the module.

o 每个模块定义一个新的名称空间。模块的命名空间可以包含扩展标识符、派生类型标识符、标识标识符和类标识符的定义。此外,模块可以从其他模块导入这些类型的标识符。所有这些标识符在模块的所有内部名称空间中也是可见的。

o Each class within a module defines a new namespace. A class' namespace may contain definitions of attribute identifiers and event identifiers.

o 模块中的每个类都定义了一个新的命名空间。类的命名空间可以包含属性标识符和事件标识符的定义。

o Each enumeration type and bitset type defines a new namespace of its named numbers. These named numbers are visible in each expression of a corresponding value, e.g., default values and sub-typing restrictions.

o 每个枚举类型和位集类型都定义其命名编号的新命名空间。这些命名数字在对应值的每个表达式中都可见,例如,默认值和子类型限制。

o Extensions may define additional namespaces and have additional rules of other namespaces' visibility.

o 扩展可以定义其他名称空间,并具有其他名称空间可见性的其他规则。

Within every namespace each identifier MUST be unique.

在每个名称空间中,每个标识符都必须是唯一的。

Each identifier starts with an upper-case or lower-case character, dependent on the kind of SMIng item, followed by zero or more letters, digits, and hyphens.

每个标识符都以一个大写或小写字符开头,取决于SMIng项的类型,后跟零个或多个字母、数字和连字符。

All identifiers defined in a namespace MUST be unique and SHOULD NOT only differ in case. Identifiers MUST NOT exceed 64 characters in length. Furthermore, the set of all identifiers defined in all modules of a single standardization body or organization SHOULD be unique and mnemonic. This promotes a common language for humans to use when discussing a module.

命名空间中定义的所有标识符必须是唯一的,并且不应仅在大小写上有所不同。标识符的长度不得超过64个字符。此外,在单个标准化机构或组织的所有模块中定义的所有标识符集应该是唯一的和助记的。这促进了人们在讨论模块时使用的通用语言。

To reference an item that is defined in the local module, its definition MUST sequentially precede the reference. Thus, there MUST NOT be any forward references.

若要引用在本地模块中定义的项,其定义必须顺序在引用之前。因此,不得有任何正向参考。

To reference an item that is defined in an external module it MUST be imported (Section 5.1). Identifiers that are neither defined nor imported MUST NOT be visible in the local module.

要引用外部模块中定义的项目,必须导入该项目(第5.1节)。未定义或未导入的标识符在本地模块中不得可见。

When identifiers from external modules are referenced, there is the possibility of name collisions. As such, if different items with the same identifier are imported or if imported identifiers collide with identifiers of locally defined items, then this ambiguity is resolved by prefixing those identifiers with the names of their modules and the namespace operator `::', i.e., `Module::item'. Of course, this notation can be used to refer to identifiers even when there is no name collision.

引用外部模块的标识符时,可能会发生名称冲突。同样,如果导入了具有相同标识符的不同项,或者导入的标识符与本地定义的项的标识符冲突,则可以通过在这些标识符前面加上它们的模块名称和名称空间运算符“::”,即“模块::项”,来解决这种歧义。当然,即使在没有名称冲突的情况下,也可以使用此符号来引用标识符。

Note that SMIng core language keywords MUST NOT be imported. See the `...Keyword' rules of the SMIng ABNF grammar in Appendix B for a list of those keywords.

请注意,不能导入SMIng核心语言关键字。有关这些关键字的列表,请参见附录B中SMIng ABNF语法的“…关键字”规则。

3. Base Types and Derived Types
3. 基类型和派生类型

SMIng has a set of base types, similar to those of many programming languages, but with some differences due to special requirements from the management information model.

SMIng有一组基本类型,类似于许多编程语言的基本类型,但由于管理信息模型的特殊要求,它们之间存在一些差异。

Additional types may be defined, derived from those base types or from other derived types. Derived types may use subtyping to formally restrict the set of possible values. An initial set of commonly used derived types is defined in the SMIng standard module NMRG-SMING [RFC3781].

可以定义其他类型,从这些基类型或其他派生类型派生。派生类型可以使用子类型来正式限制可能的值集。SMIng标准模块NMRG-SMIng[RFC3781]中定义了常用派生类型的初始集合。

The different base types and their derived types allow different kinds of subtyping, namely size restrictions of octet strings (Section 3.1), range restrictions of numeric types (Section 3.4

不同的基类型及其派生类型允许不同类型的子类型,即八位字节字符串的大小限制(第3.1节)、数字类型的范围限制(第3.4节)

through Section 3.10), restricted pointer types (Section 3.2), and restrictions on the sets of named numbers for enumeration types (Section 3.11) and bit sets (Section 3.12).

通过第3.10节),限制指针类型(第3.2节),以及对枚举类型(第3.11节)和位集(第3.12节)的命名数字集的限制。

3.1. OctetString
3.1. 八进制字符串

The OctetString base type represents arbitrary binary or textual data. Although SMIng has a theoretical size limitation of 2^16-1 (65535) octets for this base type, module designers should realize that there may be implementation and interoperability limitations for sizes in excess of 255 octets.

八进制字符串基类型表示任意二进制或文本数据。尽管对于这种基本类型,SMIng的理论大小限制为2^16-1(65535)个八位字节,但模块设计者应该意识到,对于超过255个八位字节的大小,可能存在实现和互操作性限制。

Values of octet strings may be denoted as textual data enclosed in double quotes or as arbitrary binary data denoted as a `0x'-prefixed hexadecimal value of an even number of at least two hexadecimal digits, where each pair of hexadecimal digits represents a single octet. Letters in hexadecimal values MAY be upper-case, but lower-case characters are RECOMMENDED. Textual data may contain any number (possibly zero) of any 7-bit displayable ASCII characters, including tab characters, spaces, and line terminator characters (nl or cr & nl). Some characters require a special encoding (see Section 4.2). Textual data may span multiple lines, where each subsequent line prefix containing only white space up to the column where the first line's data starts SHOULD be skipped by parsers for a better text formatting.

八位字节字符串的值可以表示为包含在双引号中的文本数据,或者表示为至少两个十六进制数字偶数的“0x”前缀十六进制值的任意二进制数据,其中每对十六进制数字表示一个八位字节。十六进制值中的字母可以是大写,但建议使用小写字符。文本数据可以包含任意数量(可能为零)的任何7位可显示ASCII字符,包括制表符、空格和行结束符(nl或cr&nl)。某些字符需要特殊编码(见第4.2节)。文本数据可能跨越多行,为了更好地设置文本格式,解析器应跳过每个后续行前缀,该行前缀仅包含空格,直到第一行数据开始的列为止。

When defining a type derived (directly or indirectly) from the OctetString base type, the size in octets may be restricted by appending a list of size ranges or explicit size values, separated by pipe `|' characters, with the whole list enclosed in parenthesis. A size range consists of a lower bound, two consecutive dots `..', and an upper bound. Each value can be given in decimal or `0x'-prefixed hexadecimal notation. Hexadecimal numbers must have an even number of at least two digits. Size restricting values MUST NOT be negative. If multiple values or ranges are given, they all MUST be disjoint and MUST be in ascending order. If a size restriction is applied to an already size restricted octet string, the new restriction MUST be equal or more limiting, that is, raising the lower bounds, reducing the upper bounds, removing explicit size values or ranges, or splitting ranges into multiple ranges with intermediate gaps.

定义从八进制字符串基类型派生(直接或间接)的类型时,可以通过附加大小范围或显式大小值列表来限制八进制的大小,这些列表由管道`|字符分隔,整个列表用括号括起来。尺寸范围由下限、两个连续点“..”和一个上限组成。每个值都可以用十进制或“0x”前缀的十六进制表示法给出。十六进制数必须至少有两位数的偶数。大小限制值不能为负值。如果给定了多个值或范围,则它们都必须是不相交的,并且必须按升序排列。如果将大小限制应用于已受大小限制的八位字节字符串,则新限制必须等于或大于限制,即提高下界、降低上界、删除显式大小值或范围,或将范围拆分为具有中间间隙的多个范围。

Value Examples:

价值示例:

      "This is a multiline
       textual data example."         // legal
      "This is "illegally" quoted."   // illegal quotes
      "This is \"legally\" quoted."   // legally encoded quotes
      "But this is 'ok', as well."    // legal apostrophe quoting
      ""                              // legal zero length
      0x123                           // illegal odd hex length
      0x534d496e670a                  // legal octet string
        
      "This is a multiline
       textual data example."         // legal
      "This is "illegally" quoted."   // illegal quotes
      "This is \"legally\" quoted."   // legally encoded quotes
      "But this is 'ok', as well."    // legal apostrophe quoting
      ""                              // legal zero length
      0x123                           // illegal odd hex length
      0x534d496e670a                  // legal octet string
        

Restriction Examples:

限制示例:

      OctetString (0 | 4..255)        // legal size spec
      OctetString (4)                 // legal exact size
      OctetString (-1 | 1)            // illegal negative size
      OctetString (5 | 0)             // illegal ordering
      OctetString (1 | 1..10)         // illegal overlapping
        
      OctetString (0 | 4..255)        // legal size spec
      OctetString (4)                 // legal exact size
      OctetString (-1 | 1)            // illegal negative size
      OctetString (5 | 0)             // illegal ordering
      OctetString (1 | 1..10)         // illegal overlapping
        
3.2. Pointer
3.2. 指针

The Pointer base type represents values that reference class instances, attributes of class instances, or arbitrary identities. The only values of the Pointer type that can be present in a module can refer to identities. They are denoted as identifiers of the concerned identities.

指针基类型表示引用类实例、类实例属性或任意标识的值。模块中只能存在指针类型的值,这些值可以引用标识。它们被表示为相关身份的标识符。

When defining a type derived (directly or indirectly) from the Pointer base type, the values may be restricted to a specific class, attribute or identity, and all (directly or indirectly) derived items thereof by appending the identifier of the appropriate construct enclosed in parenthesis.

定义从指针基类型派生(直接或间接)的类型时,可通过在括号中附加适当构造的标识符,将值限制为特定类、属性或标识以及所有(直接或间接)派生项。

Value Examples:

价值示例:

      null                          // legal identity name
      snmpUDPDomain                 // legal identity name
        
      null                          // legal identity name
      snmpUDPDomain                 // legal identity name
        

Restriction Examples:

限制示例:

Pointer (snmpTransportDomain) // legal restriction

指针(snmpTransportDomain)//法律限制

3.3. ObjectIdentifier
3.3. 目标识别器

The ObjectIdentifier base type represents administratively assigned names for use with SNMP and COPS-PR. This type SHOULD NOT be used in protocol independent SMIng modules. It is meant to be used in SNMP and COPS-PR mappings of attributes of type Pointer (Section 3.2).

ObjectIdentifier基类型表示用于SNMP和COPS-PR的管理分配名称。此类型不应在协议独立的SMIng模块中使用。它用于指针类型属性的SNMP和COPS-PR映射(第3.2节)。

Values of this type may be denoted as a sequence of numerical non-negative sub-identifier values in which each MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers may be denoted in decimal or `0x'- prefixed hexadecimal. They are separated by single dots and without any intermediate white space. Alternatively (and preferred in most cases), the first element may be a previously defined or imported lower-case identifier, representing a static object identifier prefix.

这种类型的值可以表示为数字非负子标识符值序列,其中每个值不得超过2^32-1(4294967295)。子标识符可以用十进制或“0x”前缀十六进制表示。它们由单点分隔,没有任何中间空白。或者(并且在大多数情况下优选),第一元素可以是先前定义或导入的小写标识符,表示静态对象标识符前缀。

Although the number of sub-identifiers in SMIng object identifiers is not limited, module designers should realize that there may be implementations that stick with the SMIv1/v2 limit of 128 sub-identifiers.

尽管SMIng对象标识符中的子标识符的数量不受限制,但模块设计者应该意识到,可能有一些实现遵守SMIv1/v2中128个子标识符的限制。

Object identifier derived types cannot be restricted in any way.

不能以任何方式限制对象标识符派生类型。

Value Examples:

价值示例:

      1.3.6.1                     // legal numerical oid
      mib-2.1                     // legal oid with identifier prefix
      internet.4.1.0x0627.0x01    // legal oid with hex subids
      iso.-1                      // illegal negative subid
      iso.org.6                   // illegal non-heading identifier
      IF-MIB::ifNumber.0          // legal fully qualified instance oid
        
      1.3.6.1                     // legal numerical oid
      mib-2.1                     // legal oid with identifier prefix
      internet.4.1.0x0627.0x01    // legal oid with hex subids
      iso.-1                      // illegal negative subid
      iso.org.6                   // illegal non-heading identifier
      IF-MIB::ifNumber.0          // legal fully qualified instance oid
        
3.4. Integer32
3.4. 整数32

The Integer32 base type represents integer values between -2^31 (-2147483648) and 2^31-1 (2147483647).

Integer32基类型表示介于-2^31(-2147483648)和2^31-1(2147483647)之间的整数值。

Values of type Integer32 may be denoted as decimal or hexadecimal numbers, where only decimal numbers can be negative. Decimal numbers other than zero MUST NOT have leading zero digits. Hexadecimal numbers are prefixed by `0x' and MUST have an even number of at least two hexadecimal digits, where letters MAY be upper-case, but lower-case characters are RECOMMENDED.

Integer32类型的值可以表示为十进制或十六进制数,其中只有十进制数可以为负数。除零以外的十进制数不得有前导零位。十六进制数字的前缀为“0x”,并且必须具有至少两个十六进制数字的偶数,其中字母可以是大写,但建议使用小写字符。

When defining a type derived (directly or indirectly) from the Integer32 base type, the set of possible values may be restricted by appending a list of ranges or explicit values, separated by pipe `|' characters, and the whole list enclosed in parenthesis. A range consists of a lower bound, two consecutive dots `..', and an upper bound. Each value can be given in decimal or `0x'-prefixed hexadecimal notation. Hexadecimal numbers must have an even number of at least two digits. If multiple values or ranges are given they all MUST be disjoint and MUST be in ascending order. If a value restriction is applied to an already restricted type, the new restriction MUST be equal or more limiting, that is raising the lower

定义从Integer32基类型派生(直接或间接)的类型时,可能的值集可能会受到限制,方法是附加一个范围或显式值列表,以管道`|字符分隔,并将整个列表括在括号中。范围由下限、两个连续点“..”和一个上限组成。每个值都可以用十进制或“0x”前缀的十六进制表示法给出。十六进制数必须至少有两位数的偶数。如果给定多个值或范围,则它们都必须是不相交的,并且必须按升序排列。如果将值限制应用于已受限制的类型,则新限制必须等于或大于限制,即提高下限

bounds, reducing the upper bounds, removing explicit values or ranges, or splitting ranges into multiple ranges with intermediate gaps.

边界,减少上界,删除显式值或范围,或将范围拆分为具有中间间隙的多个范围。

Value Examples:

价值示例:

      015                         // illegal leading zero
      -123                        // legal negative value
      - 1                         // illegal intermediate space
      0xabc                       // illegal hexadecimal value length
      -0xff                       // illegal sign on hex value
      0x80000000                  // illegal value, too large
      0xf00f                      // legal hexadecimal value
        
      015                         // illegal leading zero
      -123                        // legal negative value
      - 1                         // illegal intermediate space
      0xabc                       // illegal hexadecimal value length
      -0xff                       // illegal sign on hex value
      0x80000000                  // illegal value, too large
      0xf00f                      // legal hexadecimal value
        

Restriction Examples:

限制示例:

      Integer32 (0 | 5..10)       // legal range spec
      Integer32 (5..10 | 2..3)    // illegal ordering
      Integer32 (4..8 | 5..10)    // illegal overlapping
        
      Integer32 (0 | 5..10)       // legal range spec
      Integer32 (5..10 | 2..3)    // illegal ordering
      Integer32 (4..8 | 5..10)    // illegal overlapping
        
3.5. Integer64
3.5. 整数64

The Integer64 base type represents integer values between -2^63 (-9223372036854775808) and 2^63-1 (9223372036854775807).

Integer64基类型表示介于-2^63(-9223372036854775808)和2^63-1(9223372036854775807)之间的整数值。

Values of type Integer64 may be denoted as decimal or hexadecimal numbers, where only decimal numbers can be negative. Decimal numbers other than zero MUST NOT have leading zero digits. Hexadecimal numbers are prefixed by `0x' and MUST have an even number of hexadecimal digits, where letters MAY be upper-case, but lower-case characters are RECOMMENDED.

Integer64类型的值可以表示为十进制或十六进制数,其中只有十进制数可以为负数。除零以外的十进制数不得有前导零位。十六进制数字的前缀为“0x”,并且必须有偶数个十六进制数字,其中字母可以是大写,但建议使用小写字符。

When defining a type derived (directly or indirectly) from the Integer64 base type, the set of possible values may be restricted by appending a list of ranges or explicit values, separated by pipe `|' characters, with the whole list enclosed in parenthesis. A range consists of a lower bound, two consecutive dots `..', and an upper bound. Each value can be given in decimal or `0x'-prefixed hexadecimal notation. Hexadecimal numbers must have an even number of at least two digits. If multiple values or ranges are given, they all MUST be disjoint and MUST be in ascending order. If a value restriction is applied to an already restricted type, the new restriction MUST be equal or more limiting, that is raising the lower bounds, reducing the upper bounds, removing explicit values or ranges, or splitting ranges into multiple ranges with intermediate gaps.

定义从Integer64基类型派生(直接或间接)的类型时,可能的值集可能会受到限制,方法是附加一个范围或显式值列表,以管道“|”字符分隔,整个列表用括号括起来。范围由下限、两个连续点“..”和一个上限组成。每个值都可以用十进制或“0x”前缀的十六进制表示法给出。十六进制数必须至少有两位数的偶数。如果给定了多个值或范围,则它们都必须是不相交的,并且必须按升序排列。如果将值限制应用于已受限制的类型,则新限制必须等于或大于限制,即提高下限、降低上限、删除显式值或范围,或将范围拆分为具有中间间隙的多个范围。

Value Examples:

价值示例:

      015                         // illegal leading zero
      -123                        // legal negative value
      - 1                         // illegal intermediate space
      0xabc                       // illegal hexadecimal value length
      -0xff                       // illegal sign on hex value
      0x80000000                  // legal value
        
      015                         // illegal leading zero
      -123                        // legal negative value
      - 1                         // illegal intermediate space
      0xabc                       // illegal hexadecimal value length
      -0xff                       // illegal sign on hex value
      0x80000000                  // legal value
        

Restriction Examples:

限制示例:

      Integer64 (0 | 5..10)       // legal range spec
      Integer64 (5..10 | 2..3)    // illegal ordering
      Integer64 (4..8 | 5..10)    // illegal overlapping
        
      Integer64 (0 | 5..10)       // legal range spec
      Integer64 (5..10 | 2..3)    // illegal ordering
      Integer64 (4..8 | 5..10)    // illegal overlapping
        
3.6. Unsigned32
3.6. 未签名32

The Unsigned32 base type represents positive integer values between 0 and 2^32-1 (4294967295).

无符号32基类型表示介于0和2^32-1(4294967295)之间的正整数值。

Values of type Unsigned32 may be denoted as decimal or hexadecimal numbers. Decimal numbers other than zero MUST NOT have leading zero digits. Hexadecimal numbers are prefixed by `0x' and MUST have an even number of hexadecimal digits, where letters MAY be upper-case, but lower-case characters are RECOMMENDED.

Unsigned32类型的值可以表示为十进制或十六进制数。除零以外的十进制数不得有前导零位。十六进制数字的前缀为“0x”,并且必须有偶数个十六进制数字,其中字母可以是大写,但建议使用小写字符。

When defining a type derived (directly or indirectly) from the Unsigned32 base type, the set of possible values may be restricted by appending a list of ranges or explicit values, separated by pipe `|' characters, with the whole list enclosed in parenthesis. A range consists of a lower bound, two consecutive dots `..', and an upper bound. Each value can be given in decimal or `0x'-prefixed hexadecimal notation. Hexadecimal numbers must have an even number of at least two digits. If multiple values or ranges are given, they all MUST be disjoint and MUST be in ascending order. If a value restriction is applied to an already restricted type, the new restriction MUST be equal or more limiting, that is raising the lower bounds, reducing the upper bounds, removing explicit values or ranges, or splitting ranges into multiple ranges with intermediate gaps.

定义从Unsigned32基类型派生(直接或间接)的类型时,可能的值集可能会受到限制,方法是附加一个范围或显式值列表,以管道“|”字符分隔,整个列表用括号括起来。范围由下限、两个连续点“..”和一个上限组成。每个值都可以用十进制或“0x”前缀的十六进制表示法给出。十六进制数必须至少有两位数的偶数。如果给定了多个值或范围,则它们都必须是不相交的,并且必须按升序排列。如果将值限制应用于已受限制的类型,则新限制必须等于或大于限制,即提高下限、降低上限、删除显式值或范围,或将范围拆分为具有中间间隙的多个范围。

Value Examples:

价值示例:

      015                         // illegal leading zero
      -123                        // illegal negative value
      0xabc                       // illegal hexadecimal value length
      0x80000000                  // legal hexadecimal value
      0x8080000000                // illegal value, too large
        
      015                         // illegal leading zero
      -123                        // illegal negative value
      0xabc                       // illegal hexadecimal value length
      0x80000000                  // legal hexadecimal value
      0x8080000000                // illegal value, too large
        

Restriction Examples:

限制示例:

      Unsigned32 (0 | 5..10)       // legal range spec
      Unsigned32 (5..10 | 2..3)    // illegal ordering
      Unsigned32 (4..8 | 5..10)    // illegal overlapping
        
      Unsigned32 (0 | 5..10)       // legal range spec
      Unsigned32 (5..10 | 2..3)    // illegal ordering
      Unsigned32 (4..8 | 5..10)    // illegal overlapping
        
3.7. Unsigned64
3.7. 未签名64

The Unsigned64 base type represents positive integer values between 0 and 2^64-1 (18446744073709551615).

无符号64基类型表示介于0和2^64-1之间的正整数值(18446744073709551615)。

Values of type Unsigned64 may be denoted as decimal or hexadecimal numbers. Decimal numbers other than zero MUST NOT have leading zero digits. Hexadecimal numbers are prefixed by `0x' and MUST have an even number of hexadecimal digits, where letters MAY be upper-case, but lower-case characters are RECOMMENDED.

Unsigned64类型的值可以表示为十进制或十六进制数。除零以外的十进制数不得有前导零位。十六进制数字的前缀为“0x”,并且必须有偶数个十六进制数字,其中字母可以是大写,但建议使用小写字符。

When defining a type derived (directly or indirectly) from the Unsigned64 base type, the set of possible values may be restricted by appending a list of ranges or explicit values, separated by pipe `|' characters, with the whole list enclosed in parenthesis. A range consists of a lower bound, two consecutive dots `..', and an upper bound. Each value can be given in decimal or `0x'-prefixed hexadecimal notation. Hexadecimal numbers must have an even number of at least two digits. If multiple values or ranges are given, they all MUST be disjoint and MUST be in ascending order. If a value restriction is applied to an already restricted type, the new restriction MUST be equal or more limiting, that is raising the lower bounds, reducing the upper bounds, removing explicit values or ranges, or splitting ranges into multiple ranges with intermediate gaps.

定义从Unsigned64基类型派生(直接或间接)的类型时,可能的值集可能会受到限制,方法是附加一个范围或显式值列表,用管道`|字符分隔,整个列表用括号括起来。范围由下限、两个连续点“..”和一个上限组成。每个值都可以用十进制或“0x”前缀的十六进制表示法给出。十六进制数必须至少有两位数的偶数。如果给定了多个值或范围,则它们都必须是不相交的,并且必须按升序排列。如果将值限制应用于已受限制的类型,则新限制必须等于或大于限制,即提高下限、降低上限、删除显式值或范围,或将范围拆分为具有中间间隙的多个范围。

Value Examples:

价值示例:

      015                         // illegal leading zero
      -123                        // illegal negative value
      0xabc                       // illegal hexadecimal value length
      0x8080000000                // legal hexadecimal value
        
      015                         // illegal leading zero
      -123                        // illegal negative value
      0xabc                       // illegal hexadecimal value length
      0x8080000000                // legal hexadecimal value
        

Restriction Examples:

限制示例:

      Unsigned64 (1..10000000000) // legal range spec
      Unsigned64 (5..10 | 2..3)   // illegal ordering
        
      Unsigned64 (1..10000000000) // legal range spec
      Unsigned64 (5..10 | 2..3)   // illegal ordering
        
3.8. Float32
3.8. 浮动32

The Float32 base type represents floating point values of single precision as described by [IEEE754].

Float32基类型表示单精度浮点值,如[IEEE754]所述。

Values of type Float32 may be denoted as a decimal fraction with an optional exponent, as known from many programming languages. See the grammar rule `floatValue' of Appendix B for the detailed syntax. Special values are `snan' (signalling Not-a-Number), `qnan' (quiet Not-a-Number), `neginf' (negative infinity), and `posinf' (positive infinity). Note that -0.0 and +0.0 are different floating point values. 0.0 is equal to +0.0.

Float32类型的值可以表示为带可选指数的十进制分数,这在许多编程语言中都是已知的。有关详细语法,请参见附录B中的语法规则“floatValue”。特殊值为'snan'(信号非数字)、'qnan'(安静非数字)、'neginf'(负无限)和'posinf'(正无限)。请注意,-0.0和+0.0是不同的浮点值。0.0等于+0.0。

When defining a type derived (directly or indirectly) from the Float32 base type, the set of possible values may be restricted by appending a list of ranges or explicit values, separated by pipe `|' characters, with the whole list enclosed in parenthesis. A range consists of a lower bound, two consecutive dots `..', and an upper bound. If multiple values or ranges are given, they all MUST be disjoint and MUST be in ascending order. If a value restriction is applied to an already restricted type, the new restriction MUST be equal or more limiting, that is raising the lower bounds, reducing the upper bounds, removing explicit values or ranges, or splitting ranges into multiple ranges with intermediate gaps. The special values `snan', `qnan', `neginf', and `posinf' must be explicitly listed in restrictions if they shall be included, where `snan' and `qnan' cannot be used in ranges.

定义从Float32基类型派生(直接或间接)的类型时,可能的值集可能会受到限制,方法是附加一个范围或显式值列表,以管道“|”字符分隔,整个列表用括号括起来。范围由下限、两个连续点“..”和一个上限组成。如果给定了多个值或范围,则它们都必须是不相交的,并且必须按升序排列。如果将值限制应用于已受限制的类型,则新限制必须等于或大于限制,即提高下限、降低上限、删除显式值或范围,或将范围拆分为具有中间间隙的多个范围。特殊值'snan'、'qnan'、'neginf'和'posinf'如果应包括在内,则必须在限制中明确列出,其中'snan'和'qnan'不能在范围内使用。

Note that encoding is not subject to this specification. It has to be described by protocols that transport objects of type Float32. Note also that most floating point encodings disallow the representation of many values that can be written as decimal fractions as used in SMIng for human readability. Therefore, explicit values in floating point type restrictions should be handled with care.

请注意,编码不受本规范的约束。它必须由传输Float32类型对象的协议来描述。还要注意的是,大多数浮点编码都不允许将许多值表示为十进制小数,这在SMIng中用于提高人类可读性。因此,应小心处理浮点类型限制中的显式值。

Value Examples:

价值示例:

      00.1                       // illegal leading zero
      3.1415                     // legal value
      -2.5E+3                    // legal negative exponential value
        
      00.1                       // illegal leading zero
      3.1415                     // legal value
      -2.5E+3                    // legal negative exponential value
        

Restriction Examples:

限制示例:

      Float32 (-1.0..1.0)        // legal range spec
      Float32 (1 | 3.3 | 5)      // legal, probably unrepresentable 3.3
      Float32 (neginf..-0.0)     // legal range spec
      Float32 (-10.0..10.0 | 0)  // illegal overlapping
        
      Float32 (-1.0..1.0)        // legal range spec
      Float32 (1 | 3.3 | 5)      // legal, probably unrepresentable 3.3
      Float32 (neginf..-0.0)     // legal range spec
      Float32 (-10.0..10.0 | 0)  // illegal overlapping
        
3.9. Float64
3.9. 浮动64

The Float64 base type represents floating point values of double precision as described by [IEEE754].

Float64基类型表示双精度浮点值,如[IEEE754]所述。

Values of type Float64 may be denoted as a decimal fraction with an optional exponent, as known from many programming languages. See the grammar rule `floatValue' of Appendix B for the detailed syntax. Special values are `snan' (signalling Not-a-Number), `qnan' (quiet Not-a-Number), `neginf' (negative infinity), and `posinf' (positive infinity). Note that -0.0 and +0.0 are different floating point values. 0.0 is equal to +0.0.

Float64类型的值可以表示为带可选指数的十进制分数,这在许多编程语言中都是已知的。有关详细语法,请参见附录B中的语法规则“floatValue”。特殊值为'snan'(信号非数字)、'qnan'(安静非数字)、'neginf'(负无限)和'posinf'(正无限)。请注意,-0.0和+0.0是不同的浮点值。0.0等于+0.0。

When defining a type derived (directly or indirectly) from the Float64 base type, the set of possible values may be restricted by appending a list of ranges or explicit values, separated by pipe `|' characters, with the whole list enclosed in parenthesis. A range consists of a lower bound, two consecutive dots `..', and an upper bound. If multiple values or ranges are given, they all MUST be disjoint and MUST be in ascending order. If a value restriction is applied to an already restricted type, the new restriction MUST be equal or more limiting, that is raising the lower bounds, reducing the upper bounds, removing explicit values or ranges, or splitting ranges into multiple ranges with intermediate gaps. The special values `snan', `qnan', `neginf', and `posinf' must be explicitly listed in restrictions if they shall be included, where `snan' and `qnan' cannot be used in ranges.

定义从Float64基类型派生(直接或间接)的类型时,可能的值集可能会受到限制,方法是附加一个范围或显式值列表,以管道“|”字符分隔,整个列表用括号括起来。范围由下限、两个连续点“..”和一个上限组成。如果给定了多个值或范围,则它们都必须是不相交的,并且必须按升序排列。如果将值限制应用于已受限制的类型,则新限制必须等于或大于限制,即提高下限、降低上限、删除显式值或范围,或将范围拆分为具有中间间隙的多个范围。特殊值'snan'、'qnan'、'neginf'和'posinf'如果应包括在内,则必须在限制中明确列出,其中'snan'和'qnan'不能在范围内使用。

Note that encoding is not subject to this specification. It has to be described by protocols that transport objects of type Float64. Note also that most floating point encodings disallow the representation of many values that can be written as decimal fractions as used in SMIng for human readability. Therefore, explicit values in floating point type restrictions should be handled with care.

请注意,编码不受本规范的约束。它必须由传输Float64类型对象的协议来描述。还要注意的是,大多数浮点编码都不允许将许多值表示为十进制小数,这在SMIng中用于提高人类可读性。因此,应小心处理浮点类型限制中的显式值。

Value Examples:

价值示例:

      00.1                       // illegal leading zero
      3.1415                     // legal value
      -2.5E+3                    // legal negative exponential value
        
      00.1                       // illegal leading zero
      3.1415                     // legal value
      -2.5E+3                    // legal negative exponential value
        

Restriction Examples:

限制示例:

      Float64 (-1.0..1.0)        // legal range spec
      Float64 (1 | 3.3 | 5)      // legal, probably unrepresentable 3.3
      Float64 (neginf..-0.0)     // legal range spec
      Float64 (-10.0..10.0 | 0)  // illegal overlapping
        
      Float64 (-1.0..1.0)        // legal range spec
      Float64 (1 | 3.3 | 5)      // legal, probably unrepresentable 3.3
      Float64 (neginf..-0.0)     // legal range spec
      Float64 (-10.0..10.0 | 0)  // illegal overlapping
        
3.10. Float128
3.10. 浮动128

The Float128 base type represents floating point values of quadruple precision as described by [IEEE754].

Float128基类型表示[IEEE754]所述的四倍精度的浮点值。

Values of type Float128 may be denoted as a decimal fraction with an optional exponent, as known from many programming languages. See the grammar rule `floatValue' of Appendix B for the detailed syntax. Special values are `snan' (signalling Not-a-Number), `qnan' (quiet Not-a-Number), `neginf' (negative infinity), and `posinf' (positive infinity). Note that -0.0 and +0.0 are different floating point values. 0.0 is equal to +0.0.

Float128类型的值可以表示为带可选指数的十进制分数,这在许多编程语言中都是已知的。有关详细语法,请参见附录B中的语法规则“floatValue”。特殊值为'snan'(信号非数字)、'qnan'(安静非数字)、'neginf'(负无限)和'posinf'(正无限)。请注意,-0.0和+0.0是不同的浮点值。0.0等于+0.0。

When defining a type derived (directly or indirectly) from the Float128 base type, the set of possible values may be restricted by appending a list of ranges or explicit values, separated by pipe `|' characters, with the whole list enclosed in parenthesis. A range consists of a lower bound, two consecutive dots `..', and an upper bound. If multiple values or ranges are given, they all MUST be disjoint and MUST be in ascending order. If a value restriction is applied to an already restricted type, the new restriction MUST be equal or more limiting, that is raising the lower bounds, reducing the upper bounds, removing explicit values or ranges, or splitting ranges into multiple ranges with intermediate gaps. The special values `snan', `qnan', `neginf', and `posinf' must be explicitly listed in restrictions if they shall be included, where `snan' and `qnan' cannot be used in ranges.

定义从Float128基类型派生(直接或间接)的类型时,可能的值集可能会受到限制,方法是附加一个范围或显式值列表,以管道“|”字符分隔,整个列表用括号括起来。范围由下限、两个连续点“..”和一个上限组成。如果给定了多个值或范围,则它们都必须是不相交的,并且必须按升序排列。如果将值限制应用于已受限制的类型,则新限制必须等于或大于限制,即提高下限、降低上限、删除显式值或范围,或将范围拆分为具有中间间隙的多个范围。特殊值'snan'、'qnan'、'neginf'和'posinf'如果应包括在内,则必须在限制中明确列出,其中'snan'和'qnan'不能在范围内使用。

Note that encoding is not subject to this specification. It has to be described by protocols that transport objects of type Float128. Note also that most floating point encodings disallow the representation of many values that can be written as decimal fractions as used in SMIng for human readability. Therefore, explicit values in floating point type restrictions should be handled with care.

请注意,编码不受本规范的约束。它必须由传输Float128类型对象的协议来描述。还要注意的是,大多数浮点编码都不允许将许多值表示为十进制小数,这在SMIng中用于提高人类可读性。因此,应小心处理浮点类型限制中的显式值。

Value Examples:

价值示例:

      00.1                       // illegal leading zero
      3.1415                     // legal value
      -2.5E+3                    // legal negative exponential value
        
      00.1                       // illegal leading zero
      3.1415                     // legal value
      -2.5E+3                    // legal negative exponential value
        

Restriction Examples:

限制示例:

      Float128 (-1.0..1.0)        // legal range spec
      Float128 (1 | 3.3 | 5)      // legal, probably unrepresentable 3.3
      Float128 (neginf..-0.0)     // legal range spec
      Float128 (-10.0..10.0 | 0)  // illegal overlapping
        
      Float128 (-1.0..1.0)        // legal range spec
      Float128 (1 | 3.3 | 5)      // legal, probably unrepresentable 3.3
      Float128 (neginf..-0.0)     // legal range spec
      Float128 (-10.0..10.0 | 0)  // illegal overlapping
        
3.11. Enumeration
3.11. 列举

The Enumeration base type represents values from a set of integers in the range between -2^31 (-2147483648) and 2^31-1 (2147483647), where each value has an assigned name. The list of those named numbers has to be comma-separated, enclosed in parenthesis, and appended to the `Enumeration' keyword. Each named number is denoted by its lower-case identifier followed by the assigned integer value, denoted as a decimal or `0x'-prefixed hexadecimal number, enclosed in parenthesis. Hexadecimal numbers must have an even number of at least two digits. Every name and every number in an enumeration type MUST be unique. It is RECOMMENDED that values be positive, start at 1, and be numbered contiguously. All named numbers MUST be given in ascending order.

枚举基类型表示一组介于-2^31(-2147483648)和2^31-1(2147483647)之间的整数中的值,其中每个值都有一个指定的名称。这些命名数字的列表必须用逗号分隔,用括号括起来,并附加在“枚举”关键字后面。每个命名的数字由其小写标识符表示,后跟指定的整数值,表示为十进制或“0x”-前缀十六进制数,用括号括起来。十六进制数必须至少有两位数的偶数。枚举类型中的每个名称和每个数字都必须是唯一的。建议值为正数,从1开始,并连续编号。所有命名的数字必须按升序排列。

Values of enumeration types may be denoted as decimal or `0x'- prefixed hexadecimal numbers or preferably as their assigned names. Hexadecimal numbers must have an even number of at least two digits.

枚举类型的值可以表示为十进制或带有“0x”前缀的十六进制数,或者最好表示为其分配的名称。十六进制数必须至少有两位数的偶数。

When types are derived (directly or indirectly) from an enumeration type, the set of named numbers may be equal or restricted by removing one or more named numbers, but no named numbers may be added or changed regarding its name, value, or both.

当类型(直接或间接)从枚举类型派生时,可以通过删除一个或多个命名数字来相等或限制命名数字集,但不能添加或更改有关其名称、值或两者的命名数字。

Type and Value Examples:

类型和值示例:

   Enumeration (up(1), down(2), testing(3))
   Enumeration (down(2), up(1)) // illegal order
        
   Enumeration (up(1), down(2), testing(3))
   Enumeration (down(2), up(1)) // illegal order
        
   0                            // legal (though not recommended) value
   up                           // legal value given by name
   2                            // legal value given by number
        
   0                            // legal (though not recommended) value
   up                           // legal value given by name
   2                            // legal value given by number
        
3.12. Bits
3.12. 位

The Bits base type represents bit sets. That is, a Bits value is a set of flags identified by small integer numbers starting at 0. Each bit number has an assigned name. The list of those named numbers has to be comma-separated, enclosed in parenthesis, and appended to the `Bits' keyword. Each named number is denoted by its lower-case identifier followed by the assigned integer value, denoted as a decimal or `0x'-prefixed hexadecimal number, enclosed in parenthesis. Hexadecimal numbers must have an even number of at least two digits. Every name and every number in a bits type MUST be unique. It is RECOMMENDED that numbers start at 0 and be numbered contiguously. Negative numbers are forbidden. All named numbers MUST be given in ascending order.

Bits基类型表示位集。也就是说,位值是由从0开始的小整数标识的一组标志。每个位号都有一个指定的名称。这些命名数字的列表必须用逗号分隔,用括号括起来,并附加在“Bits”关键字后面。每个命名的数字由其小写标识符表示,后跟指定的整数值,表示为十进制或“0x”-前缀十六进制数,用括号括起来。十六进制数必须至少有两位数的偶数。bits类型中的每个名称和每个数字都必须是唯一的。建议数字从0开始,并连续编号。负数是禁止的。所有命名的数字必须按升序排列。

Values of bits types may be denoted as a comma-separated list of decimal or `0x'-prefixed hexadecimal numbers or preferably their assigned names enclosed in parenthesis. Hexadecimal numbers must have an even number of at least two digits. There MUST NOT be any element (by name or number) listed more than once. Elements MUST be listed in ascending order.

位类型的值可以表示为以逗号分隔的十进制或“0x”前缀的十六进制数列表,或者最好用括号括起它们的指定名称。十六进制数必须至少有两位数的偶数。任何元素(按名称或编号)不得多次列出。元素必须按升序列出。

When defining a type derived (directly or indirectly) from a bits type, the set of named numbers may be restricted by removing one or more named numbers, but no named numbers may be added or changed regarding its name, value, or both.

定义从bits类型派生(直接或间接)的类型时,可通过删除一个或多个命名数字来限制命名数字集,但不得添加或更改有关其名称、值或两者的命名数字。

Type and Value Examples:

类型和值示例:

      Bits (readable(0), writable(1), executable(2))
      Bits (writable(1), readable(0) // illegal order
        
      Bits (readable(0), writable(1), executable(2))
      Bits (writable(1), readable(0) // illegal order
        
      ()                          // legal empty value
      (readable, writable, 2)     // legal value
      (0, readable, executable)   // illegal, readable(0) appears twice
      (writable, 4)               // illegal, element 4 out of range
        
      ()                          // legal empty value
      (readable, writable, 2)     // legal value
      (0, readable, executable)   // illegal, readable(0) appears twice
      (writable, 4)               // illegal, element 4 out of range
        
3.13. Display Formats
3.13. 显示格式

Attribute and type definitions allow the specification of a format to be used when a value of that attribute or an attribute of that type is displayed. Format specifications are represented as textual data.

属性和类型定义允许在显示该属性或该类型属性的值时使用格式规范。格式规范表示为文本数据。

When the attribute or type has an underlying base type of Integer32, Integer64, Unsigned32, or Unsigned64, the format consists of an integer-format specification containing two parts. The first part is a single character suggesting a display format, either: `x' for hexadecimal, `d' for decimal, `o' for octal, or `b' for binary. For all types, when rendering the value, leading zeros are omitted, and for negative values, a minus sign is rendered immediately before the digits. The second part is always omitted for `x', `o', and `b', and need not be present for `d'. If present, the second part starts with a hyphen and is followed by a decimal number, which defines the implied decimal point when rendering the value. For example `d-2' suggests that a value of 1234 be rendered as `12.34'.

当属性或类型的基础基类型为Integer32、Integer64、Unsigned32或Unsigned64时,该格式由包含两部分的整数格式规范组成。第一部分是表示显示格式的单个字符:十六进制为'x',十进制为'd',八进制为'o',二进制为'b'。对于所有类型,在呈现值时,前导零将被忽略,对于负值,负号将在数字之前呈现。第二部分对于'x'、'o'和'b'总是被省略,并且对于'd'不必出现。如果存在,则第二部分以连字符开头,后面是一个十进制数,它定义了呈现值时隐含的小数点。例如,“d-2”建议将1234的值表示为“12.34”。

When the attribute or type has an underlying base type of OctetString, the format consists of one or more octet-format specifications. Each specification consists of five parts, with each part using and removing zero or more of the next octets from the

当属性或类型的基础基类型为OctetString时,格式由一个或多个octet格式规范组成。每个规范由五个部分组成,每个部分使用并删除下一个八位字节中的零个或多个

value and producing the next zero or more characters to be displayed. The octets within the value are processed in order of significance, most significant first.

值并生成下一个要显示的零个或多个字符。值内的八位字节按显著性顺序处理,最显著的排在第一位。

The five parts of a octet-format specification are:

八位字节格式规范的五个部分是:

1. The (optional) repeat indicator. If present, this part is a `*', and indicates that the current octet of the value is to be used as the repeat count. The repeat count is an unsigned integer (which may be zero) specifying how many times the remainder of this octet-format specification should be successively applied. If the repeat indicator is not present, the repeat count is one.

1. (可选)重复指示器。如果存在,则此部分为“*”,并指示值的当前八位字节将用作重复计数。重复计数是一个无符号整数(可以是零),指定应连续应用此八位字节格式规范剩余部分的次数。如果重复指示器不存在,则重复计数为1。

2. The octet length: one or more decimal digits specifying the number of octets of the value to be used and formatted by this octet-specification. Note that the octet length can be zero. If less than this number of octets remain in the value, then the lesser number of octets are used.

2. 八位字节长度:一个或多个十进制数字,指定要使用的值的八位字节数,并按此八位字节规范进行格式化。请注意,八位字节长度可以为零。如果值中保留的八位字节数少于此数,则使用较少的八位字节数。

3. The display format, either: `x' for hexadecimal, `d' for decimal, `o' for octal, `a' for ASCII, or `t' for UTF-8 [RFC3629]. If the octet length part is greater than one, and the display format part refers to a numeric format, then network byte-ordering (big-endian encoding) is used to interpret the octets in the value. The octets processed by the `t' display format do not necessarily form an integral number of UTF-8 characters. Trailing octets which do not form a valid UTF-8 encoded character are discarded.

3. 显示格式为:十六进制为'x',十进制为'd',八进制为'o',ASCII为'a',UTF-8为't'。[RFC3629]。如果八位字节长度部分大于1,且显示格式部分指的是数字格式,则使用网络字节排序(big-endian编码)来解释值中的八位字节。“t”显示格式处理的八位字节不一定构成整数个UTF-8字符。不构成有效UTF-8编码字符的尾随八位字节将被丢弃。

4. The (optional) display separator character. If present, this part is a single character produced for display after each application of this octet-specification; however, this character is not produced for display if it would be immediately followed by the display of the repeat terminator character for this octet specification. This character can be any character other than a decimal digit and a `*'.

4. (可选)显示分隔符字符。如果存在,则该部分是在每次应用本八位字节规范后产生的用于显示的单个字符;但是,如果该字符后面紧接着显示该八位字节规范的重复终止符字符,则不会生成该字符进行显示。此字符可以是除十进制数字和“*”以外的任何字符。

5. The (optional) repeat terminator character, which can be present only if the display separator character is present and this octet specification begins with a repeat indicator. If present, this part is a single character produced after all the zero or more repeated applications (as given by the repeat count) of this octet specification. This character can be any character other than a decimal digit and a `*'.

5. (可选)重复终止符字符,仅当显示分隔符字符存在且此八位字节规范以重复指示符开始时,该字符才能出现。如果存在,则该部分是在该八位字节规范的所有零次或多次重复应用(如重复计数所示)之后生成的单个字符。此字符可以是除十进制数字和“*”以外的任何字符。

Output of a display separator character or a repeat terminator character is suppressed if it would occur as the last character of the display.

如果显示分隔符字符或重复终止符字符将作为显示的最后一个字符出现,则会抑制其输出。

If the octets of the value are exhausted before all the octet format specifications have been used, then the excess specifications are ignored. If additional octets remain in the value after interpreting all the octet format specifications, then the last octet format specification is re-interpreted to process the additional octets, until no octets remain in the value.

如果在使用所有八位字节格式规范之前耗尽了值的八位字节,则忽略多余的规范。如果在解释所有八位字节格式规范后,值中仍保留其他八位字节,则将重新解释最后一个八位字节格式规范,以处理其他八位字节,直到值中不保留任何八位字节。

Note that for some types, no format specifications are defined. For derived types and attributes that are based on such types, format specifications SHOULD be omitted. Implementations MUST ignore format specifications they cannot interpret. Also note that the SMIng grammar (Appendix B) does not specify the syntax of format specifications.

请注意,对于某些类型,没有定义格式规范。对于基于此类类型的派生类型和属性,应省略格式规范。实现必须忽略它们无法解释的格式规范。还要注意,SMIng语法(附录B)没有指定格式规范的语法。

Display Format Examples:

显示格式示例:

      Base Type   Format              Example Value    Rendered Value
      ----------- ------------------- ---------------- -----------------
      OctetString 255a                "Hello World."   Hello World.
      OctetString 1x:                 "Hello!"         48:65:6c:6c:6f:21
      OctetString 1d:1d:1d.1d,1a1d:1d 0x0d1e0f002d0400 13:30:15.0,-4:0
      OctetString 1d.1d.1d.1d/2d      0x0a0000010400   10.0.0.1/1024
      OctetString *1x:/1x:            0x02aabbccddee   aa:bb/cc:dd:ee
      Integer32   d-2                 1234             12.34
        
      Base Type   Format              Example Value    Rendered Value
      ----------- ------------------- ---------------- -----------------
      OctetString 255a                "Hello World."   Hello World.
      OctetString 1x:                 "Hello!"         48:65:6c:6c:6f:21
      OctetString 1d:1d:1d.1d,1a1d:1d 0x0d1e0f002d0400 13:30:15.0,-4:0
      OctetString 1d.1d.1d.1d/2d      0x0a0000010400   10.0.0.1/1024
      OctetString *1x:/1x:            0x02aabbccddee   aa:bb/cc:dd:ee
      Integer32   d-2                 1234             12.34
        
4. The SMIng File Structure
4. SMIng文件结构

The topmost container of SMIng information is a file. An SMIng file may contain zero, one or more modules. It is RECOMMENDED that modules be stored into separate files by their module names, where possible. However, for dedicated purposes, it may be reasonable to collect several modules in a single file.

SMIng信息的最上面的容器是一个文件。SMIng文件可能包含零个、一个或多个模块。建议尽可能按模块名称将模块存储到单独的文件中。但是,出于专用目的,在一个文件中收集多个模块可能是合理的。

The top level SMIng construct is the `module' statement (Section 5) that defines a single SMIng module. A module contains a sequence of sections in an obligatory order with different kinds of definitions. Whether these sections contain statements or remain empty mainly depends on the purpose of the module.

顶级SMIng构造是定义单个SMIng模块的“module”语句(第5节)。模块包含一系列具有不同类型定义的强制顺序的部分。这些部分是包含语句还是保持为空主要取决于模块的用途。

4.1. Comments
4.1. 评论

Comments can be included at any position in an SMIng file, except between the characters of a single token like those of a quoted string. However, it is RECOMMENDED that all substantive descriptions be placed within an appropriate description clause, so that the information is available to SMIng parsers.

注释可以包含在SMIng文件中的任何位置,除了单个标记的字符之间,比如带引号的字符串。但是,建议将所有实质性描述放在适当的description子句中,以便SMIng解析器可以使用这些信息。

Comments commence with a pair of adjacent slashes `//' and end at the end of the line.

注释以一对相邻的斜杠“/”开始,并在行的末尾结束。

4.2. Textual Data
4.2. 文本数据

Some statements, namely `organization', `contact', `description', `reference', `abnf', `format', and `units', get a textual argument. This text, as well as representations of OctetString values, have to be enclosed in double quotes. They may contain arbitrary characters with the following exceptional encoding rules:

有些语句,即'organization'、'contact'、'description'、'reference'、'abnf'、'format'和'units',得到一个文本参数。此文本以及八进制字符串值的表示形式必须用双引号括起来。它们可能包含具有以下异常编码规则的任意字符:

A backslash character introduces a special character, which depends on the character that immediately follows the backslash:

反斜杠字符引入一个特殊字符,该字符取决于紧跟在反斜杠后面的字符:

\n new line \t a tab character \" a double quote \\ a single backslash

\n新行\t制表符\“双引号\\单反斜杠”

If the text contains a line break followed by whitespace which is used to indent the text according to the layout in the SMIng file, this prefixing whitespace is stripped from the text.

如果文本包含一个换行符,后跟空格,用于根据SMIng文件中的布局缩进文本,则此前缀空格将从文本中删除。

4.3. Statements and Arguments
4.3. 陈述和论点

SMIng has a very small set of basic grammar rules based on the concept of statements. Each statement starts with a lower-case keyword identifying the statement, followed by a number (possibly zero) of arguments. An argument may be quoted text, an identifier, a value of any base type, a list of identifiers enclosed in parenthesis `( )', or a statement block enclosed in curly braces `{ }'. Since statement blocks are valid arguments, it is possible to nest statement sequences. Each statement is terminated by a semicolon `;'.

SMIng有一组非常小的基于语句概念的基本语法规则。每个语句都以一个小写关键字开始,该关键字标识该语句,后跟若干个参数(可能为零)。参数可以是带引号的文本、标识符、任何基类型的值、括号“()”中包含的标识符列表或大括号“{}”中包含的语句块。由于语句块是有效参数,所以可以嵌套语句序列。每条语句都以分号“;”结尾。

The core set of statements may be extended using the SMIng `extension' statement. See Sections 6 and 11 for details.

核心语句集可以使用SMIng“extension”语句进行扩展。详见第6节和第11节。

At places where a statement is expected, but an unknown lower-case word is read, those statements MUST be skipped up to the proper semicolon, including nested statement blocks.

在需要语句但读取未知小写字的位置,必须将这些语句跳过到正确的分号,包括嵌套语句块。

5. The module Statement
5. 模块语句

The `module' statement is used as a container of all definitions of a single SMIng module. It gets two arguments: an upper-case module name and a statement block that contains mandatory and optional statements and sections of statements in an obligatory order:

“module”语句用作单个SMIng模块的所有定义的容器。它获取两个参数:一个大写模块名和一个语句块,其中包含强制和可选语句以及按强制顺序排列的语句节:

         module <MODULE-NAME> {
        
         module <MODULE-NAME> {
        
             <optional import statements>
             <organization statement>
             <contact statement>
             <description statement>
             <optional reference statement>
             <at least one revision statement>
        
             <optional import statements>
             <organization statement>
             <contact statement>
             <description statement>
             <optional reference statement>
             <at least one revision statement>
        

<optional extension statements>

<可选扩展语句>

<optional typedef statements>

<optional typedef语句>

<optional identity statements>

<可选身份声明>

<optional class statements>

<可选类语句>

};

};

The optional `import' statements (Section 5.1) are followed by the mandatory `organization' (Section 5.2), `contact' (Section 5.3), and `description' (Section 5.4) statements and the optional `reference' statement (Section 5.5), which in turn are followed by at least one mandatory `revision' statement (Section 5.6). The part up to this point defines the module's meta information, i.e., information that describes the whole module but does not define any items used by applications in the first instance. This part of a module is followed by its main definitions, namely SMIng extensions (Section 6), derived types (Section 7), identities (Section 8), and classes (Section 9).

可选的“导入”语句(第5.1节)后接强制性的“组织”(第5.2节)、“联系”(第5.3节)和“说明”(第5.4节)语句以及可选的“参考”语句(第5.5节),而后接至少一个强制性的“修订”语句(第5.6节)。到目前为止,该部分定义了模块的元信息,即描述整个模块但不定义应用程序在第一个实例中使用的任何项的信息。模块的这一部分后面是它的主要定义,即SMIng扩展(第6节)、派生类型(第7节)、标识(第8节)和类(第9节)。

See the `moduleStatement' rule of the SMIng grammar (Appendix B) for the formal syntax of the `module' statement.

有关“module”语句的形式语法,请参见SMIng语法的“moduleStatement”规则(附录B)。

5.1. The module's import Statement
5.1. 模块的导入语句

The optional module's `import' statement is used to import identifiers from external modules into the local module's namespace. It gets two arguments: the name of the external module and a comma-separated list of one or more identifiers to be imported enclosed in parenthesis.

可选模块的“import”语句用于将标识符从外部模块导入本地模块的命名空间。它获取两个参数:外部模块的名称和一个逗号分隔的列表,该列表包含一个或多个要导入的标识符,并用括号括起来。

Multiple `import' statements for the same module but with disjoint lists of identifiers are allowed, though NOT RECOMMENDED. The same identifier from the same module MUST NOT be imported multiple times. To import identifiers with the same name from different modules might be necessary and is allowed. To distinguish

允许对同一模块使用多个“import”语句,但这些语句具有不相交的标识符列表,但不建议这样做。同一模块中的同一标识符不得多次导入。可能需要并且允许从不同模块导入具有相同名称的标识符。辨别

them in the local module, they have to be referred by qualified names. Importing identifiers not used in the local module is NOT RECOMMENDED.

在本地模块中,它们必须由限定名称引用。不建议导入本地模块中未使用的标识符。

See the `importStatement' rule of the SMIng grammar (Appendix B) for the formal syntax of the `import' statement.

有关“import”语句的形式语法,请参见SMIng语法的“importStatement”规则(附录B)。

5.2. The module's organization Statement
5.2. 模块的组织声明

The module's `organization' statement, which must be present, gets one argument which is used to specify a textual description of the organization(s) under whose auspices this module was developed.

模块的“organization”语句(必须存在)获取一个参数,该参数用于指定开发此模块所依据的组织的文本描述。

5.3. The module's contact Statement
5.3. 模块的联系声明

The module's `contact' statement, which must be present, gets one argument which is used to specify the name, postal address, telephone number, and electronic mail address of the person to whom technical queries concerning this module should be sent.

模块的“联系人”声明必须存在,其中有一个参数用于指定应向其发送有关此模块的技术查询的人员的姓名、邮政地址、电话号码和电子邮件地址。

5.4. The module's description Statement
5.4. 模块的描述语句

The module's `description' statement, which must be present, gets one argument which is used to specify a high-level textual description of the contents of this module.

模块的“description”语句(必须存在)获取一个参数,该参数用于指定此模块内容的高级文本描述。

5.5. The module's reference Statement
5.5. 模块的引用语句

The module's `reference' statement, which need not be present, gets one argument which is used to specify a textual cross-reference to some other document, either another module which defines related management information, or some other document which provides additional information relevant to this module.

模块的“reference”语句(不需要存在)获取一个参数,该参数用于指定对某些其他文档的文本交叉引用,或者是定义相关管理信息的另一个模块,或者是提供与此模块相关的其他信息的某个文档。

5.6. The module's revision Statement
5.6. 模块的修订声明

The module's `revision' statement is repeatedly used to specify the editorial revisions of the module, including the initial revision. It gets one argument which is a statement block that holds detailed information in an obligatory order. A module MUST have at least one initial `revision' statement. For every editorial change, a new one MUST be added in front of the revisions sequence, so that all revisions are in reverse chronological order.

模块的“修订”声明反复用于指定模块的编辑修订,包括初始修订。它得到一个参数,它是一个语句块,按强制顺序保存详细信息。模块必须至少有一个初始“修订”语句。对于每个编辑性修改,必须在修订顺序之前添加一个新的修订,以便所有修订都按相反的时间顺序进行。

See the `revisionStatement' rule of the SMIng grammar (Appendix B) for the formal syntax of the `revision' statement.

有关“修订”语句的正式语法,请参见SMIng语法的“修订”语句规则(附录B)。

5.6.1. The revision's date Statement
5.6.1. 修订日期声明

The revision's `date' statement, which must be present, gets one argument which is used to specify the date and time of the revision in the format `YYYY-MM-DD HH:MM' or `YYYY-MM-DD' which implies the time `00:00'. The time is always given in UTC.

修订的'date'语句必须存在,它获取一个参数,用于指定修订的日期和时间,格式为'YYYY-MM-DD HH:MM'或'YYYY-MM-DD',表示时间'00:00'。时间总是以UTC表示。

See the `date' rule of the SMIng grammar (Appendix B) for the formal syntax of the revision's `date' statement.

有关修订版“日期”声明的正式语法,请参见SMIng语法的“日期”规则(附录B)。

5.6.2. The revision's description Statement
5.6.2. 修订版的说明声明

The revision's `description' statement, which must be present, gets one argument which is used to specify a high-level textual description of the revision.

修订版的“description”语句(必须存在)获取一个参数,该参数用于指定修订版的高级文本描述。

5.7. Usage Example
5.7. 用法示例

Consider how a skeletal module might be constructed:

考虑如何构造骨架模块:

module ACME-MIB {

模块ACME-MIB{

import NMRG-SMING (DisplayString);

导入NMRG-SMING(显示字符串);

organization "IRTF Network Management Research Group (NMRG)";

组织“IRTF网络管理研究小组(NMRG)”;

     contact   "IRTF Network Management Research Group (NMRG)
                http://www.ibr.cs.tu-bs.de/projects/nmrg/
        
     contact   "IRTF Network Management Research Group (NMRG)
                http://www.ibr.cs.tu-bs.de/projects/nmrg/
        

Joe L. User

乔·L·用户

ACME, Inc. 42 Anywhere Drive Nowhere, CA 95134 USA

ACME,Inc.42 Anywhere Drive Nowhere,加利福尼亚州95134美国

                Phone: +1 800 555 0815
                EMail: joe@acme.example.com";
        
                Phone: +1 800 555 0815
                EMail: joe@acme.example.com";
        

description "The module for entities implementing the ACME protocol.

描述“用于实现ACME协议的实体的模块。

Copyright (C) The Internet Society (2004). All Rights Reserved. This version of this MIB module is part of RFC 3780, see the RFC itself for legal notices.";

版权所有(C)互联网协会(2004年)。版权所有。此MIB模块的此版本是RFC 3780的一部分,有关法律通知,请参阅RFC本身。“;

     revision {
       date            "2003-12-16";
       description
               "Initial revision, published as RFC 3780.";
     };
        
     revision {
       date            "2003-12-16";
       description
               "Initial revision, published as RFC 3780.";
     };
        

// ... further definitions ...

// ... 进一步的定义。。。

}; // end of module ACME-MIB.

}; // 模块ACME-MIB结束。

6. The extension Statement
6. 扩展语句

The `extension' statement defines new statements to be used in the local module following this extension statement definition or in external modules that may import this extension statement definition. The `extension' statement gets two arguments: a lower-case extension statement identifier and a statement block that holds detailed extension information in an obligatory order.

“extension”语句定义了要在遵循此扩展语句定义的本地模块或可能导入此扩展语句定义的外部模块中使用的新语句。“extension”语句获得两个参数:小写扩展语句标识符和按强制顺序保存详细扩展信息的语句块。

Extension statement identifiers SHOULD NOT contain any upper-case characters.

扩展语句标识符不应包含任何大写字符。

Note that the SMIng extension feature does not allow the formal specification of the context, or argument syntax and semantics of an extension. Its only purpose is to declare the existence of an extension and to allow a unique reference to an extension. See Section 11 for detailed information on extensions and [RFC3781] for mappings of SMIng definitions to SNMP, which is formally defined as an extension.

请注意,SMIng扩展特性不允许上下文的正式规范,也不允许扩展的参数语法和语义。它的唯一目的是声明扩展的存在并允许对扩展的唯一引用。有关扩展的详细信息,请参见第11节;有关SMIng定义到SNMP(正式定义为扩展)的映射,请参见[RFC3781]。

See the `extensionStatement' rule of the SMIng grammar (Appendix B) for the formal syntax of the `extension' statement.

有关“extension”语句的形式语法,请参见SMIng语法的“extensionStatement”规则(附录B)。

6.1. The extension's status Statement
6.1. 扩展的状态语句

The extension's `status' statement, which must be present, gets one argument which is used to specify whether this extension definition is current or historic. The value `current' means that the definition is current and valid. The value `obsolete' means the definition is obsolete and should not be implemented and/or can be removed if previously implemented. While the value `deprecated' also indicates an obsolete definition, it permits new/continued implementation in order to foster interoperability with older/ existing implementations.

扩展的“status”语句(必须存在)获取一个参数,该参数用于指定此扩展定义是当前的还是历史的。值“current”表示该定义是当前有效的。值“过时”表示该定义已过时,不应实施和/或在以前实施的情况下可以删除。虽然值“deprecated”也表示过时的定义,但它允许新的/继续的实施,以促进与旧的/现有的实施的互操作性。

6.2. The extension's description Statement
6.2. 扩展的描述语句

The extension's `description' statement, which must be present, gets one argument which is used to specify a high-level textual description of the extension statement.

扩展的“description”语句(必须存在)获取一个参数,该参数用于指定扩展语句的高级文本描述。

It is RECOMMENDED that information on the extension's context, its semantics, and implementation conditions be included. See also Section 11.

建议包含有关扩展的上下文、语义和实现条件的信息。另见第11节。

6.3. The extension's reference Statement
6.3. 扩展的引用语句

The extension's `reference' statement, which need not be present, gets one argument which is used to specify a textual cross-reference to some other document, either another module which defines related extension definitions, or some other document which provides additional information relevant to this extension.

扩展的“reference”语句(不需要存在)获取一个参数,该参数用于指定对某个其他文档的文本交叉引用,或者是定义相关扩展定义的另一个模块,或者是提供与此扩展相关的附加信息的某个其他文档。

6.4. The extension's abnf Statement
6.4. 扩展的abnf语句

The extension's `abnf' statement, which need not be present, gets one argument which is used to specify a formal ABNF [RFC2234] grammar definition of the extension. This grammar can reference rule names from the core SMIng grammar (Appendix B).

扩展名的'abnf'语句(不需要存在)获取一个参数,该参数用于指定扩展名的正式abnf[RFC2234]语法定义。该语法可以引用核心SMIng语法(附录B)中的规则名称。

Note that the `abnf' statement should contain only pure ABNF and no additional text, though comments prefixed by a semicolon are allowed but should probably be moved to the description statement. Note that double quotes within the ABNF grammar have to be represented as `\"' according to Section 4.2.

注意,`abnf'语句应该只包含纯abnf,不包含额外的文本,尽管允许使用分号前缀的注释,但可能应该移动到description语句。请注意,根据第4.2节,ABNF语法中的双引号必须表示为“\”。

6.5. Usage Example
6.5. 用法示例
   extension severity {
     status  current;
     description
            "The optional severity extension statement can only
             be applied to the statement block of an SMIng class'
             event definition. If it is present it denotes the
             severity level of the event in a range from 0
             (emergency) to 7 (debug).";
     abnf
            "severityStatement = severityKeyword sep number optsep \";\"
             severityKeyword   = \"severity\"";
   };
        
   extension severity {
     status  current;
     description
            "The optional severity extension statement can only
             be applied to the statement block of an SMIng class'
             event definition. If it is present it denotes the
             severity level of the event in a range from 0
             (emergency) to 7 (debug).";
     abnf
            "severityStatement = severityKeyword sep number optsep \";\"
             severityKeyword   = \"severity\"";
   };
        
7. The typedef Statement
7. typedef语句

The `typedef' statement defines new data types to be used in the local module or in external modules. It gets two arguments: an upper-case type identifier and a statement block that holds detailed type information in an obligatory order.

“typedef”语句定义要在本地模块或外部模块中使用的新数据类型。它得到两个参数:一个大写类型标识符和一个按强制顺序保存详细类型信息的语句块。

Type identifiers SHOULD NOT consist of all upper-case characters and SHOULD NOT contain hyphens.

类型标识符不应包含所有大写字符,也不应包含连字符。

See the `typedefStatement' rule of the SMIng grammar (Appendix B) for the formal syntax of the `typedef' statement.

有关“typedef”语句的形式语法,请参见SMIng语法的“typedefStatement”规则(附录B)。

7.1. The typedef's type Statement
7.1. typedef的type语句

The typedef's `type' statement, which must be present, gets one argument which is used to specify the type from which this type is derived. Optionally, type restrictions may be applied to the new type by appending subtyping information according to the rules of the base type. See Section 3 for SMIng base types and their type restrictions.

typedef的'type'语句(必须存在)获取一个参数,该参数用于指定派生此类型的类型。或者,通过根据基类型的规则附加子类型信息,可以将类型限制应用于新类型。有关SMIng基类型及其类型限制,请参见第3节。

7.2. The typedef's default Statement
7.2. typedef的默认语句

The typedef's `default' statement, which need not be present, gets one argument which is used to specify an acceptable default value for attributes of this type. A default value may be used when an attribute instance is created. That is, the value is a "hint" to implementors.

typedef的'default'语句(不需要存在)获取一个参数,该参数用于为该类型的属性指定可接受的默认值。创建属性实例时,可以使用默认值。也就是说,该值是对实现者的“提示”。

The value of the `default' statement must, of course, correspond to the (probably restricted) type specified in the typedef's `type' statement.

当然,“default”语句的值必须对应于typedef的“type”语句中指定的(可能是受限的)类型。

The default value of a type may be overwritten by a default value of an attribute of this type.

类型的默认值可能会被该类型属性的默认值覆盖。

Note that for some types, default values make no sense.

请注意,对于某些类型,默认值没有意义。

7.3. The typedef's format Statement
7.3. typedef的format语句

The typedef's `format' statement, which need not be present, gets one argument which is used to give a hint as to how the value of an instance of an attribute of this type might be displayed. See Section 3.13 for a description of format specifications.

typedef的“format”语句(不需要存在)获取一个参数,该参数用于提示如何显示此类型属性的实例的值。格式规范说明见第3.13节。

If no format is specified, it is inherited from the type given in the `type' statement. On the other hand, the format specification of a type may be semantically refined by a format specification of an attribute of this type.

如果未指定格式,则从“type”语句中给定的类型继承该格式。另一方面,类型的格式规范可以通过该类型的属性的格式规范进行语义细化。

7.4. The typedef's units Statement
7.4. typedef的units语句

The typedef's `units' statement, which need not be present, gets one argument which is used to specify a textual definition of the units associated with attributes of this type.

typedef的'units'语句(不需要存在)获取一个参数,该参数用于指定与此类型属性关联的单元的文本定义。

If no units are specified, they are inherited from the type given in the `type' statement. On the other hand, the units specification of a type may be semantically refined by a units specification of an attribute of this type.

如果未指定单位,则从“type”语句中给定的类型继承这些单位。另一方面,类型的单位规范可以通过该类型属性的单位规范进行语义细化。

The units specification has to be appropriate for values displayed according to the typedef's format specification, if present. For example, if the type defines frequency values of type Unsigned64 measured in thousands of Hertz, the format specification should be `d-3' and the units specification should be `Hertz' or `Hz'. If the format specification would be omitted, the units specification should be `Milli-Hertz' or `mHz'. Authors of SMIng modules should pay attention to keep format and units specifications in sync. Application implementors MUST NOT implement units specifications without implementing format specifications.

单位规格必须适用于根据typedef格式规格(如有)显示的值。例如,如果该类型定义了以千赫兹为单位测量的Unsigned64类型的频率值,则格式规范应为'd-3',单位规范应为'Hertz'或'Hz'。如果省略格式规范,则单位规范应为“毫赫兹”或“兆赫”。SMIng模块的作者应该注意保持格式和单元规范的同步。应用程序实现者必须在未实现格式规范的情况下实现单元规范。

7.5. The typedef's status Statement
7.5. typedef的状态语句

The typedef's `status' statement, which must be present, gets one argument which is used to specify whether this type definition is current or historic. The value `current' means that the definition is current and valid. The value `obsolete' means the definition is obsolete and should not be implemented and/or can be removed if previously implemented. While the value `deprecated' also indicates an obsolete definition, it permits new/continued implementation in order to foster interoperability with older/existing implementations.

typedef的“status”语句必须存在,它获取一个参数,用于指定此类型定义是当前的还是历史的。值“current”表示该定义是当前有效的。值“过时”表示该定义已过时,不应实施和/或在以前实施的情况下可以删除。虽然值“deprecated”也表示过时的定义,但它允许新的/继续的实施,以促进与旧的/现有的实施的互操作性。

Derived types SHOULD NOT be defined as `current' if their underlying type is `deprecated' or `obsolete'. Similarly, they SHOULD NOT be defined as `deprecated' if their underlying type is `obsolete'. Nevertheless, subsequent revisions of the underlying type cannot be avoided, but SHOULD be taken into account in subsequent revisions of the local module.

如果派生类型的基础类型为“已弃用”或“已过时”,则不应将其定义为“当前”。同样,如果它们的基础类型为“过时”,则不应将其定义为“不推荐”。然而,基础类型的后续修订无法避免,但应在本地模块的后续修订中予以考虑。

7.6. The typedef's description Statement
7.6. typedef的描述语句

The typedef's `description' statement, which must be present, gets one argument which is used to specify a high-level textual description of the newly defined type.

typedef的“description”语句(必须存在)获取一个参数,该参数用于指定新定义类型的高级文本描述。

It is RECOMMENDED that all semantic definitions necessary for implementation, and to embody any information which would otherwise be communicated in any commentary annotations associated with this type definition be included.

建议包括实现所需的所有语义定义,以及包含与此类型定义相关的任何注释注释中可能传达的任何信息。

7.7. The typedef's reference Statement
7.7. typedef的引用语句

The typedef's `reference' statement, which need not be present, gets one argument which is used to specify a textual cross-reference to some other document, either another module which defines related type definitions, or some other document which provides additional information relevant to this type definition.

typedef的“reference”语句(不需要存在)获取一个参数,该参数用于指定对某个其他文档的文本交叉引用,或者是定义相关类型定义的另一个模块,或者是提供与此类型定义相关的附加信息的某个其他文档。

7.8. Usage Examples
7.8. 用法示例
   typedef RptrOperStatus {
     type            Enumeration (other(1), ok(2), rptrFailure(3),
                                  groupFailure(4), portFailure(5),
                                  generalFailure(6));
     default         other;       // undefined by default.
     status          deprecated;
     description
             "A type to indicate the operational state
              of a repeater.";
     reference
             "[IEEE 802.3 Mgt], 30.4.1.1.5, aRepeaterHealthState.";
   };
        
   typedef RptrOperStatus {
     type            Enumeration (other(1), ok(2), rptrFailure(3),
                                  groupFailure(4), portFailure(5),
                                  generalFailure(6));
     default         other;       // undefined by default.
     status          deprecated;
     description
             "A type to indicate the operational state
              of a repeater.";
     reference
             "[IEEE 802.3 Mgt], 30.4.1.1.5, aRepeaterHealthState.";
   };
        
   typedef SnmpTransportDomain {
     type            Pointer (snmpTransportDomain);
     status          current;
     description
             "A pointer to an SNMP transport domain identity.";
   };
        
   typedef SnmpTransportDomain {
     type            Pointer (snmpTransportDomain);
     status          current;
     description
             "A pointer to an SNMP transport domain identity.";
   };
        
   typedef DateAndTime {
     type            OctetString (8 | 11);
     format          "2d-1d-1d,1d:1d:1d.1d,1a1d:1d";
     status          current;
     description
             "A date-time specification.
              ...
        
   typedef DateAndTime {
     type            OctetString (8 | 11);
     format          "2d-1d-1d,1d:1d:1d.1d,1a1d:1d";
     status          current;
     description
             "A date-time specification.
              ...
        
              Note that if only local time is known, then timezone
              information (fields 8-10) is not present.";
     reference
             "RFC 2579, SNMPv2-TC.DateAndTime.";
   };
        
              Note that if only local time is known, then timezone
              information (fields 8-10) is not present.";
     reference
             "RFC 2579, SNMPv2-TC.DateAndTime.";
   };
        
   typedef Frequency {
     type            Unsigned64;
     format          "d-3"
     units           "Hertz";
     status          current;
     description
             "A wide-range frequency specification measured
              in thousands of Hertz.";
   };
        
   typedef Frequency {
     type            Unsigned64;
     format          "d-3"
     units           "Hertz";
     status          current;
     description
             "A wide-range frequency specification measured
              in thousands of Hertz.";
   };
        
8. The identity Statement
8. 身份声明

The `identity' statement is used to define a new abstract and untyped identity. Its only purpose is to denote its name, semantics, and existence. An identity can be defined either from scratch or derived from a parent identity. The `identity' statement gets the following two arguments: The first argument is a lower-case identity identifier. The second argument is a statement block that holds detailed identity information in an obligatory order.

“identity”语句用于定义新的抽象和非类型标识。它的唯一目的是表示它的名称、语义和存在。标识可以从头定义,也可以从父标识派生。'identity'语句获取以下两个参数:第一个参数是小写标识标识符。第二个参数是一个语句块,它以强制顺序保存详细的标识信息。

See the `identityStatement' rule of the SMIng grammar (Appendix B) for the formal syntax of the `identity' statement.

有关“identity”语句的形式语法,请参见SMIng语法的“identityStatement”规则(附录B)。

8.1. The identity's parent Statement
8.1. 标识的父语句

The identity's `parent' statement must be present for a derived identity and must be absent for an identity defined from scratch. It gets one argument which is used to specify the parent identity from which this identity shall be derived.

派生标识必须存在标识的“父”语句,从头定义的标识必须不存在该语句。它获取一个参数,用于指定从中派生此标识的父标识。

8.2. The identity's status Statement
8.2. 身份的状态声明

The identity's `status' statement, which must be present, gets one argument which is used to specify whether this identity definition is current or historic. The value `current' means that the definition is current and valid. The value `obsolete' means the definition is obsolete and should not be implemented and/or can be removed if previously implemented. While the value `deprecated' also indicates an obsolete definition, it permits new/continued implementation in order to foster interoperability with older/existing implementations.

标识的“status”语句(必须存在)获取一个参数,该参数用于指定此标识定义是当前的还是历史的。值“current”表示该定义是当前有效的。值“过时”表示该定义已过时,不应实施和/或在以前实施的情况下可以删除。虽然值“deprecated”也表示过时的定义,但它允许新的/继续的实施,以促进与旧的/现有的实施的互操作性。

Derived identities SHOULD NOT be defined as `current' if their parent identity is `deprecated' or `obsolete'. Similarly, they SHOULD NOT be defined as `deprecated' if their parent identity is `obsolete'. Nevertheless, subsequent revisions of the parent identity cannot be avoided, but SHOULD be taken into account in subsequent revisions of the local module.

如果派生标识的父标识为“已弃用”或“已过时”,则不应将其定义为“当前”。同样,如果它们的父标识为“过时”,则不应将其定义为“不推荐”。然而,不能避免对父标识的后续修订,但应在本地模块的后续修订中予以考虑。

8.3. The identity' description Statement
8.3. 身份描述语句

The identity's `description' statement, which must be present, gets one argument which is used to specify a high-level textual description of the newly defined identity.

标识的“description”语句(必须存在)获取一个参数,该参数用于指定新定义标识的高级文本描述。

It is RECOMMENDED that all semantic definitions necessary for implementation, and to embody any information which would otherwise be communicated in any commentary annotations associated with this identity definition be included.

建议包括实施所需的所有语义定义,以及包含与此身份定义相关的任何注释注释中可能传达的任何信息。

8.4. The identity's reference Statement
8.4. 身份的引用声明

The identity's `reference' statement, which need not be present, gets one argument which is used to specify a textual cross-reference to some other document, either another module which defines related identity definitions, or some other document which provides additional information relevant to this identity definition.

标识的“reference”语句(不需要存在)获取一个参数,该参数用于指定对某个其他文档的文本交叉引用,或者是定义相关标识定义的另一个模块,或者是提供与此标识定义相关的附加信息的某个其他文档。

8.5. Usage Examples
8.5. 用法示例
   identity null {
     status  current;
     description
             "An identity used to represent null pointer values.";
   };
        
   identity null {
     status  current;
     description
             "An identity used to represent null pointer values.";
   };
        
   identity snmpTransportDomain {
     status  current;
     description
             "A generic SNMP transport domain identity.";
   };
        
   identity snmpTransportDomain {
     status  current;
     description
             "A generic SNMP transport domain identity.";
   };
        
   identity snmpUDPDomain {
     parent  snmpTransportDomain;
     status  current;
     description
             "The SNMP over UDP transport domain.";
   };
        
   identity snmpUDPDomain {
     parent  snmpTransportDomain;
     status  current;
     description
             "The SNMP over UDP transport domain.";
   };
        
9. The class Statement
9. 类语句

The `class' statement is used to define a new class that represents a container of related attributes and events (Section 9.2, Section 9.4). A class can be defined either from scratch or derived from a parent class. A derived class inherits all attributes and events of the parent class and can be extended by additional attributes and events.

“class”语句用于定义表示相关属性和事件容器的新类(第9.2节,第9.4节)。类可以从头定义,也可以从父类派生。派生类继承父类的所有属性和事件,并可以通过其他属性和事件进行扩展。

The `class' statement gets the following two arguments: The first argument is an upper-case class identifier. The second argument is a statement block that holds detailed class information in an obligatory order.

'class'语句获取以下两个参数:第一个参数是大写类标识符。第二个参数是一个语句块,它以强制顺序保存详细的类信息。

See the `classStatement' rule of the SMIng grammar (Appendix B) for the formal syntax of the `class' statement.

有关“class”语句的形式语法,请参见SMIng语法的“classStatement”规则(附录B)。

9.1. The class' extends Statement
9.1. 类的extends语句

The class' `extends' statement must be present for a class derived from a parent class and must be absent for a class defined from scratch. It gets one argument which is used to specify the parent class from which this class shall be derived.

对于从父类派生的类,必须存在类'`extends'语句,对于从头定义的类,必须不存在类'`extends'语句。它获取一个参数,该参数用于指定派生此类的父类。

9.2. The class' attribute Statement
9.2. 类的属性语句

The class' `attribute' statement, which can be present zero, one or multiple times, gets two arguments: the attribute name and a statement block that holds detailed attribute information in an obligatory order.

类'`attribute'语句可以出现零次、一次或多次,它获取两个参数:属性名称和一个按强制顺序保存详细属性信息的语句块。

9.2.1. The attribute's type Statement
9.2.1. 属性的类型语句

The attribute's `type' statement must be present. It gets at least one argument which is used to specify the type of the attribute: either a type name or a class name. In case of a type name, it may be restricted by a second argument according to the restriction rules described in Section 3.

属性的“type”语句必须存在。它至少获取一个用于指定属性类型的参数:类型名或类名。对于类型名,根据第3节中描述的限制规则,它可能会受到第二个参数的限制。

9.2.2. The attribute's access Statement
9.2.2. 属性的访问语句

The attribute's `access' statement must be present for attributes typed by a base type or derived type, and must be absent for attributes typed by a class. It gets one argument which is used to specify whether it makes sense to read and/or write an instance of the attribute, or to include its value in an event. This is the maximal level of access for the attribute. This maximal level of access is independent of any administrative authorization policy.

对于由基类型或派生类型键入的属性,该属性的“access”语句必须存在,对于由类键入的属性,该语句必须不存在。它获取一个参数,该参数用于指定读取和/或写入属性实例,或在事件中包含属性值是否有意义。这是属性的最大访问级别。此最大访问级别独立于任何管理授权策略。

The value `readwrite' indicates that read and write access makes sense. The value `readonly' indicates that read access makes sense, but write access is never possible. The value `eventonly' indicates an object which is accessible only via an event.

值“readwrite”表示读写访问有意义。值“readonly”表示读访问有意义,但写访问永远不可能。值“eventonly”表示只能通过事件访问的对象。

These values are ordered, from least to greatest access level: `eventonly', `readonly', `readwrite'.

这些值从最小访问级别到最大访问级别依次为:`eventonly',`readonly',`readwrite'。

9.2.3. The attribute's default Statement
9.2.3. 属性的默认语句

The attribute's `default' statement need not be present for attributes typed by a base type or derived type, and must be absent for attributes typed by a class. It gets one argument which is used to specify an acceptable default value for this attribute. A default value may be used when an attribute instance is created. That is, the value is a "hint" to implementors.

对于由基类型或派生类型键入的属性,属性的“default”语句不必存在,对于由类键入的属性,属性的“default”语句必须不存在。它获取一个参数,用于为此属性指定可接受的默认值。创建属性实例时,可以使用默认值。也就是说,该值是对实现者的“提示”。

The value of the `default' statement must, of course, correspond to the (probably restricted) type specified in the attribute's `type' statement.

当然,“default”语句的值必须与属性的“type”语句中指定的(可能是受限的)类型相对应。

The attribute's default value overrides the default value of the underlying type definition if both are present.

属性的默认值将覆盖基础类型定义的默认值(如果两者都存在)。

9.2.4. The attribute's format Statement
9.2.4. 属性的format语句

The attribute's `format' statement need not be present for attributes typed by a base type or derived type, and must be absent for attributes typed by a class. It gets one argument which is used to give a hint as to how the value of an instance of this attribute might be displayed. See Section 3.13 for a description of format specifications.

对于由基类型或派生类型键入的属性,属性的“format”语句不必存在,对于由类键入的属性,属性的“format”语句必须不存在。它获取一个参数,用于提示如何显示此属性实例的值。格式规范说明见第3.13节。

The attribute's format specification overrides the format specification of the underlying type definition if both are present.

属性的格式规范将覆盖基础类型定义的格式规范(如果两者都存在)。

9.2.5. The attribute's units Statement
9.2.5. 属性的units语句

The attribute's `units' statement need not be present for attributes typed by a base type or derived type, and must be absent for attributes typed by a class. It gets one argument which is used to specify a textual definition of the units associated with this attribute.

对于由基类型或派生类型键入的属性,属性的“units”语句不必存在,对于由类键入的属性,属性的“units”语句必须不存在。它获取一个参数,用于指定与此属性关联的单元的文本定义。

The attribute's units specification overrides the units specification of the underlying type definition if both are present.

如果存在基础类型定义的单位规格,则属性的单位规格将覆盖基础类型定义的单位规格。

The units specification has to be appropriate for values displayed according to the attribute's format specification if present. For example, if the attribute represents a frequency value of type Unsigned64 measured in thousands of Hertz, the format specification should be `d-3' and the units specification should be `Hertz' or `Hz'. If the format specification would be omitted, the units specification should be `Milli-Hertz' or `mHz'. Authors of SMIng modules should pay attention to keep format and units specifications of type and attribute definitions in sync. Application implementors MUST NOT implement units specifications without implementing format specifications.

单位规格必须适用于根据属性的格式规格(如果存在)显示的值。例如,如果该属性表示以千赫兹为单位测量的Unsigned64类型的频率值,则格式规范应为'd-3',单位规范应为'Hertz'或'Hz'。如果省略格式规范,则单位规范应为“毫赫兹”或“兆赫”。SMIng模块的作者应该注意保持类型和属性定义的格式和单位规范同步。应用程序实现者必须在未实现格式规范的情况下实现单元规范。

9.2.6. The attribute's status Statement
9.2.6. 属性的状态语句

The attribute's `status' statement must be present. It gets one argument which is used to specify whether this attribute definition is current or historic. The value `current' means that the definition is current and valid. The value `obsolete' means the definition is obsolete and should not be implemented and/or can be removed if previously implemented. While the value `deprecated' also indicates an obsolete definition, it permits new/continued implementation in order to foster interoperability with older/ existing implementations.

属性的“status”语句必须存在。它获取一个参数,用于指定此属性定义是当前的还是历史的。值“current”表示该定义是当前有效的。值“过时”表示该定义已过时,不应实施和/或在以前实施的情况下可以删除。虽然值“deprecated”也表示过时的定义,但它允许新的/继续的实施,以促进与旧的/现有的实施的互操作性。

Attributes SHOULD NOT be defined as `current' if their type or their containing class is `deprecated' or `obsolete'. Similarly, they SHOULD NOT be defined as `deprecated' if their type or their containing class is `obsolete'. Nevertheless, subsequent revisions of used type definition cannot be avoided, but SHOULD be taken into account in subsequent revisions of the local module.

如果属性的类型或其包含类为“已弃用”或“已过时”,则不应将属性定义为“当前”。同样,如果它们的类型或包含类为“过时”,则不应将它们定义为“不推荐”。然而,无法避免对所用类型定义进行后续修订,但应在本地模块的后续修订中予以考虑。

9.2.7. The attribute's description Statement
9.2.7. 属性的描述语句

The attribute's `description' statement, which must be present, gets one argument which is used to specify a high-level textual description of this attribute.

属性的“description”语句(必须存在)获取一个参数,该参数用于指定此属性的高级文本描述。

It is RECOMMENDED that all semantic definitions necessary for the implementation of this attribute be included.

建议包括实现此属性所需的所有语义定义。

9.2.8. The attribute's reference Statement
9.2.8. 属性的引用语句

The attribute's `reference' statement, which need not be present, gets one argument which is used to specify a textual cross-reference to some other document, either another module which defines related attribute definitions, or some other document which provides additional information relevant to this attribute definition.

属性的“reference”语句(不需要存在)获取一个参数,该参数用于指定对某个其他文档的文本交叉引用,或者是定义相关属性定义的另一个模块,或者是提供与此属性定义相关的附加信息的某个其他文档。

9.3. The class' unique Statement
9.3. 类的唯一语句

The class' `unique' statement, which need not be present, gets one argument that specifies a comma-separated list of attributes of this class, enclosed in parenthesis. If present, this list of attributes makes up a unique identification of all possible instances of this class. It can be used as a unique key in underlying protocols.

类'`unique'语句(不需要存在)获取一个参数,该参数指定该类属性的逗号分隔列表,并用括号括起来。如果存在,该属性列表将构成该类所有可能实例的唯一标识。它可以用作基础协议中的唯一密钥。

If the list is empty, the class should be regarded as a scalar class with only a single instance.

如果列表为空,则应将该类视为只有一个实例的标量类。

If the `unique' statement is not present, the class is not meant to be instantiated directly, but to be contained in other classes or the parent class of other refining classes.

如果“unique”语句不存在,则该类不应直接实例化,而应包含在其他类或其他细化类的父类中。

If present, the attribute list MUST NOT contain any attribute more than once and the attributes should be ordered where appropriate so that the attributes that are most significant in most situations appear first.

如果存在,属性列表不能多次包含任何属性,并且应在适当的情况下对属性进行排序,以便在大多数情况下最重要的属性首先出现。

9.4. The class' event Statement
9.4. 类的事件语句

The class' `event' statement is used to define an event related to an instance of this class that can occur asynchronously. It gets two arguments: a lower-case event identifier and a statement block that holds detailed information in an obligatory order.

类'`event'语句用于定义与此类实例相关的、可以异步发生的事件。它得到两个参数:小写事件标识符和按强制顺序保存详细信息的语句块。

See the `eventStatement' rule of the SMIng grammar (Appendix B) for the formal syntax of the `event' statement.

有关“event”语句的形式语法,请参见SMIng语法的“eventStatement”规则(附录B)。

9.4.1. The event's status Statement
9.4.1. 事件的状态声明

The event's `status' statement, which must be present, gets one argument which is used to specify whether this event definition is current or historic. The value `current' means that the definition is current and valid. The value `obsolete' means the definition is obsolete and should not be implemented and/or can be removed if previously implemented. While the value `deprecated' also indicates an obsolete definition, it permits new/continued implementation in order to foster interoperability with older/existing implementations.

事件的“status”语句(必须存在)获取一个参数,该参数用于指定此事件定义是当前的还是历史的。值“current”表示该定义是当前有效的。值“过时”表示该定义已过时,不应实施和/或在以前实施的情况下可以删除。虽然值“deprecated”也表示过时的定义,但它允许新的/继续的实施,以促进与旧的/现有的实施的互操作性。

9.4.2. The event's description Statement
9.4.2. 事件的描述语句

The event's `description' statement, which must be present, gets one argument which is used to specify a high-level textual description of this event.

事件的“description”语句(必须存在)获取一个参数,该参数用于指定此事件的高级文本描述。

It is RECOMMENDED that all semantic definitions necessary for the implementation of this event be included. In particular, which instance of the class is associated with an event of this type SHOULD be documented.

建议包括实现此事件所需的所有语义定义。特别是,应该记录与此类事件关联的类实例。

9.4.3. The event's reference Statement
9.4.3. 事件的参考声明

The event's `reference' statement, which need not be present, gets one argument which is used to specify a textual cross-reference to some other document, either another module which defines related event definitions, or some other document which provides additional information relevant to this event definition.

事件的“reference”语句(不需要存在)获取一个参数,该参数用于指定对某些其他文档的文本交叉引用,或者是定义相关事件定义的另一个模块,或者是提供与此事件定义相关的附加信息的某个其他文档。

9.5. The class' status Statement
9.5. 类的状态语句

The class' `status' statement, which must be present, gets one argument which is used to specify whether this class definition is current or historic. The value `current' means that the definition is current and valid. The value `obsolete' means the definition is obsolete and should not be implemented and/or can be removed if previously implemented. While the value `deprecated' also indicates an obsolete definition, it permits new/continued implementation in order to foster interoperability with older/existing implementations.

类'`status'语句(必须存在)获取一个参数,该参数用于指定该类定义是当前的还是历史的。值“current”表示该定义是当前有效的。值“过时”表示该定义已过时,不应实施和/或在以前实施的情况下可以删除。虽然值“deprecated”也表示过时的定义,但它允许新的/继续的实施,以促进与旧的/现有的实施的互操作性。

Derived classes SHOULD NOT be defined as `current' if their parent class is `deprecated' or `obsolete'. Similarly, they SHOULD NOT be defined as `deprecated' if their parent class is `obsolete'. Nevertheless, subsequent revisions of the parent class cannot be avoided, but SHOULD be taken into account in subsequent revisions of the local module.

如果派生类的父类为“已弃用”或“已过时”,则不应将其定义为“当前”。同样,如果它们的父类是“过时的”,则不应将它们定义为“不推荐”。然而,不能避免父类的后续修订,但应在本地模块的后续修订中予以考虑。

9.6. The class' description Statement
9.6. 类的描述语句

The class' `description' statement, which must be present, gets one argument which is used to specify a high-level textual description of the newly defined class.

类'`description'语句(必须存在)获取一个参数,该参数用于指定新定义类的高级文本描述。

It is RECOMMENDED that all semantic definitions necessary for implementation, and to embody any information which would otherwise be communicated in any commentary annotations associated with this class definition be included.

建议包括实现所需的所有语义定义,以及包含与该类定义相关的任何注释注释中可能传达的任何信息。

9.7. The class' reference Statement
9.7. 类的引用语句

The class' `reference' statement, which need not be present, gets one argument which is used to specify a textual cross-reference to some other document, either another module which defines related class definitions, or some other document which provides additional information relevant to this class definition.

类'`reference'语句(不需要存在)获取一个参数,该参数用于指定对某个其他文档的文本交叉引用,或者是定义相关类定义的另一个模块,或者是提供与该类定义相关的附加信息的某个其他文档。

9.8. Usage Example
9.8. 用法示例

Consider how an event might be described that signals a status change of an interface:

考虑如何描述一个接口状态变化的事件:

   class Interface {
     // ...
     attribute speed {
       type        Gauge32;
       access      readonly;
       units       "bps";
       status      current;
       description
            "An estimate of the interface's current bandwidth
             in bits per second.";
     };
     // ...
     attribute adminStatus {
       type        AdminStatus;
       access      readwrite;
       status      current;
       description
            "The desired state of the interface.";
     };
     attribute operStatus {
       type        OperStatus;
       access      readonly;
       status      current;
       description
            "The current operational state of the interface.";
     };
        
   class Interface {
     // ...
     attribute speed {
       type        Gauge32;
       access      readonly;
       units       "bps";
       status      current;
       description
            "An estimate of the interface's current bandwidth
             in bits per second.";
     };
     // ...
     attribute adminStatus {
       type        AdminStatus;
       access      readwrite;
       status      current;
       description
            "The desired state of the interface.";
     };
     attribute operStatus {
       type        OperStatus;
       access      readonly;
       status      current;
       description
            "The current operational state of the interface.";
     };
        
     event linkDown {
       status      current;
       description
               "A linkDown event signifies that the ifOperStatus
                attribute for this interface instance is about to
                enter the down state from some other state (but not
                from the notPresent state).  This other state is
                indicated by the included value of ifOperStatus.";
        
     event linkDown {
       status      current;
       description
               "A linkDown event signifies that the ifOperStatus
                attribute for this interface instance is about to
                enter the down state from some other state (but not
                from the notPresent state).  This other state is
                indicated by the included value of ifOperStatus.";
        

};

};

     status        current;
     description
               "A physical or logical network interface.";
        
     status        current;
     description
               "A physical or logical network interface.";
        

};

};

10. Extending a Module
10. 扩展模块

As experience is gained with a module, it may be desirable to revise that module. However, changes are not allowed if they have any potential to cause interoperability problems between an implementation using an original specification and an implementation using an updated specification(s).

由于从一个模块中获得了经验,因此可能需要修改该模块。但是,如果更改可能导致使用原始规范的实现与使用更新规范的实现之间的互操作性问题,则不允许进行更改。

For any change, some statements near the top of the module MUST be updated to include information about the revision: specifically, a new `revision' statement (Section 5.6) must be included in front of the `revision' statements. Furthermore, any necessary changes MUST be applied to other statements, including the `organization' and `contact' statements (Section 5.2, Section 5.3).

对于任何变更,必须更新模块顶部附近的一些声明,以包含有关修订的信息:具体而言,必须在“修订”声明之前包含新的“修订”声明(第5.6节)。此外,任何必要的修改都必须适用于其他声明,包括“组织”和“联系”声明(第5.2节,第5.3节)。

Note that any definition contained in a module is available to be imported by any other module, and is referenced in an `import' statement via the module name. Thus, a module name MUST NOT be changed. Specifically, the module name (e.g., `ACME-MIB' in the example of Section 5.7) MUST NOT be changed when revising a module (except to correct typographical errors), and definitions MUST NOT be moved from one module to another.

请注意,模块中包含的任何定义都可以由任何其他模块导入,并通过模块名称在“import”语句中引用。因此,模块名称不得更改。具体而言,修改模块时,不得更改模块名称(例如,第5.7节示例中的“ACME-MIB”)(除了纠正印刷错误),并且不得将定义从一个模块移动到另一个模块。

Also note that obsolete definitions MUST NOT be removed from modules since their identifiers may still be referenced by other modules.

还请注意,不能从模块中删除过时的定义,因为其他模块仍可能引用它们的标识符。

A definition may be revised in any of the following ways:

定义可通过以下任何方式进行修订:

o In `typedef' statement blocks, a `type' statement containing an `Enumeration' or `Bits' type may have new named numbers added.

o 在“typedef”语句块中,包含“枚举”或“位”类型的“type”语句可能会添加新的命名数字。

o In `typedef' statement blocks, the value of a `type' statement may be replaced by another type if the new type is derived (directly or indirectly) from the same base type, has the same set of values, and has identical semantics.

o 在“typedef”语句块中,如果新类型(直接或间接)从相同的基类型派生,具有相同的值集,并且具有相同的语义,“type”语句的值可以替换为另一个类型。

o In `attribute' statements where the `type' sub-statement specifies a class, the class may be replaced by another class if the new class is derived (directly or indirectly) from the base class and both classes have identical semantics.

o 在“type”子语句指定类的“attribute”语句中,如果新类(直接或间接)从基类派生,并且两个类具有相同的语义,则该类可以被另一个类替换。

o In `attribute' statements where the `type' sub-statement specifies a base type, a defined type, or an implicitly derived type (i.e., not a class), that type may be replaced by another type if the new type is derived (directly or indirectly) from the same base type, has the same set of values, and has identical semantics.

o 在“attribute”语句中,“type”子语句指定一个基类型、一个已定义类型或一个隐式派生类型(即非类),如果新类型(直接或间接)从相同的基类型派生,具有相同的值集,并且具有相同的语义,则该类型可以被另一个类型替换。

o In any statement block, a `status' statement value of `current' may be revised as `deprecated' or `obsolete'. Similarly, a `status' statement value of `deprecated' may be revised as `obsolete'. When making such a change, the `description' statement SHOULD be updated to explain the rationale.

o 在任何语句块中,值为“current”的“status”语句可以修改为“deprecated”或“ocated”。同样,“status”语句值“deprecated”也可以修改为“过时”。在作出这种更改时,应更新“说明”说明,以解释理由。

o In `typedef' and `attribute' statement blocks, a `default' statement may be added or updated.

o 在“typedef”和“attribute”语句块中,可以添加或更新“default”语句。

o In `typedef' and `attribute' statement blocks, a `units' statement may be added.

o 在“typedef”和“attribute”语句块中,可以添加“units”语句。

o A class may be augmented by adding new attributes.

o 可以通过添加新属性来扩充类。

o In any statement block, clarifications and additional information may be included in the `description' statement.

o 在任何语句块中,“说明”语句可包括澄清和补充信息。

o In any statement block, a `reference' statement may be added or updated.

o 在任何语句块中,都可以添加或更新“reference”语句。

o Entirely new extensions, types, identities, and classes may be defined, using previously unassigned identifiers.

o 可以使用以前未分配的标识符定义全新的扩展、类型、标识和类。

Otherwise, if the semantics of any previous definition are changed (i.e., if a non-editorial change is made to any definition other than those specifically allowed above), then this MUST be achieved by a new definition with a new identifier. In case of a class where the semantics of any attributes are changed, the new class can be defined by derivation from the old class and refining the changed attributes.

否则,如果更改了任何先前定义的语义(即,如果对除上述明确允许的定义以外的任何定义进行了非编辑性更改),则必须通过使用新标识符的新定义来实现。对于任何属性的语义发生变化的类,可以通过从旧类派生并细化变化的属性来定义新类。

Note that changing the identifier associated with an existing definition is considered a semantic change, as these strings may be used in an `import' statement.

请注意,更改与现有定义关联的标识符被视为语义更改,因为这些字符串可能会在“import”语句中使用。

11. SMIng Language Extensibility
11. SMIng语言可扩展性

While the core SMIng language has a well defined set of statements (Section 5 through Section 9.4) that are used to specify those aspects of management information commonly regarded as necessary without management protocol specific information, there may be

虽然核心SMIng语言有一组定义良好的语句(第5节至第9.4节),用于指定通常认为必要的管理信息的那些方面,而没有管理协议特定信息,但可能存在

further information people wish to express. Describing additional information informally in description statements has a disadvantage in that this information cannot be parsed by any program.

人们希望表达的更多信息。在描述语句中非正式地描述附加信息有一个缺点,即任何程序都无法解析该信息。

SMIng allows modules to include statements that are unknown to a parser but fulfil some core grammar rules (Section 4.3). Furthermore, additional statements may be defined by the `extension' statement (Section 6). Extensions can be used in the local module or in other modules that import the extension. This has some advantages:

SMIng允许模块包含解析器未知但满足一些核心语法规则的语句(第4.3节)。此外,“延期”声明(第6节)可对其他声明作出定义。扩展可以在本地模块或导入扩展的其他模块中使用。这有一些好处:

o A parser can differentiate between statements known as extensions and unknown statements. This enables the parser to complain about unknown statements, e.g., due to typos.

o 解析器可以区分扩展语句和未知语句。这使得解析器能够抱怨未知语句,例如由于拼写错误。

o If an extension's definition contains a formal ABNF grammar definition and a parser is able to interpret this ABNF definition, this enables the parser to also complain about the wrong usage of an extension.

o 如果扩展的定义包含一个正式的ABNF语法定义,并且解析器能够解释这个ABNF定义,那么解析器也可以抱怨扩展的错误使用。

o Since there might be some common need for extensions, there is a relatively high probability of extension name collisions originated by different organizations, as long as there is no standardized extension for that purpose. The requirement to explicitly import extension statements allows those extensions to be distinguished.

o 由于可能对扩展有一些共同的需求,因此,只要没有用于此目的的标准化扩展,不同组织发起扩展名冲突的可能性相对较高。显式导入扩展语句的要求允许区分这些扩展。

o The supported extensions of an SMIng implementation, e.g., an SMIng module compiler, can be clearly expressed.

o 可以清楚地表示支持的SMIng实现扩展,例如SMIng模块编译器。

The only formal effect of an extension statement definition is to declare its existence and status, and optionally its ABNF grammar. All additional aspects SHOULD be described in the `description' statement:

扩展语句定义的唯一形式效果是声明其存在和状态,以及可选的ABNF语法。所有其他方面应在“说明”声明中说明:

o The detailed semantics of the new statement SHOULD be described.

o 应该描述新语句的详细语义。

o The contexts in which the new statement can be used SHOULD be described, e.g., a new statement may be designed to be used only in the statement block of a module, but not in other nested statement blocks. Others may be applicable in multiple contexts. In addition, the point in the sequence of an obligatory order of other statements, where the new statement may be inserted, might be prescribed.

o 应描述可使用新语句的上下文,例如,新语句可设计为仅在模块的语句块中使用,而不在其他嵌套语句块中使用。其他方法可能适用于多种情况。此外,可以规定其他语句的强制顺序中插入新语句的点。

o The circumstances that make the new statement mandatory or optional SHOULD be described.

o 应说明使新声明具有强制性或选择性的情况。

o The syntax of the new statement SHOULD at least be described informally, if not supplied formally in an `abnf' statement.

o 如果在“abnf”语句中没有正式提供,新语句的语法至少应该非正式地描述。

o It might be reasonable to give some suggestions under which conditions the implementation of the new statement is adequate and how it could be integrated into existent implementations.

o 在什么条件下新语句的实现是充分的,以及如何将其集成到现有的实现中,给出一些建议可能是合理的。

Some possible extension applications are:

一些可能的扩展应用包括:

o The formal mapping of SMIng definitions into the SNMP [RFC3781] framework is defined as an SMIng extension. Other mappings may follow in the future.

o SMIng定义到SNMP[RFC3781]框架的正式映射被定义为SMIng扩展。将来可能会出现其他映射。

o Inlined annotations to definitions. For example, a vendor may wish to describe additional information to class and attribute definitions in private modules. An example are severity levels of events in the statement block of an `event' statement.

o 定义的内联注释。例如,供应商可能希望描述私有模块中类和属性定义的附加信息。例如,“event”语句的语句块中事件的严重性级别。

o Arbitrary annotations to external definitions. For example, a vendor may wish to describe additional information to definitions in a "standard" module. This allows a vendor to implement "standard" modules as well as additional private features, without redundant module definitions, but on top of "standard" module definitions.

o 外部定义的任意注释。例如,供应商可能希望在“标准”模块中描述定义的附加信息。这允许供应商实现“标准”模块以及附加的专用功能,无需冗余的模块定义,而是在“标准”模块定义之上。

12. Security Considerations
12. 安全考虑

This document defines a language with which to write and read descriptions of management information. The language itself has no security impact on the Internet.

本文档定义了一种用于编写和读取管理信息描述的语言。这种语言本身对互联网没有安全影响。

13. Acknowledgements
13. 致谢

Since SMIng started as a close successor of SMIv2, some paragraphs and phrases are directly taken from the SMIv2 specifications [RFC2578], [RFC2579], [RFC2580] written by Jeff Case, Keith McCloghrie, David Perkins, Marshall T. Rose, Juergen Schoenwaelder, and Steven L. Waldbusser.

由于SMIng最初是SMIv2的继承者,因此一些段落和短语直接取自由Jeff Case、Keith McCloghrie、David Perkins、Marshall T.Rose、Juergen Schoenwaeld和Steven L.Waldbusser编写的SMIv2规范[RFC2578]、[RFC2579]、[RFC2580]。

The authors would like to thank all participants of the 7th NMRG meeting held in Schloss Kleinheubach from 6-8 September 2000, which was a major step towards the current status of this memo, namely Heiko Dassow, David Durham, Keith McCloghrie, and Bert Wijnen.

作者要感谢2000年9月6日至8日在Schloss Kleinheubach举行的第七次NMRG会议的所有与会者,这是朝着本备忘录现状迈出的重要一步,即Heiko Dassow、David Durham、Keith McLoghrie和Bert Wijnen。

Furthermore, several discussions within the SMING Working Group reflected experience with SMIv2 and influenced this specification at some points.

此外,SMING工作组内的几次讨论反映了SMIv2的经验,并在某些方面影响了本规范。

14. References
14. 工具书类
14.1. Normative References
14.1. 规范性引用文件

[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.

[RFC2119]Bradner,S.,“RFC中用于表示需求水平的关键词”,BCP 14,RFC 2119,1997年3月。

[RFC2234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", RFC 2234, November 1997.

[RFC2234]Crocker,D.,Ed.和P.Overell,“语法规范的扩充BNF:ABNF”,RFC 2234,1997年11月。

14.2. Informative References
14.2. 资料性引用

[RFC3216] Elliott, C., Harrington, D., Jason, J., Schoenwaelder, J., Strauss, F. and W. Weiss, "SMIng Objectives", RFC 3216, December 2001.

[RFC3216]Elliott,C.,Harrington,D.,Jason,J.,Schoenwaeld,J.,Strauss,F.和W.Weiss,“SMIng目标”,RFC 32162001年12月。

[RFC3781] Strauss, F. and J. Schoenwaelder, "Next Generation Structure of Management Information (SMIng) Mappings to the Simple Network Management Protocol (SNMP)", RFC 3781, May 2004.

[RFC3781]Strauss,F.和J.Schoenwaeld,“到简单网络管理协议(SNMP)的下一代管理信息结构(SMIng)映射”,RFC 3781,2004年5月。

[RFC2578] McCloghrie, K., Perkins, D. and J. Schoenwaelder, "Structure of Management Information Version 2 (SMIv2)", STD 58, RFC 2578, April 1999.

[RFC2578]McCloghrie,K.,Perkins,D.和J.Schoenwaeld,“管理信息的结构版本2(SMIv2)”,STD 58,RFC 2578,1999年4月。

[RFC2579] McCloghrie, K., Perkins, D. and J. Schoenwaelder, "Textual Conventions for SMIv2", STD 59, RFC 2579, April 1999.

[RFC2579]McCloghrie,K.,Perkins,D.和J.Schoenwaeld,“SMIv2的文本约定”,STD 59,RFC 2579,1999年4月。

[RFC2580] McCloghrie, K., Perkins, D. and J. Schoenwaelder, "Conformance Statements for SMIv2", STD 60, RFC 2580, April 1999.

[RFC2580]McCloghrie,K.,Perkins,D.和J.Schoenwaeld,“SMIv2的一致性声明”,STD 60,RFC 25801999年4月。

[RFC3159] McCloghrie, K., Fine, M., Seligson, J., Chan, K., Hahn, S., Sahita, R., Smith, A. and F. Reichmeyer, "Structure of Policy Provisioning Information (SPPI)", RFC 3159, August 2001.

[RFC3159]McCloghrie,K.,Fine,M.,Seligson,J.,Chan,K.,Hahn,S.,Sahita,R.,Smith,A.和F.Reichmeyer,“策略供应信息的结构(SPPI)”,RFC 3159,2001年8月。

[RFC1155] Rose, M. and K. McCloghrie, "Structure and Identification of Management Information for TCP/IP-based Internets", STD 16, RFC 1155, May 1990.

[RFC1155]Rose,M.和K.McCloghrie,“基于TCP/IP的互联网管理信息的结构和识别”,STD 16,RFC 1155,1990年5月。

[RFC1212] Rose, M. and K. McCloghrie, "Concise MIB Definitions", STD 16, RFC 1212, March 1991.

[RFC1212]Rose,M.和K.McCloghrie,“简明MIB定义”,STD 16,RFC 1212,1991年3月。

[RFC1215] Rose, M., "A Convention for Defining Traps for use with the SNMP", RFC 1215, March 1991.

[RFC1215]Rose,M.,“定义用于SNMP的陷阱的约定”,RFC1215,1991年3月。

[ASN1] International Organization for Standardization, "Specification of Abstract Syntax Notation One (ASN.1)", International Standard 8824, December 1987.

[ASN1]国际标准化组织,“抽象语法符号1规范(ASN.1)”,国际标准88241987年12月。

[RFC3411] Harrington, D., Presuhn, R. and B. Wijnen, "An Architecture for Describing Simple Network Management Protocol (SNMP) Management Frameworks", STD 62, RFC 3411, December 2002.

[RFC3411]Harrington,D.,Presohn,R.和B.Wijnen,“描述简单网络管理协议(SNMP)管理框架的体系结构”,STD 62,RFC 3411,2002年12月。

[IEEE754] Institute of Electrical and Electronics Engineers, "IEEE Standard for Binary Floating-Point Arithmetic", ANSI/IEEE Standard 754-1985, August 1985.

[IEEE754]电气和电子工程师协会,“二进制浮点运算的IEEE标准”,ANSI/IEEE标准754-1985,1985年8月。

[RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO 10646", STD 63, RFC 3629, November 2003.

[RFC3629]Yergeau,F.,“UTF-8,ISO 10646的转换格式”,STD 63,RFC 3629,2003年11月。

[RFC3084] Chan, K., Seligson, J., Durham, D., Gai, S., McCloghrie, K., Herzog, S., Reichmeyer, F., Yavatkar, R. and A. Smith, "COPS Usage for Policy Provisioning", RFC 3084, March 2001.

[RFC3084]Chan,K.,Seligson,J.,Durham,D.,Gai,S.,McCloghrie,K.,Herzog,S.,Reichmeyer,F.,Yavatkar,R.和A.Smith,“政策规定的COPS使用”,RFC 3084,2001年3月。

Appendix A. NMRG-SMING Module
附录A.NMRG-SMING模块

Most SMIng modules are built on top of the definitions of some commonly used derived types. The definitions of these derived types are contained in the NMRG-SMING module which is defined below. Its derived types are generally applicable for modeling all areas of management information. Among these derived types are counter types, string types, and date and time related types.

大多数SMIng模块构建在一些常用派生类型的定义之上。这些派生类型的定义包含在下面定义的NMRG-SMING模块中。其派生类型通常适用于管理信息的所有领域建模。这些派生类型包括计数器类型、字符串类型以及与日期和时间相关的类型。

This module is derived from RFC 2578 [RFC2578] and RFC 2579 [RFC2579].

该模块源自RFC 2578[RFC2578]和RFC 2579[RFC2579]。

module NMRG-SMING {

模块NMRG-SMING{

organization "IRTF Network Management Research Group (NMRG)";

组织“IRTF网络管理研究小组(NMRG)”;

    contact         "IRTF Network Management Research Group (NMRG)
                     http://www.ibr.cs.tu-bs.de/projects/nmrg/
        
    contact         "IRTF Network Management Research Group (NMRG)
                     http://www.ibr.cs.tu-bs.de/projects/nmrg/
        

Frank Strauss TU Braunschweig Muehlenpfordtstrasse 23 38106 Braunschweig Germany Phone: +49 531 391 3266 EMail: strauss@ibr.cs.tu-bs.de

Frank Strauss TU Braunschweig Muehlenpfordtstrasse 23 38106 Braunschweig Germany电话:+49 531 391 3266电子邮件:strauss@ibr.cs.tu-理学士

Juergen Schoenwaelder International University Bremen P.O. Box 750 561 28725 Bremen Germany Phone: +49 421 200 3587 EMail: j.schoenwaelder@iu-bremen.de";

Juergen Schoenwaeld国际大学不来梅邮政信箱750 561 28725不来梅德国电话:+49 421 200 3587电子邮件:j。schoenwaelder@iu-不来梅德”;

description "Core type definitions for SMIng. Several type definitions are SMIng versions of similar SMIv2 or SPPI definitions.

description“SMIng的核心类型定义。一些类型定义是类似SMIv2或SPPI定义的SMIng版本。

Copyright (C) The Internet Society (2004). All Rights Reserved. This version of this module is part of RFC 3780, see the RFC itself for full legal notices.";

版权所有(C)互联网协会(2004年)。版权所有。本模块的此版本是RFC 3780的一部分,有关完整的法律通知,请参阅RFC本身。“;

    revision {
        date        "2003-12-16";
        description "Initial revision, published as RFC 3780.";
    };
        
    revision {
        date        "2003-12-16";
        description "Initial revision, published as RFC 3780.";
    };
        
    typedef Gauge32 {
        type        Unsigned32;
        description
           "The Gauge32 type represents a non-negative integer,
            which may increase or decrease, but shall never
            exceed a maximum value, nor fall below a minimum
            value.  The maximum value can not be greater than
            2^32-1 (4294967295 decimal), and the minimum value
            can not be smaller than 0.  The value of a Gauge32
            has its maximum value whenever the information
            being modeled is greater than or equal to its
            maximum value, and has its minimum value whenever
            the information being modeled is smaller than or
            equal to its minimum value.  If the information
            being modeled subsequently decreases below
            (increases above) the maximum (minimum) value, the
            Gauge32 also decreases (increases).";
        reference
           "RFC 2578, Sections 2. and 7.1.7.";
    };
        
    typedef Gauge32 {
        type        Unsigned32;
        description
           "The Gauge32 type represents a non-negative integer,
            which may increase or decrease, but shall never
            exceed a maximum value, nor fall below a minimum
            value.  The maximum value can not be greater than
            2^32-1 (4294967295 decimal), and the minimum value
            can not be smaller than 0.  The value of a Gauge32
            has its maximum value whenever the information
            being modeled is greater than or equal to its
            maximum value, and has its minimum value whenever
            the information being modeled is smaller than or
            equal to its minimum value.  If the information
            being modeled subsequently decreases below
            (increases above) the maximum (minimum) value, the
            Gauge32 also decreases (increases).";
        reference
           "RFC 2578, Sections 2. and 7.1.7.";
    };
        
    typedef Counter32 {
        type        Unsigned32;
        description
           "The Counter32 type represents a non-negative integer
            which monotonically increases until it reaches a
            maximum value of 2^32-1 (4294967295 decimal), when it
            wraps around and starts increasing again from zero.
        
    typedef Counter32 {
        type        Unsigned32;
        description
           "The Counter32 type represents a non-negative integer
            which monotonically increases until it reaches a
            maximum value of 2^32-1 (4294967295 decimal), when it
            wraps around and starts increasing again from zero.
        

Counters have no defined `initial' value, and thus, a single value of a Counter has (in general) no information content. Discontinuities in the monotonically increasing value normally occur at re-initialization of the management system, and at other times as specified in the description of an attribute using this type. If such other times can occur, for example, the creation of a class instance that contains an attribute of type Counter32 at times other than re-initialization, then a corresponding attribute should be defined, with an appropriate type, to indicate the last discontinuity. Examples of appropriate types include: TimeStamp32, TimeStamp64, DateAndTime, TimeTicks32 or TimeTicks64 (other types defined in this module).

计数器没有定义的“初始”值,因此,计数器的单个值(通常)没有信息内容。单调递增值的不连续性通常发生在管理系统重新初始化时,以及在使用该类型的属性描述中规定的其他时间。如果可能发生此类其他时间,例如,在重新初始化以外的时间创建包含Counter32类型属性的类实例,则应使用适当的类型定义相应的属性,以指示最后的不连续性。适当类型的示例包括:TimeStamp32、TimeStamp64、DateAndTime、TimeTicks32或TimeTicks64(此模块中定义的其他类型)。

The value of the access statement for attributes with a type value of Counter32 should be either `readonly' or `eventonly'.

类型值为Counter32的属性的access语句的值应为“readonly”或“eventonly”。

            A default statement should not be used for attributes
            with a type value of Counter32.";
        reference
           "RFC 2578, Sections 2. and 7.1.6.";
    };
        
            A default statement should not be used for attributes
            with a type value of Counter32.";
        reference
           "RFC 2578, Sections 2. and 7.1.6.";
    };
        
    typedef Gauge64 {
        type        Unsigned64;
        description
           "The Gauge64 type represents a non-negative integer,
            which may increase or decrease, but shall never
            exceed a maximum value, nor fall below a minimum
            value.  The maximum value can not be greater than
            2^64-1 (18446744073709551615), and the minimum value
            can not be smaller than 0.  The value of a Gauge64
            has its maximum value whenever the information
            being modeled is greater than or equal to its
            maximum value, and has its minimum value whenever
            the information being modeled is smaller than or
            equal to its minimum value.  If the information
            being modeled subsequently decreases below
            (increases above) the maximum (minimum) value, the
            Gauge64 also decreases (increases).";
    };
        
    typedef Gauge64 {
        type        Unsigned64;
        description
           "The Gauge64 type represents a non-negative integer,
            which may increase or decrease, but shall never
            exceed a maximum value, nor fall below a minimum
            value.  The maximum value can not be greater than
            2^64-1 (18446744073709551615), and the minimum value
            can not be smaller than 0.  The value of a Gauge64
            has its maximum value whenever the information
            being modeled is greater than or equal to its
            maximum value, and has its minimum value whenever
            the information being modeled is smaller than or
            equal to its minimum value.  If the information
            being modeled subsequently decreases below
            (increases above) the maximum (minimum) value, the
            Gauge64 also decreases (increases).";
    };
        
    typedef Counter64 {
        type        Unsigned64;
        description
           "The Counter64 type represents a non-negative integer
            which monotonically increases until it reaches a
            maximum value of 2^64-1 (18446744073709551615), when
            it wraps around and starts increasing again from zero.
        
    typedef Counter64 {
        type        Unsigned64;
        description
           "The Counter64 type represents a non-negative integer
            which monotonically increases until it reaches a
            maximum value of 2^64-1 (18446744073709551615), when
            it wraps around and starts increasing again from zero.
        

Counters have no defined `initial' value, and thus, a single value of a Counter has (in general) no information content. Discontinuities in the monotonically increasing value normally occur at re-initialization of the management system, and at other times as specified in the description of an attribute using this type. If such other times can occur, for example, the creation of a class instance that contains an attribute of type Counter32 at times other than re-initialization, then a corresponding attribute should be defined, with an

计数器没有定义的“初始”值,因此,计数器的单个值(通常)没有信息内容。单调递增值的不连续性通常发生在管理系统重新初始化时,以及在使用该类型的属性描述中规定的其他时间。如果在重新初始化以外的时间创建包含Counter32类型属性的类实例,则应使用

appropriate type, to indicate the last discontinuity. Examples of appropriate types include: TimeStamp32, TimeStamp64, DateAndTime, TimeTicks32 or TimeTicks64 (other types defined in this module).

适当的类型,以指示最后的不连续性。适当类型的示例包括:TimeStamp32、TimeStamp64、DateAndTime、TimeTicks32或TimeTicks64(此模块中定义的其他类型)。

The value of the access statement for attributes with a type value of Counter64 should be either `readonly' or `eventonly'.

类型值为Counter64的属性的access语句的值应为“readonly”或“eventonly”。

            A default statement should not be used for attributes
            with a type value of Counter64.";
        reference
           "RFC 2578, Sections 2. and 7.1.10.";
    };
        
            A default statement should not be used for attributes
            with a type value of Counter64.";
        reference
           "RFC 2578, Sections 2. and 7.1.10.";
    };
        
    typedef Opaque {
        type        OctetString;
        status      obsolete;
        description
           "******* THIS TYPE DEFINITION IS OBSOLETE *******
        
    typedef Opaque {
        type        OctetString;
        status      obsolete;
        description
           "******* THIS TYPE DEFINITION IS OBSOLETE *******
        

The Opaque type is provided solely for backward-compatibility, and shall not be used for newly-defined attributes and derived types.

不透明类型仅用于向后兼容,不得用于新定义的属性和派生类型。

The Opaque type supports the capability to pass arbitrary ASN.1 syntax. A value is encoded using the ASN.1 Basic Encoding Rules into a string of octets. This, in turn, is encoded as an OctetString, in effect `double-wrapping' the original ASN.1 value.

不透明类型支持传递任意ASN.1语法的能力。使用ASN.1基本编码规则将值编码为八进制字符串。反过来,它被编码为一个八进制字符串,实际上是“双重包装”原始ASN.1值。

Note that a conforming implementation need only be able to accept and recognize opaquely-encoded data. It need not be able to unwrap the data and then interpret its contents.

注意,一致性实现只需要能够接受和识别不透明编码的数据。它不需要能够展开数据,然后解释其内容。

            A requirement on `standard' modules is that no
            attribute may have a type value of Opaque and no
            type may be derived from the Opaque type.";
        reference
           "RFC 2578, Sections 2. and 7.1.9.";
    };
        
            A requirement on `standard' modules is that no
            attribute may have a type value of Opaque and no
            type may be derived from the Opaque type.";
        reference
           "RFC 2578, Sections 2. and 7.1.9.";
    };
        
    typedef IpAddress {
        type        OctetString (4);
        status      deprecated;
        description
        
    typedef IpAddress {
        type        OctetString (4);
        status      deprecated;
        description
        
           "******* THIS TYPE DEFINITION IS DEPRECATED *******
        
           "******* THIS TYPE DEFINITION IS DEPRECATED *******
        

The IpAddress type represents a 32-bit Internet IPv4 address. It is represented as an OctetString of length 4, in network byte-order.

IpAddress类型表示32位Internet IPv4地址。它表示为长度为4的八进制字符串,按网络字节顺序排列。

            Note that the IpAddress type is present for
            historical reasons.";
        reference
           "RFC 2578, Sections 2. and 7.1.5.";
    };
        
            Note that the IpAddress type is present for
            historical reasons.";
        reference
           "RFC 2578, Sections 2. and 7.1.5.";
    };
        
    typedef TimeTicks32 {
        type        Unsigned32;
        description
           "The TimeTicks32 type represents a non-negative integer
            which represents the time, modulo 2^32 (4294967296
            decimal), in hundredths of a second between two epochs.
            When attributes are defined which use this type, the
            description of the attribute identifies both of the
            reference epochs.
        
    typedef TimeTicks32 {
        type        Unsigned32;
        description
           "The TimeTicks32 type represents a non-negative integer
            which represents the time, modulo 2^32 (4294967296
            decimal), in hundredths of a second between two epochs.
            When attributes are defined which use this type, the
            description of the attribute identifies both of the
            reference epochs.
        
            For example, the TimeStamp32 type (defined in this
            module) is based on the TimeTicks32 type.";
        reference
           "RFC 2578, Sections 2. and 7.1.8.";
    };
        
            For example, the TimeStamp32 type (defined in this
            module) is based on the TimeTicks32 type.";
        reference
           "RFC 2578, Sections 2. and 7.1.8.";
    };
        
    typedef TimeTicks64 {
        type        Unsigned64;
        description
           "The TimeTicks64 type represents a non-negative integer
            which represents the time, modulo 2^64
            (18446744073709551616 decimal), in hundredths of a second
            between two epochs.  When attributes are defined which use
            this type, the description of the attribute identifies
            both of the reference epochs.
        
    typedef TimeTicks64 {
        type        Unsigned64;
        description
           "The TimeTicks64 type represents a non-negative integer
            which represents the time, modulo 2^64
            (18446744073709551616 decimal), in hundredths of a second
            between two epochs.  When attributes are defined which use
            this type, the description of the attribute identifies
            both of the reference epochs.
        
            For example, the TimeStamp64 type (defined in this
            module) is based on the TimeTicks64 type.";
    };
        
            For example, the TimeStamp64 type (defined in this
            module) is based on the TimeTicks64 type.";
    };
        
    typedef TimeStamp32 {
        type        TimeTicks32;
        description
           "The value of an associated TimeTicks32 attribute at
            which a specific occurrence happened.  The specific
            occurrence must be defined in the description of any
        
    typedef TimeStamp32 {
        type        TimeTicks32;
        description
           "The value of an associated TimeTicks32 attribute at
            which a specific occurrence happened.  The specific
            occurrence must be defined in the description of any
        

attribute defined using this type. When the specific occurrence occurred prior to the last time the associated TimeTicks32 attribute was zero, then the TimeStamp32 value is zero. Note that this requires all TimeStamp32 values to be reset to zero when the value of the associated TimeTicks32 attribute reaches 497+ days and wraps around to zero.

使用此类型定义的属性。当特定事件发生在上次关联的TimeTicks32属性为零之前时,则TimeStamp32值为零。请注意,当关联的TimeTicks32属性的值达到497天以上并变为零时,这需要将所有TimeStamp32值重置为零。

            The associated TimeTicks32 attribute should be specified
            in the description of any attribute using this type.
            If no TimeTicks32 attribute has been specified, the
            default scalar attribute sysUpTime is used.";
        reference
           "RFC 2579, Section 2.";
    };
        
            The associated TimeTicks32 attribute should be specified
            in the description of any attribute using this type.
            If no TimeTicks32 attribute has been specified, the
            default scalar attribute sysUpTime is used.";
        reference
           "RFC 2579, Section 2.";
    };
        
    typedef TimeStamp64 {
        type        TimeTicks64;
        description
           "The value of an associated TimeTicks64 attribute at which
            a specific occurrence happened.  The specific occurrence
            must be defined in the description of any attribute
            defined using this type.  When the specific occurrence
            occurred prior to the last time the associated TimeTicks64
            attribute was zero, then the TimeStamp64 value is zero.
            The associated TimeTicks64 attribute must be specified in
            the description of any attribute using this
            type. TimeTicks32 attributes must not be used as
            associated attributes.";
    };
        
    typedef TimeStamp64 {
        type        TimeTicks64;
        description
           "The value of an associated TimeTicks64 attribute at which
            a specific occurrence happened.  The specific occurrence
            must be defined in the description of any attribute
            defined using this type.  When the specific occurrence
            occurred prior to the last time the associated TimeTicks64
            attribute was zero, then the TimeStamp64 value is zero.
            The associated TimeTicks64 attribute must be specified in
            the description of any attribute using this
            type. TimeTicks32 attributes must not be used as
            associated attributes.";
    };
        
    typedef TimeInterval32 {
        type        Integer32 (0..2147483647);
        description
           "A period of time, measured in units of 0.01 seconds.
        
    typedef TimeInterval32 {
        type        Integer32 (0..2147483647);
        description
           "A period of time, measured in units of 0.01 seconds.
        
            The TimeInterval32 type uses Integer32 rather than
            Unsigned32 for compatibility with RFC 2579.";
        reference
           "RFC 2579, Section 2.";
    };
        
            The TimeInterval32 type uses Integer32 rather than
            Unsigned32 for compatibility with RFC 2579.";
        reference
           "RFC 2579, Section 2.";
    };
        
    typedef TimeInterval64 {
        type        Integer64;
        description
           "A period of time, measured in units of 0.01 seconds.
            Note that negative values are allowed.";
    };
        
    typedef TimeInterval64 {
        type        Integer64;
        description
           "A period of time, measured in units of 0.01 seconds.
            Note that negative values are allowed.";
    };
        
    typedef DateAndTime {
        type        OctetString (8 | 11);
        default     0x0000000000000000000000;
        format      "2d-1d-1d,1d:1d:1d.1d,1a1d:1d";
        description
           "A date-time specification.
        
    typedef DateAndTime {
        type        OctetString (8 | 11);
        default     0x0000000000000000000000;
        format      "2d-1d-1d,1d:1d:1d.1d,1a1d:1d";
        description
           "A date-time specification.
        
            field  octets  contents                  range
            -----  ------  --------                  -----
             1      1-2   year*                     0..65535
             2       3    month                     1..12 | 0
             3       4    day                       1..31 | 0
             4       5    hour                      0..23
             5       6    minutes                   0..59
             6       7    seconds                   0..60
                          (use 60 for leap-second)
             7       8    deci-seconds              0..9
             8       9    direction from UTC        '+' / '-'
             9      10    hours from UTC*           0..13
            10      11    minutes from UTC          0..59
        
            field  octets  contents                  range
            -----  ------  --------                  -----
             1      1-2   year*                     0..65535
             2       3    month                     1..12 | 0
             3       4    day                       1..31 | 0
             4       5    hour                      0..23
             5       6    minutes                   0..59
             6       7    seconds                   0..60
                          (use 60 for leap-second)
             7       8    deci-seconds              0..9
             8       9    direction from UTC        '+' / '-'
             9      10    hours from UTC*           0..13
            10      11    minutes from UTC          0..59
        

* Notes: - the value of year is in big-endian encoding - daylight saving time in New Zealand is +13

* 注:-年值采用大端编码-新西兰的夏令时为+13

For example, Tuesday May 26, 1992 at 1:30:15 PM EDT would be displayed as:

例如,1992年5月26日星期二美国东部夏令时下午1:30:15将显示为:

                         1992-5-26,13:30:15.0,-4:0
        
                         1992-5-26,13:30:15.0,-4:0
        

Note that if only local time is known, then timezone information (fields 8-10) is not present.

请注意,如果只知道本地时间,则时区信息(字段8-10)不存在。

            The two special values of 8 or 11 zero bytes denote an
            unknown date-time specification.";
        reference
           "RFC 2579, Section 2.";
    };
        
            The two special values of 8 or 11 zero bytes denote an
            unknown date-time specification.";
        reference
           "RFC 2579, Section 2.";
    };
        
    typedef TruthValue {
        type        Enumeration (true(1), false(2));
        description
           "Represents a boolean value.";
        reference
           "RFC 2579, Section 2.";
    };
        
    typedef TruthValue {
        type        Enumeration (true(1), false(2));
        description
           "Represents a boolean value.";
        reference
           "RFC 2579, Section 2.";
    };
        

typedef PhysAddress {

typedef Physadress{

        type        OctetString;
        format      "1x:";
        description
           "Represents media- or physical-level addresses.";
        reference
           "RFC 2579, Section 2.";
    };
        
        type        OctetString;
        format      "1x:";
        description
           "Represents media- or physical-level addresses.";
        reference
           "RFC 2579, Section 2.";
    };
        
    typedef MacAddress {
        type        OctetString (6);
        format      "1x:";
        description
           "Represents an IEEE 802 MAC address represented in the
            `canonical' order defined by IEEE 802.1a, i.e., as if it
            were transmitted least significant bit first, even though
            802.5 (in contrast to other 802.x protocols) requires MAC
            addresses to be transmitted most significant bit first.";
        reference
           "RFC 2579, Section 2.";
    };
        
    typedef MacAddress {
        type        OctetString (6);
        format      "1x:";
        description
           "Represents an IEEE 802 MAC address represented in the
            `canonical' order defined by IEEE 802.1a, i.e., as if it
            were transmitted least significant bit first, even though
            802.5 (in contrast to other 802.x protocols) requires MAC
            addresses to be transmitted most significant bit first.";
        reference
           "RFC 2579, Section 2.";
    };
        
    // The DisplayString definition below does not impose a size
    // restriction and is thus not the same as the DisplayString
    // definition in RFC 2579. The DisplayString255 definition is
    // provided for mapping purposes.
        
    // The DisplayString definition below does not impose a size
    // restriction and is thus not the same as the DisplayString
    // definition in RFC 2579. The DisplayString255 definition is
    // provided for mapping purposes.
        
    typedef DisplayString {
        type        OctetString;
        format      "1a";
        description
           "Represents textual information taken from the NVT ASCII
            character set, as defined in pages 4, 10-11 of RFC 854.
        
    typedef DisplayString {
        type        OctetString;
        format      "1a";
        description
           "Represents textual information taken from the NVT ASCII
            character set, as defined in pages 4, 10-11 of RFC 854.
        

To summarize RFC 854, the NVT ASCII repertoire specifies:

总结RFC 854,NVT ASCII指令表规定:

- the use of character codes 0-127 (decimal)

- 使用字符代码0-127(十进制)

- the graphics characters (32-126) are interpreted as US ASCII

- 图形字符(32-126)被解释为US ASCII

- NUL, LF, CR, BEL, BS, HT, VT and FF have the special meanings specified in RFC 854

- NUL、LF、CR、BEL、BS、HT、VT和FF具有RFC 854中规定的特殊含义

- the other 25 codes have no standard interpretation

- 其他25个代码没有标准解释

- the sequence 'CR LF' means newline

- 序列“CR LF”表示换行

- the sequence 'CR NUL' means carriage-return

- 序列“CR NUL”表示回车

- an 'LF' not preceded by a 'CR' means moving to the same column on the next line.

- 前面没有“CR”的“LF”表示移动到下一行的同一列。

             - the sequence 'CR x' for any x other than LF or NUL is
               illegal.  (Note that this also means that a string may
               end with either 'CR LF' or 'CR NUL', but not with CR.)
        ";
    };
        
             - the sequence 'CR x' for any x other than LF or NUL is
               illegal.  (Note that this also means that a string may
               end with either 'CR LF' or 'CR NUL', but not with CR.)
        ";
    };
        
    typedef DisplayString255 {
        type        DisplayString (0..255);
        description
           "A DisplayString with a maximum length of 255 characters.
            Any attribute defined using this syntax may not exceed 255
            characters in length.
        
    typedef DisplayString255 {
        type        DisplayString (0..255);
        description
           "A DisplayString with a maximum length of 255 characters.
            Any attribute defined using this syntax may not exceed 255
            characters in length.
        
            The DisplayString255 type has the same semantics as the
            DisplayString textual convention defined in RFC 2579.";
        reference
           "RFC 2579, Section 2.";
    };
        
            The DisplayString255 type has the same semantics as the
            DisplayString textual convention defined in RFC 2579.";
        reference
           "RFC 2579, Section 2.";
    };
        
    // The Utf8String and Utf8String255 definitions below facilitate
    // internationalization. The definition is consistent with the
    // definition of SnmpAdminString in RFC 2571.
        
    // The Utf8String and Utf8String255 definitions below facilitate
    // internationalization. The definition is consistent with the
    // definition of SnmpAdminString in RFC 2571.
        
    typedef Utf8String {
        type        OctetString;
        format      "65535t";      // is there a better way ?
        description
           "A human readable string represented using the ISO/IEC IS
            10646-1 character set, encoded as an octet string using
            the UTF-8 transformation format described in RFC 3629.
        
    typedef Utf8String {
        type        OctetString;
        format      "65535t";      // is there a better way ?
        description
           "A human readable string represented using the ISO/IEC IS
            10646-1 character set, encoded as an octet string using
            the UTF-8 transformation format described in RFC 3629.
        

Since additional code points are added by amendments to the 10646 standard from time to time, implementations must be prepared to encounter any code point from 0x00000000 to 0x7fffffff. Byte sequences that do not correspond to the valid UTF-8 encoding of a code point or are outside this range are prohibited.

由于额外的代码点是通过对10646标准的不时修订而添加的,因此实现必须准备好遇到从0x00000000到0x7FFFFF的任何代码点。禁止与代码点的有效UTF-8编码不对应或超出此范围的字节序列。

The use of control codes should be avoided. When it is necessary to represent a newline, the control code sequence CR LF should be used.

应避免使用控制代码。当需要表示换行时,应使用控制代码序列CR LF。

The use of leading or trailing white space should be avoided.

应避免使用前导或尾随空格。

For code points not directly supported by user interface hardware or software, an alternative means of entry and display, such as hexadecimal, may be provided.

对于用户界面硬件或软件不直接支持的代码点,可提供其他输入和显示方式,如十六进制。

For information encoded in 7-bit US-ASCII, the UTF-8 encoding is identical to the US-ASCII encoding.

对于以7位US-ASCII编码的信息,UTF-8编码与US-ASCII编码相同。

            UTF-8 may require multiple bytes to represent a single
            character / code point; thus the length of a Utf8String in
            octets may be different from the number of characters
            encoded.  Similarly, size constraints refer to the number
            of encoded octets, not the number of characters
            represented by an encoding.";
    };
        
            UTF-8 may require multiple bytes to represent a single
            character / code point; thus the length of a Utf8String in
            octets may be different from the number of characters
            encoded.  Similarly, size constraints refer to the number
            of encoded octets, not the number of characters
            represented by an encoding.";
    };
        
    typedef Utf8String255 {
        type        Utf8String (0..255);
        format      "255t";
        description
           "A Utf8String with a maximum length of 255 octets.  Note
            that the size of an Utf8String is measured in octets, not
            characters.";
    };
        
    typedef Utf8String255 {
        type        Utf8String (0..255);
        format      "255t";
        description
           "A Utf8String with a maximum length of 255 octets.  Note
            that the size of an Utf8String is measured in octets, not
            characters.";
    };
        
    identity null {
        description
           "An identity used to represent null pointer values.";
    };
        
    identity null {
        description
           "An identity used to represent null pointer values.";
    };
        

};

};

Appendix B. SMIng ABNF Grammar
附录B.SMIng ABNF语法

The SMIng grammar conforms to the Augmented Backus-Naur Form (ABNF) [RFC2234].

SMIng语法符合扩充的Backus-Naur形式(ABNF)[RFC2234]。

;;
;; sming.abnf -- SMIng grammar in ABNF notation (RFC 2234).
;;
;; @(#) $Id: sming.abnf,v 1.33 2003/10/23 19:31:55 strauss Exp $
;;
;; Copyright (C) The Internet Society (2004). All Rights Reserved.
;;
        
;;
;; sming.abnf -- SMIng grammar in ABNF notation (RFC 2234).
;;
;; @(#) $Id: sming.abnf,v 1.33 2003/10/23 19:31:55 strauss Exp $
;;
;; Copyright (C) The Internet Society (2004). All Rights Reserved.
;;
        

smingFile = optsep *(moduleStatement optsep)

smingFile=optsep*(moduleStatement optsep)

;; ;; Statement rules.

;; ;; 语句规则。

;;

;;

moduleStatement = moduleKeyword sep ucIdentifier optsep "{" stmtsep *(importStatement stmtsep) organizationStatement stmtsep contactStatement stmtsep descriptionStatement stmtsep *1(referenceStatement stmtsep) 1*(revisionStatement stmtsep) *(extensionStatement stmtsep) *(typedefStatement stmtsep) *(identityStatement stmtsep) *(classStatement stmtsep) "}" optsep ";"

moduleStatement=moduleKeyword sep ucIdentifier optsep“{”STMTSP*(导入语句STMTSP)组织语句STMTSP contactStatement STMTSP Description语句STMTSP*1*(引用语句STMTSP)1*(修订语句STMTSP)*(扩展语句STMTSP)*(类型定义语句STMTSP)*(标识语句STMTSP)*(类语句stmtsep)}“optsep”

extensionStatement = extensionKeyword sep lcIdentifier optsep "{" stmtsep statusStatement stmtsep descriptionStatement stmtsep *1(referenceStatement stmtsep) *1(abnfStatement stmtsep) "}" optsep ";"

extensionStatement=extensionKeyword sep lcIdentifier optsep“{”STMTSP状态语句STMTSP描述语句STMTSP*1(引用语句STMTSP)*1(异常语句STMTSP)“}”optsep

typedefStatement        = typedefKeyword sep ucIdentifier optsep
                              "{" stmtsep
                              typedefTypeStatement stmtsep
                              *1(defaultStatement stmtsep)
                              *1(formatStatement stmtsep)
                              *1(unitsStatement stmtsep)
                              statusStatement stmtsep
                              descriptionStatement stmtsep
                              *1(referenceStatement stmtsep)
                          "}" optsep ";"
        
typedefStatement        = typedefKeyword sep ucIdentifier optsep
                              "{" stmtsep
                              typedefTypeStatement stmtsep
                              *1(defaultStatement stmtsep)
                              *1(formatStatement stmtsep)
                              *1(unitsStatement stmtsep)
                              statusStatement stmtsep
                              descriptionStatement stmtsep
                              *1(referenceStatement stmtsep)
                          "}" optsep ";"
        

identityStatement = identityStmtKeyword sep lcIdentifier optsep "{" stmtsep *1(parentStatement stmtsep) statusStatement stmtsep descriptionStatement stmtsep *1(referenceStatement stmtsep) "}" optsep ";"

identityStatement=identitystmtsep关键字lIdentifier optsep“{”stmtsep*1(parentStatement stmtsep)statusStatement stmtsep descriptionStatement stmtsep*1(referenceStatement stmtsep)”}“optsep”

classStatement          = classKeyword sep ucIdentifier optsep
                              "{" stmtsep
                              *1(extendsStatement stmtsep)
                              *(attributeStatement stmtsep)
                              *1(uniqueStatement stmtsep)
        
classStatement          = classKeyword sep ucIdentifier optsep
                              "{" stmtsep
                              *1(extendsStatement stmtsep)
                              *(attributeStatement stmtsep)
                              *1(uniqueStatement stmtsep)
        

*(eventStatement stmtsep) statusStatement stmtsep descriptionStatement stmtsep *1(referenceStatement stmtsep) "}" optsep ";"

*(eventStatement stmtsep)Statement stmtsep descriptionStatement stmtsep*1(referenceStatement stmtsep)}“optsep”

attributeStatement      = attributeKeyword sep
                              lcIdentifier optsep
                              "{" stmtsep
                              typeStatement stmtsep
                              *1(accessStatement stmtsep)
                              *1(defaultStatement stmtsep)
                              *1(formatStatement stmtsep)
                              *1(unitsStatement stmtsep)
                              statusStatement stmtsep
                              descriptionStatement stmtsep
                              *1(referenceStatement stmtsep)
                          "}" optsep ";"
        
attributeStatement      = attributeKeyword sep
                              lcIdentifier optsep
                              "{" stmtsep
                              typeStatement stmtsep
                              *1(accessStatement stmtsep)
                              *1(defaultStatement stmtsep)
                              *1(formatStatement stmtsep)
                              *1(unitsStatement stmtsep)
                              statusStatement stmtsep
                              descriptionStatement stmtsep
                              *1(referenceStatement stmtsep)
                          "}" optsep ";"
        

uniqueStatement = uniqueKeyword optsep "(" optsep qlcIdentifierList optsep ")" optsep ";"

uniqueStatement=uniqueKeyword optsep(“optsep qlcIdentifierList optsep”)“optsep”

eventStatement = eventKeyword sep lcIdentifier optsep "{" stmtsep statusStatement stmtsep descriptionStatement stmtsep *1(referenceStatement stmtsep) "}" optsep ";"

eventStatement=eventKeyword sep lcIdentifier optsep“{”STMTSP状态语句STMTSP描述语句STMTSP*1(引用语句STMTSP)}”optsep

importStatement = importKeyword sep ucIdentifier optsep "(" optsep identifierList optsep ")" optsep ";"

importStatement=ImportSep关键字ucIdentifier optsep”(“optsep标识符列表optsep”)“optsep”

revisionStatement = revisionKeyword optsep "{" stmtsep dateStatement stmtsep descriptionStatement stmtsep "}" optsep ";"

revisionStatement=revisionKeyword optsep“{”STMTSP日期语句STMTSP描述语句STMTSP“}”optsep

typedefTypeStatement = typeKeyword sep refinedBaseType optsep ";"

typedefTypeStatement=typeKeyword sep DefinedBasetype optsep“

typeStatement = typeKeyword sep (refinedBaseType / refinedType) optsep ";"

typeStatement=typeKeyword sep(refinedBaseType/refinedType)optsep“

parentStatement = parentKeyword sep qlcIdentifier optsep ";"

parentStatement=parentKeyword sep qlcIdentifier optsep“

extendsStatement = extendsKeyword sep qucIdentifier optsep ";"

extendsStatement=extendsSep关键字限定符optsep“

dateStatement = dateKeyword sep date optsep ";"

dateStatement=dateKeyword sep date optsep“

organizationStatement = organizationKeyword sep text optsep ";"

organizationStatement=organizationKeyword sep text optsep“

contactStatement = contactKeyword sep text optsep ";"

contactStatement=contactKeyword sep text optsep“

formatStatement = formatKeyword sep format optsep ";"

formatStatement=formatKeyword sep format optsep“

unitsStatement = unitsKeyword sep units optsep ";"

unitsStatement=unitsKeyword sep单位optsep”

statusStatement = statusKeyword sep status optsep ";"

statusStatement=statusKeyword sep status optsep“

accessStatement = accessKeyword sep access optsep ";"

accessStatement=accessKeyword sep access optsep“

defaultStatement = defaultKeyword sep anyValue optsep ";"

defaultStatement=defaultKeyword sep anyValue optsep“

descriptionStatement = descriptionKeyword sep text optsep ";"

descriptionStatement=descriptionKeyword sep text optsep“

referenceStatement = referenceKeyword sep text optsep ";"

referenceStatement=referenceKeyword sep text optsep“

abnfStatement = abnfKeyword sep text optsep ";"

ABNFSTATENT=abnfKeyword sep text optsep”

;;
;;
;;
        
;;
;;
;;
        
refinedBaseType         = ObjectIdentifierKeyword /
                          OctetStringKeyword *1(optsep numberSpec) /
                          PointerKeyword *1(optsep pointerSpec) /
                          Integer32Keyword *1(optsep numberSpec) /
                          Unsigned32Keyword *1(optsep numberSpec) /
                          Integer64Keyword *1(optsep numberSpec) /
                          Unsigned64Keyword *1(optsep numberSpec) /
                          Float32Keyword *1(optsep floatSpec) /
                          Float64Keyword *1(optsep floatSpec) /
                          Float128Keyword *1(optsep floatSpec) /
                          EnumerationKeyword
                                      optsep namedSignedNumberSpec /
                          BitsKeyword optsep namedNumberSpec
        
refinedBaseType         = ObjectIdentifierKeyword /
                          OctetStringKeyword *1(optsep numberSpec) /
                          PointerKeyword *1(optsep pointerSpec) /
                          Integer32Keyword *1(optsep numberSpec) /
                          Unsigned32Keyword *1(optsep numberSpec) /
                          Integer64Keyword *1(optsep numberSpec) /
                          Unsigned64Keyword *1(optsep numberSpec) /
                          Float32Keyword *1(optsep floatSpec) /
                          Float64Keyword *1(optsep floatSpec) /
                          Float128Keyword *1(optsep floatSpec) /
                          EnumerationKeyword
                                      optsep namedSignedNumberSpec /
                          BitsKeyword optsep namedNumberSpec
        
refinedType             = qucIdentifier *1(optsep anySpec)
        
refinedType             = qucIdentifier *1(optsep anySpec)
        
anySpec                 = pointerSpec / numberSpec / floatSpec
        
anySpec                 = pointerSpec / numberSpec / floatSpec
        

pointerSpec = "(" optsep qlcIdentifier optsep ")"

pointerSpec=“(“optsep qlcIdentifier optsep”)”

numberSpec = "(" optsep numberElement *furtherNumberElement optsep ")"

numberSpec=“(“optsep NumberRelation*进一步的NumberRelation optsep”)”

furtherNumberElement = optsep "|" optsep numberElement

进一步的NumberRelation=optsep“|”optsep NumberRelation

numberElement = signedNumber *1numberUpperLimit

NumberRelation=signedNumber*1numberUpperLimit

numberUpperLimit = optsep ".." optsep signedNumber

numberUpperLimit=optsep“.”optsep signedNumber

floatSpec = "(" optsep floatElement *furtherFloatElement optsep ")"

floatSpec=“(“optsep浮动元素*进一步浮动元素optsep”)”

furtherFloatElement = optsep "|" optsep floatElement

进一步浮动元素=optsep“|”optsep浮动元素

floatElement = floatValue *1floatUpperLimit

浮动元素=浮动值*1floatUpperLimit

floatUpperLimit = optsep ".." optsep floatValue

浮动上限=optsep“.”optsep浮动值

namedNumberSpec = "(" optsep namedNumberList optsep ")"

namedNumberSpec=“(“optsep namedNumberList optsep”)”

namedNumberList = namedNumberItem *(optsep "," optsep namedNumberItem)

namedNumberList=namedNumberItem*(optsep”、“optsep namedNumberItem)

namedNumberItem = lcIdentifier optsep "(" optsep number optsep ")"

namedNumberItem=lcIdentifier optsep”(“optsep编号optsep”)“

namedSignedNumberSpec = "(" optsep namedSignedNumberList optsep ")"

namedSignedNumberSpec=“(“optsep namedSignedNumberList optsep”)”

namedSignedNumberList = namedSignedNumberItem *(optsep "," optsep namedSignedNumberItem)

namedSignedNumberList=namedSignedNumberItem*(optsep”,“optsep namedSignedNumberItem)

namedSignedNumberItem = lcIdentifier optsep "(" optsep signedNumber optsep ")"

namedSignedNumberItem=lcIdentifier optsep”(“optsep signedNumber optsep”)“

identifierList = identifier *(optsep "," optsep identifier)

identifierList=标识符*(optsep”,“optsep标识符)

qIdentifierList = qIdentifier *(optsep "," optsep qIdentifier)

qIdentifierList=Qidentier*(optsep”、“optsep Qidentier)

qlcIdentifierList = qlcIdentifier *(optsep "," optsep qlcIdentifier)

qlcIdentifierList=qlcIdentifier*(optsep”、“optsep qlcIdentifier)

bitsValue = "(" optsep bitsList optsep ")"

bitsValue=“(“optsep位列表optsep”)”

bitsList                = *1(lcIdentifier
                              *(optsep "," optsep lcIdentifier))
        
bitsList                = *1(lcIdentifier
                              *(optsep "," optsep lcIdentifier))
        
;;
;; Other basic rules.
;;
        
;;
;; Other basic rules.
;;
        
identifier              = ucIdentifier / lcIdentifier
        
identifier              = ucIdentifier / lcIdentifier
        
qIdentifier             = qucIdentifier / qlcIdentifier
        
qIdentifier             = qucIdentifier / qlcIdentifier
        
ucIdentifier            = ucAlpha *63(ALPHA / DIGIT / "-")
        
ucIdentifier            = ucAlpha *63(ALPHA / DIGIT / "-")
        
qucIdentifier           = *1(ucIdentifier "::") ucIdentifier
        
qucIdentifier           = *1(ucIdentifier "::") ucIdentifier
        
lcIdentifier            = lcAlpha *63(ALPHA / DIGIT / "-")
        
lcIdentifier            = lcAlpha *63(ALPHA / DIGIT / "-")
        
qlcIdentifier           = *1(ucIdentifier "::") lcIdentifier
        
qlcIdentifier           = *1(ucIdentifier "::") lcIdentifier
        

attrIdentifier = lcIdentifier *("." lcIdentifier)

属性标识符=lcIdentifier*(“”lcIdentifier)

qattrIdentifier         = *1(ucIdentifier ".") attrIdentifier
        
qattrIdentifier         = *1(ucIdentifier ".") attrIdentifier
        

cattrIdentifier = ucIdentifier "." lcIdentifier *("." lcIdentifier)

cattrIdentifier=ucidentier.“.lcidentier*(“.lcidentier”)

qcattrIdentifier = qucIdentifier "." lcIdentifier *("." lcIdentifier)

qcattrIdentifier=qcidentifier.“.lcIdentifier*(“.lcIdentifier”)

text = textSegment *(optsep textSegment)

text=textSegment*(optsep textSegment)

textSegment = DQUOTE *textAtom DQUOTE ; See Section 4.2.

textSegment=DQUOTE*textAtom-DQUOTE;见第4.2节。

textAtom                = textVChar / HTAB / SP / lineBreak
        
textAtom                = textVChar / HTAB / SP / lineBreak
        

date = DQUOTE 4DIGIT "-" 2DIGIT "-" 2DIGIT *1(" " 2DIGIT ":" 2DIGIT) DQUOTE ; always in UTC

日期=DQUOTE 4数字“-”2数字“-”2数字*1(“2数字”:“2数字”)DQUOTE;始终使用UTC

format                  = textSegment
        
format                  = textSegment
        
units                   = textSegment
        
units                   = textSegment
        

anyValue = bitsValue / signedNumber / hexadecimalNumber /

anyValue=位值/签名数/十六进制数/

                          floatValue /
                          text /
                          objectIdentifier
                          ; Note: `objectIdentifier' includes the
                          ; syntax of enumeration labels and
                          ; identities.
                          ; They are not named literally to
                          ; avoid reduce/reduce conflicts when
                          ; building LR parsers based on this
                          ; grammar.
        
                          floatValue /
                          text /
                          objectIdentifier
                          ; Note: `objectIdentifier' includes the
                          ; syntax of enumeration labels and
                          ; identities.
                          ; They are not named literally to
                          ; avoid reduce/reduce conflicts when
                          ; building LR parsers based on this
                          ; grammar.
        

status = currentKeyword / deprecatedKeyword / obsoleteKeyword

状态=currentKeyword/deprecatedKeyword/obsoleteKeyword

access = eventonlyKeyword / readonlyKeyword / readwriteKeyword

access=eventonlyKeyword/readonlyKeyword/readwriteKeyword

objectIdentifier        = (qlcIdentifier / subid "." subid)
                              *127("." subid)
        
objectIdentifier        = (qlcIdentifier / subid "." subid)
                              *127("." subid)
        
subid                   = decimalNumber
        
subid                   = decimalNumber
        
number                  = hexadecimalNumber / decimalNumber
        
number                  = hexadecimalNumber / decimalNumber
        

negativeNumber = "-" decimalNumber

NegativeEnumber=“-”小数

signedNumber            = number / negativeNumber
        
signedNumber            = number / negativeNumber
        
decimalNumber           = "0" / (nonZeroDigit *DIGIT)
        
decimalNumber           = "0" / (nonZeroDigit *DIGIT)
        
zeroDecimalNumber       = 1*DIGIT
        
zeroDecimalNumber       = 1*DIGIT
        
hexadecimalNumber       = %x30 %x78 ; "0x" with x only lower-case
                          1*(HEXDIG HEXDIG)
        
hexadecimalNumber       = %x30 %x78 ; "0x" with x only lower-case
                          1*(HEXDIG HEXDIG)
        
floatValue              = neginfKeyword /
                          posinfKeyword /
                          snanKeyword /
                          qnanKeyword /
                          signedNumber "." zeroDecimalNumber
                              *1("E" ("+"/"-") zeroDecimalNumber)
        
floatValue              = neginfKeyword /
                          posinfKeyword /
                          snanKeyword /
                          qnanKeyword /
                          signedNumber "." zeroDecimalNumber
                              *1("E" ("+"/"-") zeroDecimalNumber)
        
;;
;; Rules to skip unknown statements
;; with arbitrary arguments and blocks.
;;
        
;;
;; Rules to skip unknown statements
;; with arbitrary arguments and blocks.
;;
        

unknownStatement = unknownKeyword optsep *unknownArgument optsep ";"

unknownStatement=unknownKeyword optsep*unknownArgument optsep”

unknownArgument         = ("(" optsep unknownList optsep ")") /
                          ("{" optsep *unknownStatement optsep "}") /
                          qucIdentifier /
                          anyValue /
                          anySpec
        
unknownArgument         = ("(" optsep unknownList optsep ")") /
                          ("{" optsep *unknownStatement optsep "}") /
                          qucIdentifier /
                          anyValue /
                          anySpec
        

unknownList = namedNumberList / qIdentifierList

unknownList=namedNumber列表/QIIdentifierList

unknownKeyword          = lcIdentifier
        
unknownKeyword          = lcIdentifier
        
;;
;; Keyword rules.
;;
;; Typically, keywords are represented by tokens returned from the
;; lexical analyzer.  Note, that the lexer has to be stateful to
;; distinguish keywords from identifiers depending on the context
;; position in the input stream.
;;
        
;;
;; Keyword rules.
;;
;; Typically, keywords are represented by tokens returned from the
;; lexical analyzer.  Note, that the lexer has to be stateful to
;; distinguish keywords from identifiers depending on the context
;; position in the input stream.
;;
        
moduleKeyword       =  %x6D %x6F %x64 %x75 %x6C %x65
importKeyword       =  %x69 %x6D %x70 %x6F %x72 %x74
revisionKeyword     =  %x72 %x65 %x76 %x69 %x73 %x69 %x6F %x6E
dateKeyword         =  %x64 %x61 %x74 %x65
organizationKeyword =  %x6F %x72 %x67 %x61 %x6E %x69 %x7A %x61 %x74
                       %x69 %x6F %x6E
contactKeyword      =  %x63 %x6F %x6E %x74 %x61 %x63 %x74
descriptionKeyword  =  %x64 %x65 %x73 %x63 %x72 %x69 %x70 %x74 %x69
                       %x6F %x6E
referenceKeyword    =  %x72 %x65 %x66 %x65 %x72 %x65 %x6E %x63 %x65
extensionKeyword    =  %x65 %x78 %x74 %x65 %x6E %x73 %x69 %x6F %x6E
typedefKeyword      =  %x74 %x79 %x70 %x65 %x64 %x65 %x66
typeKeyword         =  %x74 %x79 %x70 %x65
parentKeyword       =  %x70 %x61 %x72 %x65 %x6E %x74
identityStmtKeyword =  %x69 %x64 %x65 %x6E %x74 %x69 %x74 %x79
classKeyword        =  %x63 %x6C %x61 %x73 %x73
extendsKeyword      =  %x65 %x78 %x74 %x65 %x6E %x64 %x73
attributeKeyword    =  %x61 %x74 %x74 %x72 %x69 %x62 %x75 %x74 %x65
uniqueKeyword       =  %x75 %x6E %x69 %x71 %x75 %x65
eventKeyword        =  %x65 %x76 %x65 %x6E %x74
formatKeyword       =  %x66 %x6F %x72 %x6D %x61 %x74
unitsKeyword        =  %x75 %x6E %x69 %x74 %x73
statusKeyword       =  %x73 %x74 %x61 %x74 %x75 %x73
accessKeyword       =  %x61 %x63 %x63 %x65 %x73 %x73
defaultKeyword      =  %x64 %x65 %x66 %x61 %x75 %x6C %x74
        
moduleKeyword       =  %x6D %x6F %x64 %x75 %x6C %x65
importKeyword       =  %x69 %x6D %x70 %x6F %x72 %x74
revisionKeyword     =  %x72 %x65 %x76 %x69 %x73 %x69 %x6F %x6E
dateKeyword         =  %x64 %x61 %x74 %x65
organizationKeyword =  %x6F %x72 %x67 %x61 %x6E %x69 %x7A %x61 %x74
                       %x69 %x6F %x6E
contactKeyword      =  %x63 %x6F %x6E %x74 %x61 %x63 %x74
descriptionKeyword  =  %x64 %x65 %x73 %x63 %x72 %x69 %x70 %x74 %x69
                       %x6F %x6E
referenceKeyword    =  %x72 %x65 %x66 %x65 %x72 %x65 %x6E %x63 %x65
extensionKeyword    =  %x65 %x78 %x74 %x65 %x6E %x73 %x69 %x6F %x6E
typedefKeyword      =  %x74 %x79 %x70 %x65 %x64 %x65 %x66
typeKeyword         =  %x74 %x79 %x70 %x65
parentKeyword       =  %x70 %x61 %x72 %x65 %x6E %x74
identityStmtKeyword =  %x69 %x64 %x65 %x6E %x74 %x69 %x74 %x79
classKeyword        =  %x63 %x6C %x61 %x73 %x73
extendsKeyword      =  %x65 %x78 %x74 %x65 %x6E %x64 %x73
attributeKeyword    =  %x61 %x74 %x74 %x72 %x69 %x62 %x75 %x74 %x65
uniqueKeyword       =  %x75 %x6E %x69 %x71 %x75 %x65
eventKeyword        =  %x65 %x76 %x65 %x6E %x74
formatKeyword       =  %x66 %x6F %x72 %x6D %x61 %x74
unitsKeyword        =  %x75 %x6E %x69 %x74 %x73
statusKeyword       =  %x73 %x74 %x61 %x74 %x75 %x73
accessKeyword       =  %x61 %x63 %x63 %x65 %x73 %x73
defaultKeyword      =  %x64 %x65 %x66 %x61 %x75 %x6C %x74
        
abnfKeyword         =  %x61 %x62 %x6E %x66
        
abnfKeyword         =  %x61 %x62 %x6E %x66
        

;; Base type keywords.

;; 基本类型关键字。

OctetStringKeyword  =  %x4F %x63 %x74 %x65 %x74 %x53 %x74 %x72 %x69
                       %x6E %x67
PointerKeyword      =  %x50 %x6F %x69 %x6E %x74 %x65 %x72
ObjectIdentifierKeyword  =  %x4F %x62 %x6A %x65 %x63 %x74 %x49 %x64
                       %x65 %x6E %x74 %x69 %x66 %x69 %x65 %x72
Integer32Keyword    =  %x49 %x6E %x74 %x65 %x67 %x65 %x72 %x33 %x32
Unsigned32Keyword   =  %x55 %x6E %x73 %x69 %x67 %x6E %x65 %x64 %x33
                       %x32
Integer64Keyword    =  %x49 %x6E %x74 %x65 %x67 %x65 %x72 %x36 %x34
Unsigned64Keyword   =  %x55 %x6E %x73 %x69 %x67 %x6E %x65 %x64 %x36
                       %x34
Float32Keyword      =  %x46 %x6C %x6F %x61 %x74 %x33 %x32
Float64Keyword      =  %x46 %x6C %x6F %x61 %x74 %x36 %x34
Float128Keyword     =  %x46 %x6C %x6F %x61 %x74 %x31 %x32 %x38
BitsKeyword         =  %x42 %x69 %x74 %x73
EnumerationKeyword  =  %x45 %x6E %x75 %x6D %x65 %x72 %x61 %x74 %x69
                       %x6F %x6E
        
OctetStringKeyword  =  %x4F %x63 %x74 %x65 %x74 %x53 %x74 %x72 %x69
                       %x6E %x67
PointerKeyword      =  %x50 %x6F %x69 %x6E %x74 %x65 %x72
ObjectIdentifierKeyword  =  %x4F %x62 %x6A %x65 %x63 %x74 %x49 %x64
                       %x65 %x6E %x74 %x69 %x66 %x69 %x65 %x72
Integer32Keyword    =  %x49 %x6E %x74 %x65 %x67 %x65 %x72 %x33 %x32
Unsigned32Keyword   =  %x55 %x6E %x73 %x69 %x67 %x6E %x65 %x64 %x33
                       %x32
Integer64Keyword    =  %x49 %x6E %x74 %x65 %x67 %x65 %x72 %x36 %x34
Unsigned64Keyword   =  %x55 %x6E %x73 %x69 %x67 %x6E %x65 %x64 %x36
                       %x34
Float32Keyword      =  %x46 %x6C %x6F %x61 %x74 %x33 %x32
Float64Keyword      =  %x46 %x6C %x6F %x61 %x74 %x36 %x34
Float128Keyword     =  %x46 %x6C %x6F %x61 %x74 %x31 %x32 %x38
BitsKeyword         =  %x42 %x69 %x74 %x73
EnumerationKeyword  =  %x45 %x6E %x75 %x6D %x65 %x72 %x61 %x74 %x69
                       %x6F %x6E
        

;; Status keywords.

;; 状态关键字。

currentKeyword      =  %x63 %x75 %x72 %x72 %x65 %x6E %x74
deprecatedKeyword   =  %x64 %x65 %x70 %x72 %x65 %x63 %x61 %x74 %x65
                       %x64
obsoleteKeyword     =  %x6F %x62 %x73 %x6F %x6C %x65 %x74 %x65
        
currentKeyword      =  %x63 %x75 %x72 %x72 %x65 %x6E %x74
deprecatedKeyword   =  %x64 %x65 %x70 %x72 %x65 %x63 %x61 %x74 %x65
                       %x64
obsoleteKeyword     =  %x6F %x62 %x73 %x6F %x6C %x65 %x74 %x65
        

;; Access keywords.

;; 访问关键字。

eventonlyKeyword    =  %x65 %x76 %x65 %x6E %x74 %x6F %x6E %x6C %x79
readonlyKeyword     =  %x72 %x65 %x61 %x64 %x6F %x6E %x6C %x79
readwriteKeyword    =  %x72 %x65 %x61 %x64 %x77 %x72 %x69 %x74 %x65
        
eventonlyKeyword    =  %x65 %x76 %x65 %x6E %x74 %x6F %x6E %x6C %x79
readonlyKeyword     =  %x72 %x65 %x61 %x64 %x6F %x6E %x6C %x79
readwriteKeyword    =  %x72 %x65 %x61 %x64 %x77 %x72 %x69 %x74 %x65
        

;; Special floating point values' keywords.

;; 特殊浮点值的关键字。

neginfKeyword       =  %x6E %x65 %x67 %x69 %x6E %x66
posinfKeyword       =  %x70 %x6F %x73 %x69 %x6E %x66
snanKeyword         =  %x73 %x6E %x61 %x6E
qnanKeyword         =  %x71 %x6E %x61 %x6E
        
neginfKeyword       =  %x6E %x65 %x67 %x69 %x6E %x66
posinfKeyword       =  %x70 %x6F %x73 %x69 %x6E %x66
snanKeyword         =  %x73 %x6E %x61 %x6E
qnanKeyword         =  %x71 %x6E %x61 %x6E
        
;;
;; Some low level rules.
;; These tokens are typically skipped by the lexical analyzer.
;;
        
;;
;; Some low level rules.
;; These tokens are typically skipped by the lexical analyzer.
;;
        
sep                     = 1*(comment / lineBreak / WSP)
                          ; unconditional separator
        
sep                     = 1*(comment / lineBreak / WSP)
                          ; unconditional separator
        
optsep                  = *(comment / lineBreak / WSP)
        
optsep                  = *(comment / lineBreak / WSP)
        
stmtsep                 = *(comment /
                            lineBreak /
                            WSP /
                            unknownStatement)
        
stmtsep                 = *(comment /
                            lineBreak /
                            WSP /
                            unknownStatement)
        
comment                 = "//" *(WSP / VCHAR) lineBreak
        
comment                 = "//" *(WSP / VCHAR) lineBreak
        
lineBreak               = CRLF / LF
        
lineBreak               = CRLF / LF
        
;;
;; Encoding specific rules.
;;
        
;;
;; Encoding specific rules.
;;
        
textVChar               = %x21 / %x23-7E
                          ; any VCHAR except DQUOTE
        
textVChar               = %x21 / %x23-7E
                          ; any VCHAR except DQUOTE
        
ucAlpha                 = %x41-5A
        
ucAlpha                 = %x41-5A
        
lcAlpha                 = %x61-7A
        
lcAlpha                 = %x61-7A
        
nonZeroDigit            = %x31-39
        
nonZeroDigit            = %x31-39
        
;;
;; RFC 2234 core rules.
;;
        
;;
;; RFC 2234 core rules.
;;
        
ALPHA          =  %x41-5A / %x61-7A
                       ; A-Z / a-z
        
ALPHA          =  %x41-5A / %x61-7A
                       ; A-Z / a-z
        
CR             =  %x0D
                       ; carriage return
        
CR             =  %x0D
                       ; carriage return
        

CRLF = CR LF ; Internet standard newline

CRLF=CRLF;互联网标准新线

DIGIT          =  %x30-39
                       ; 0-9
        
DIGIT          =  %x30-39
                       ; 0-9
        
DQUOTE         =  %x22
                       ; " (Double Quote)
        
DQUOTE         =  %x22
                       ; " (Double Quote)
        
HEXDIG         =  DIGIT /
                  %x61 / %x62 / %x63 / %x64 / %x65 / %x66
        
HEXDIG         =  DIGIT /
                  %x61 / %x62 / %x63 / %x64 / %x65 / %x66
        

; only lower-case a..f

; 仅小写a..f

HTAB           =  %x09
                       ; horizontal tab
        
HTAB           =  %x09
                       ; horizontal tab
        
LF             =  %x0A
                       ; linefeed
        
LF             =  %x0A
                       ; linefeed
        
SP             =  %x20
                       ; space
        
SP             =  %x20
                       ; space
        
VCHAR          =  %x21-7E
                       ; visible (printing) characters
        
VCHAR          =  %x21-7E
                       ; visible (printing) characters
        

WSP = SP / HTAB ; white space

WSP=SP/HTAB;空白

;; End of ABNF

;; ABNF结束

Authors' Addresses

作者地址

Frank Strauss TU Braunschweig Muehlenpfordtstrasse 23 38106 Braunschweig Germany

法兰克·施特劳斯·图布伦瑞克·穆埃伦普福尔茨塔斯23 38106德国布伦瑞克

   Phone: +49 531 391 3266
   EMail: strauss@ibr.cs.tu-bs.de
   URI:   http://www.ibr.cs.tu-bs.de/
        
   Phone: +49 531 391 3266
   EMail: strauss@ibr.cs.tu-bs.de
   URI:   http://www.ibr.cs.tu-bs.de/
        

Juergen Schoenwaelder International University Bremen P.O. Box 750 561 28725 Bremen Germany

德国不来梅Juergen Schoenwaeld国际大学邮政信箱750 561 28725不来梅

   Phone: +49 421 200 3587
   EMail: j.schoenwaelder@iu-bremen.de
   URI:   http://www.eecs.iu-bremen.de/
        
   Phone: +49 421 200 3587
   EMail: j.schoenwaelder@iu-bremen.de
   URI:   http://www.eecs.iu-bremen.de/
        

Full Copyright Statement

完整版权声明

Copyright (C) The Internet Society (2004). This document is subject to the rights, licenses and restrictions contained in BCP 78, and except as set forth therein, the authors retain all their rights.

版权所有(C)互联网协会(2004年)。本文件受BCP 78中包含的权利、许可和限制的约束,除其中规定外,作者保留其所有权利。

This document and the information contained herein are provided on an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

本文件及其包含的信息是按“原样”提供的,贡献者、他/她所代表或赞助的组织(如有)、互联网协会和互联网工程任务组不承担任何明示或暗示的担保,包括但不限于任何保证,即使用本文中的信息不会侵犯任何权利,或对适销性或特定用途适用性的任何默示保证。

Intellectual Property

知识产权

The IETF takes no position regarding the validity or scope of any Intellectual Property Rights or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; nor does it represent that it has made any independent effort to identify any such rights. Information on the procedures with respect to rights in RFC documents can be found in BCP 78 and BCP 79.

IETF对可能声称与本文件所述技术的实施或使用有关的任何知识产权或其他权利的有效性或范围,或此类权利下的任何许可可能或可能不可用的程度,不采取任何立场;它也不表示它已作出任何独立努力来确定任何此类权利。有关RFC文件中权利的程序信息,请参见BCP 78和BCP 79。

Copies of IPR disclosures made to the IETF Secretariat and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this specification can be obtained from the IETF on-line IPR repository at http://www.ietf.org/ipr.

向IETF秘书处披露的知识产权副本和任何许可证保证,或本规范实施者或用户试图获得使用此类专有权利的一般许可证或许可的结果,可从IETF在线知识产权存储库获取,网址为http://www.ietf.org/ipr.

The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights that may cover technology that may be required to implement this standard. Please address the information to the IETF at ietf-ipr@ietf.org.

IETF邀请任何相关方提请其注意任何版权、专利或专利申请,或其他可能涵盖实施本标准所需技术的专有权利。请将信息发送至IETF的IETF-ipr@ietf.org.

Acknowledgement

确认

Funding for the RFC Editor function is currently provided by the Internet Society.

RFC编辑功能的资金目前由互联网协会提供。