INTERNET-DRAFT L. Heintz
Cisco Systems, Inc.
15 June 2001
SNMP Row Operations Extensions
<draft-ietf-eos-snmp-rowops-01.txt>
Status of this Memo
This document is an Internet-Draft and is in full conformance with
all provisions of Section 10 of RFC2026. Internet-Drafts are working
documents of the Internet Engineering Task Force (IETF), its areas,
and its working groups. Note that other groups may also distribute
working documents as Internet-Drafts.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
The list of current Internet-Drafts can be accessed at
http://www.ietf.org/ietf/1id-abstracts.txt
The list of Internet-Draft Shadow Directories can be accessed at
http://www.ietf.org/shadow.html
Copyright Notice
Copyright (C) The Internet Society (2001). All Rights Reserved.
Abstract
This document describes a set of extensions (protocol operations and
textual conventions) to the existing SNMP framework architecture
[RFC2571]. These extensions provide mechanisms for efficient
creation, modification, deletion and retrieval of table rows and
other information.
Table of Contents
1. The SNMP Network Management Framework ....................... 3
2. Overview .................................................... 4
2.1. Terms ..................................................... 4
2.2. Motivations for the Extensions ............................ 4
2.3. Design Goals .............................................. 5
EOS Working Group Expires December 2001 [Page 1]
Internet Draft SNMP Row Operations Extensions 15 June 2001
3. The Extensions .............................................. 6
3.1. RowState .................................................. 7
3.2. Protocol Operations ....................................... 7
3.2.1. Singletons .............................................. 8
3.2.2. The RowOp ............................................... 9
3.2.3. The RowIdentifier ....................................... 10
3.2.4. RowIdentifiers in GetBulkRow Requests ................... 11
3.2.5. RowIdentifier Inheritance ............................... 12
3.2.6. The Operands ............................................ 13
3.2.7. Extended Error Codes .................................... 14
3.2.8. RowOps and Group Scalar Objects. ....................... 16
3.2.9. Three-Phase Sets ........................................ 17
3.2.10. Response PDUs .......................................... 17
3.2.11. Determining Varbind Roles .............................. 18
4. Elements of Procedure ....................................... 19
4.1. CreateRow Request Processing .............................. 19
4.2. DeleteRow Request Processing .............................. 19
4.3. EditRow Request Processing ................................ 19
4.4. GetRow Request Processing ................................. 19
4.5. GetNextRow Request Processing ............................. 19
4.6. GetBulkRow Request Processing ............................. 20
4.7. Response-PDU Processing ................................... 20
5. Coexistence and Transition .................................. 20
6. Protocol Operations Definitions ............................. 21
7. Managed Object Definitions .................................. 22
8. IANA Considerations ......................................... 26
9. Intellectual Property ....................................... 26
10. Acknowledgements ........................................... 27
11. Security Considerations .................................... 27
12. References ................................................. 27
13. Editor's Addresses ......................................... 30
A. Impact to SNMP and other Protocols .......................... 31
A.1. SNMPv3 .................................................... 31
A.2. AgentX .................................................... 31
B. Examples of Row Operations .................................. 31
B.1. CreateRow ................................................. 31
B.2. DeleteRow ................................................. 35
B.3. GetRow .................................................... 36
B.4. GetNextRow ................................................ 39
B.5. GetBulkRow ................................................ 41
B.6. EditRow ................................................... 48
C. Known issues ................................................ 50
D. Full Copyright Statement .................................... 51
EOS Working Group Expires December 2001 [Page 2]
Internet Draft SNMP Row Operations Extensions 15 June 2001
1. The SNMP Network Management Framework
The SNMP Management Framework presently consists of five major
components:
- An overall architecture, described in RFC 2571 [RFC2571].
- Mechanisms for describing and naming objects and events for the
purpose of management. The first version of this Structure of
Management Information (SMI) is called SMIv1 and described in
RFC 1155 [RFC1155], RFC 1212 [RFC1212] and RFC 1215 [RFC1215].
The second version, called SMIv2, is described in RFC 2578
[RFC2578], RFC 2579 [RFC2579] and RFC 2580 [RFC2580].
- Message protocols for transferring management information. The
first version of the SNMP message protocol is called SNMPv1 and
described in RFC 1157 [RFC1157]. A second version of the SNMP
message protocol, which is not an Internet standards track
protocol, is called SNMPv2c and described in RFC 1901 [RFC1901]
and RFC 1906 [RFC1906]. The third version of the message
protocol is called SNMPv3 and described in RFC 1906 [RFC1906],
RFC 2572 [RFC2572] and RFC 2574 [RFC2574].
- Protocol operations for accessing management information. The
first set of protocol operations and associated PDU formats is
described in RFC 1157 [RFC1157]. A second set of protocol
operations and associated PDU formats is described in RFC 1905
[RFC1905].
- A set of fundamental applications described in RFC 2573
[RFC2573] and the view-based access control mechanism described
in RFC 2575 [RFC2575].
A more detailed introduction to the current SNMP Management Framework
can be found in RFC 2570 [RFC2570].
Managed objects are accessed via a virtual information store, termed
the Management Information Base or MIB. Objects in the MIB are
defined using the mechanisms defined in the SMI.
This memo specifies a MIB module that is compliant to the SMIv2. A
MIB conforming to the SMIv1 can be produced through the appropriate
translations. The resulting translated MIB must be semantically
equivalent, except where objects or events are omitted because no
translation is possible (use of Counter64). Some machine readable
information in SMIv2 will be converted into textual descriptions in
SMIv1 during the translation process. However, this loss of machine
EOS Working Group Expires December 2001 [Page 3]
Internet Draft SNMP Row Operations Extensions 15 June 2001
readable information is not considered to change the semantics of the
MIB.
2. Overview
This document describes a set of SNMP extensions to current protocol
operations [RFC1905] to provide for efficient management operations
(i.e. creating, modifying, deleting and retrieving table rows and
other MIB data). In addition, a new textual convention, RowState, is
defined to replace RowStatus in future MIBs. RowState maintains the
ability to report the state of a row, but does not provide a
mechanism to create or delete a row.
2.1. Terms
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].
Terminology such as "leftmost" or "left" indicates a PDU component
that is transmitted on the wire prior to other components. Thus,
terms such as "rightmost" imply components that have similar, but
opposite semantics.
Protocol operation refers to a high-level request, such as a
SetRequest or GetRequest (or one of the six new requests defined
within this document). Row operation refers to one logical operation
that affects one specific table row. A protocol operation may contain
one or more row operations. The term RowOp refers to the aggregate
parts of a protocol operation that comprise a single row operation.
2.2. Motivations for the Extensions
Experience has shown that current SNMP protocol operations and
management structures are not ideally suited to effect configuration
changes within managed devices and when retrieving large amounts of
information. The extensions described in this document are
specifically designed to minimize, or provide opportunities to
minimize, the following problems which inhibit the effectiveness of
SNMP:
- Requests that contain multiple varbinds that affect one row of
a table may contain significant redundancy of information. This
is because each varbind contains an object name (i.e. Object
Identifier or OID), and these OIDs may differ only in the
EOS Working Group Expires December 2001 [Page 4]
Internet Draft SNMP Row Operations Extensions 15 June 2001
single subid that designates a specific column. In cases where
strings are used as instance identifiers, for example, UDP
maximum-message-size constraints may force multiple SetRequests
to be used to construct a new, or modify an existing row in a
table. Requests containing redundant data are also more costly
to encrypt and decrypt.
- SetRequests may contain multiple varbinds that actually refer
to the same MIB object. For example, varbind one may be
attempting to set the object, foo, to the value 1, while
varbind two may be attempting to set the same object, foo, to
the value 2. In such cases, the SNMP protocol indicates that
implementations may make independent decisions as to which
value will be used.
- SetRequests do not impose any ordering requirements on the
varbinds within a single request, even if they affect different
objects in the same row of a table. This can cause added
complexity in set request processing.
- The RowStatus textual convention [RFC1903] provides a mechanism
for row management. RowStatus most often requires the
implementation of a rather complicated state machine, many of
whose transitions are optional and whose target states are at
times non-deterministic. RowStatus also confuses the notion of
row status with the notion of row fate, which also tends to
complicate both the MIB design and the implementation.
2.3. Design Goals
Several goals were identified when considering the kind and nature of
extensions that were needed:
- allow separate row operations (hereafter referred to as RowOps)
to be performed in a single protocol operation.
- allow operations on individual scalar and/or tabular objects in
conjunction with row operations.
- minimize redundant information in a protocol operation. The
extensions should at least make use of OID suppression
techniques to meet this goal. Note that OID suppression
(largely an issue of how data is stored within a PDU) is not
equivalent to OID compression (data compression algorithms).
Issues of OID compression are considered out of scope for this
document.
EOS Working Group Expires December 2001 [Page 5]
Internet Draft SNMP Row Operations Extensions 15 June 2001
- eliminate the need for special MIB objects (e.g. RowStatus)
that control the creation and deletion of rows.
- minimize the impact on existing network management and subagent
protocols such as SNMPv3, AgentX, and related applications.
- interoperate with legacy MIBs as well as future MIBs.
- operate in existing SNMP networks and not disrupt legacy SNMP-
capable devices.
3. The Extensions
Six new protocol operations are described in this document:
CreateRowRequest-PDU (aka CreateRow), DeleteRowRequest-PDU (aka
DeleteRow), EditRowRequest-PDU (aka EditRow), GetRowRequest-PDU (aka
GetRow), GetNextRowRequest-PDU (aka GetNextRow), and
GetBulkRowRequest-PDU (aka GetBulkRow). These requests are based on
the BulkPDU structure as originally defined in [RFC1905].
Despite the obvious use of the word "row" throughout this document,
these new protocol operations can also be used to create, delete,
modify and retrieve non-row data (i.e. scalars); specific details are
provided later in the document.
For purposes of discussion, the three requests, CreateRow, DeleteRow
and EditRow are more generically referred to as SetRow class
requests, and GetRow, GetNextRow and GetBulkRow are referred to as
RetrieveRow class requests.
The CreateRow request can only succeed if it is used to create an
aggregate (e.g. row) that doesn't already exist. EditRow has no such
constraints and can be used much in the same way traditional
SetRequests are used. One noteworthy feature of the GetBulkRow
request is that it can perform head and/or tail functions on a table.
In addition, all SetRow requests make use of a three-phase processing
model in which a new third phase (retrieve) is added to the
traditional test and commit phases discussed in [RFC1905].
Another extension defined in this document is the RowState textual
convention, which is intended to replace RowStatus in all future MIB
designs. It is not the intention to deprecate RowStatus. RowState
serves to reestablish a distinction between SNMP data types and SNMP
operations -- a line which is blurred in the current RowStatus
definition.
EOS Working Group Expires December 2001 [Page 6]
Internet Draft SNMP Row Operations Extensions 15 June 2001
3.1. RowState
The RowState textual convention defined in this document is intended
to replace RowStatus in new MIBs and provides several important
improvements over RowStatus:
- RowState relaxes some of the row timeout rules that RowStatus
suffers from. Such rules inhibit the usefulness of RowStatus as
a means of temporarily placing system resources (i.e. table
rows) out of service. For example, if an SNMP manager changes
a given instance of snmpNotifyRowStatus from Active to
NotInService as a means of temporarily disabling one or more
notifications, an unintended side-effect of this action on some
implementations may be that the row is automatically deleted
after some short amount of time has elapsed (typically, a few
minutes).
- More importantly, RowState separates the notion of reporting
row status and the notion of managing row fate (i.e. creation &
deletion). Specifically, the purpose of RowState is to enable
reporting of row state, while matters of creating and deleting
rows are better served by protocol operations.
RowState provides three states: NotReady, NotInService and Active,
which are very similar to the corresponding RowStatus definitions.
Unlike RowStatus, RowState does not provide CreateAndWait,
CreateAndGo or Destroy.
Any entity providing a RowState column in a table must instantiate an
instance of RowState when one or more other column objects in the
same row have been created or instantiated (by whatever means). Using
the new protocol operations defined in this document, it is usually
unnecessary to directly set or reference a RowState instance in order
to create and activate a new row.
3.2. Protocol Operations
The new protocol operations are designed to "fit" in the existing
BulkPDU structure [RFC1905]. Formal definitions of the new protocol
operations are provided in section 6.
This document specifies an evolutionary approach in the way the new
protocol operations are encoded or contained within the BulkPDU. The
new requests capitalize on OID suppression techniques to minimize
information redundancy and therefore minimize PDU size. Note that the
traditional SNMP protocol operations [RFC1905] are not being changed,
either in their semantics, the way data is encoded within them, or
EOS Working Group Expires December 2001 [Page 7]
Internet Draft SNMP Row Operations Extensions 15 June 2001
the way they are processed.
The following general discussion centers on how the varbinds of the
new protocol operations and their responses are constructed and
generally used. The elements of procedure formally describes how the
new requests are processed and how the responses are constructed. The
APPENDIX provides high-level examples of protocol exchanges using the
extensions.
Each varbind in a request serves one of three purposes: as a
Singleton, as a RowIdentifier or as an Operand.
3.2.1. Singletons
A varbind that serves as a Singleton functions more or less like
varbinds in a traditional SNMP request (e.g. SetRequest, GetRequest).
They are encoded in the same manner, and except for prefix-level
inheritance (described below), they do not take advantage of OID
suppression techniques. Singletons may exist in any SetRow or
RetrieveRow class request or response, but if they do exist in any
request, they MUST be the first N varbinds in the request, where N is
provided in the non-repeaters field of the request. N may be zero to
indicate that Singletons have not been included in the request. If N
Singletons are included in a request, then the same N Singletons will
also exist in the response, although in a successful response to a
GetBulkRow request, additional Singletons may also be present.
The set of Singletons contained in a request SHOULD be ordered so
that the name of Singleton i is lexicographically smaller than
Singleton i+1, though SNMP applications MUST be prepared to accept
unordered Singletons.
Singletons may be included within a CreateRow or a DeleteRow request.
Such Singletons indicate a specific object instance within an
aggregate (e.g. a row or a group scalar) upon which a creation or
deletion operation is performed. By default, the operation takes
affect on all object instances within the same aggregate; however,
aggregate semantics may be defined (within the relevant description
clauses) as to whether only the directly referenced objects in the
Singletons are instead affected. Usually, Singletons are not
included within CreateRow and DeleteRow requests, but there are cases
when they may be needed (one of the protocol exchange examples in the
APPENDIX illustrates such a case).
Within any EditRow class request, Singletons function much like
individual varbinds within a conventional SetRequest, and the name of
any Singleton MUST NOT refer to any other Singleton or to any
EOS Working Group Expires December 2001 [Page 8]
Internet Draft SNMP Row Operations Extensions 15 June 2001
existing (or not) object within any RowOp of the same EditRow
request.
Within the GetRow request, Singletons function much like individual
varbinds within a conventional GetRequest.
Within the GetNextRow request, Singletons function much like
individual varbinds within a conventional GetNextRequest.
Within the GetBulkRow request, Singletons function much like the
non-repeaters varbinds in the conventional GetBulk request; thus,
they function as GetNextRequest varbinds.
The remaining varbinds in any request form one or more independent
RowOps with each varbind serving as either a RowIdentifier or as an
Operand component of a RowOp.
3.2.2. The RowOp
The new requests defined in this document may generally contain zero
or more RowOps. This allows a single CreateRow request, for example,
to create one or more new rows in a single protocol operation. Each
RowOp corresponds to one attempt to create a row, in this case, or
corresponds to one attempt to delete a row in the case of DeleteRow,
and so forth.
Note that the three layers in the diagram below do not describe
different sections of the request, rather, they each represent the
same information and structure (at different levels of abstraction).
<CreateRow.............>
<RowOp1><RowOp2><RowOp3>
<vb><vb><vb><vb><vb><vb>
Although the above diagram shows a CreateRow request logically
containing three RowOps (i.e. create three rows) with two consecutive
varbinds per RowOp, in reality, these requests may contain zero to
many RowOps, each of which may may be comprised of a differing number
of varbinds.
The first varbind in each RowOp is hereafter referred to as the
RowIdentifier of a RowOp. The remaining varbinds in a given RowOp
provide the individual operands (i.e. the affected row objects),
which are hereafter referred to as Operands. In the diagram above,
the 1st, 3rd and 5th varbinds are therefore RowIdentifiers and the
2nd, 4th and 6th varbinds are Operands.
EOS Working Group Expires December 2001 [Page 9]
Internet Draft SNMP Row Operations Extensions 15 June 2001
3.2.3. The RowIdentifier
The following diagram shows a GetRow request containing a single
RowOp that itself is composed of the required RowIdentifier and two
Operands. In this case, the GetRow request is seeking to retrieve
two specific column objects from a specific row.
<GetRow.......................................>
<RowOp........................................>
<vb1-RowIdentifier><vb2-Operand1><vb3-Operand2>
A traditional OID for a given object instance in a table can be
broken up into these logical components:
OID = <TableName><1><ObjectSubid><Instance>
ObjectSubid is equivalent to one of the column descriptors. A more
formal representation for RowIdentifier is now possible:
RowIdentifier = <vb.name=AggName,
vb.type=OID,
vb.value=1.0.Instance>
The component, AggName (Aggregate Name), takes the same value of
TableName.
The vb.type MUST specify a type of OID. This is because the instance
part of an OID is actually comprised of one or more table index
values, each of which resolves to one or more subids.
Because the Instance always resolves to zero or more subids (because
there are cases when Instance is optional within a RowIdentifier),
and because a valid OID must be composed of at least two subids,
Instance is prefixed with the OID value of 1.0. The reason for this
choice of prefixes is that every valid table object name contains the
value of <1.ObjectSubid> as part of its OID.
The AggName of a RowIdentifier MUST NOT contain partial OIDs. This
means that the AggName MUST always exactly correspond to a legal
table definition (if the desired results are to be achieved). The
motivation behind this is that all RowOps are performed at the row
level on a specific table.
The Instance within a GetNextRow is not required to be fully formed
except that if the value is non-NULL, it MUST at least contain the
1.0 prefix. Also note that GetNextRow RowOps do not "jump" to the
next table. In other words, in the event a GetNextRow RowOp refers
to the last row in a given table, the appropriate exception is
EOS Working Group Expires December 2001 [Page 10]
Internet Draft SNMP Row Operations Extensions 15 June 2001
returned for that RowOp even if other tables follow that contain
retrievable rows. In this sense, GetNextRow RowOps are limited to
operate within the subtree of the targeted table(s), though the
Singletons within a GetNextRow or GetBulkRow request have no such
constraint.
3.2.4. RowIdentifiers in GetBulkRow Requests
GetBulkRow RowIdentifiers have a slightly different construction than
the RowIdentifiers for the other five request types. The diagram
below shows two new components are included in these RowIdentifiers,
InstanceLen and Instance2.
RowIdentifier = <vb.name=AggName,
vb.type=OID,
vb.value=1.0.InstanceLen.Instance.Instance2>
The two instance components define the search range of the GetBulkRow
request (i.e. the rows from which data may be returned). Unlike the
traditional GetBulk request, which may operate across one or more
tables and/or scalar objects, each RowOp within a GetBulkRow request
is confined to operate only within the table specified by the AggName
component, although each RowOp may operate on different tables.
Furthermore, each RowOp operates only within the range of rows as
specified by the two instance components (inclusive) and upon one or
more columns within that row range, as specified by the Operands that
are associated with the RowOp.
The InstanceLen component specifies the number of subids that
comprise Instance. InstanceLen may be 0, which indicates that
Instance is not provided and that the search range begins at the
first row (head) of the table and ends with the row specified by
Instance2. Instance or Instance2 need not resolve to existing rows.
The number of subids in Instance2 may be 0 or more, and if 0 (i.e.
Instance2 is not provided), this indicates that the search range
includes any row that may correspond to the row specified by Instance
and all those that follow (i.e. to the end of the table).
If Instance2 is lexicographically identical to Instance, the search
range is confined to the one row common to both instances, or if
identical values do not resolve to an existing row, a NuSuchInstance
error is returned. If Instance2 is lexicographically smaller than
Instance, a NoSuchInstance error will be returned.
The max-repetitions field in the GetBulkRow request may contain a
non-zero value (M) to indicate a head or tail function should be
EOS Working Group Expires December 2001 [Page 11]
Internet Draft SNMP Row Operations Extensions 15 June 2001
performed for each RowOp in the request. Otherwise, max-repetitions
MUST always be zero (for all request types). If InstanceLen contains
the value 0 (i.e. Instance is not provided), at most M rows will be
returned from the head of the table. If InstanceLen contains a non-
zero value (i.e. Instance is provided), then at most M rows at the
tail of the table will be returned. For a head function, all returned
rows MUST be lexicographically smaller than or equal to Instance2, if
provided. For a tail function, all returned rows MUST be
lexicographically greater than or equal to Instance; and Instance2,
if provided, is ignored. The Instance2 component of a given RowOp,
therefore, SHOULD NOT be provided in a GetBulkRow request whose max-
repetitions and InstanceLen values are both non-zero as this
unnecessarily increases PDU size.
Whether the GetBulkRow request indicates a head or tail function (or
neither), it should be noted that the vb.value can be provided as
either 1.0.0 or as 1.0 to indicate that the desired search range
includes the entire table. The latter OID is slightly more efficient,
and both forms have the same semantics unless a head or tail function
is indicated (max-repetitions is non-zero). If max-repetitions is
non-zero and the vb.value = 1.0.0, this indicates a head function
whose search range is the entire table. If max-repetitions is non-
zero and the vb.value = 1.0, this indicates a tail function whose
search range is the entire table.
3.2.5. RowIdentifier Inheritance
Several forms of OID inheritance are possible within RowIdentifiers
in order to further minimize PDU size: name-level, prefix-level, and
instance-level inheritance.
In order to further minimize information redundancy, the OID of 0.0
is permitted to be substituted as the AggName component of any
RowIdentifier to indicate that the most recent (left) RowIdentifier
whose AggName is dissimilar (not 0.0) contains the OID value intended
to be used.
In this example, a simplified notation is used to help illustrate how
RowOps (the two middle ones) use the inheritance OID to minimize PDU
size. This example shows four RowOps, each comprised of one
RowIdentifier and one Operand (op):
[<foo><op>] [<0.0><op>] [<0.0><op>] [<fum><op>]
The following is logically identical, though it forms a larger PDU:
[<foo><op>] [<foo><op>] [<foo><op>] [<fum><op>]
EOS Working Group Expires December 2001 [Page 12]
Internet Draft SNMP Row Operations Extensions 15 June 2001
In order for an inheritance OID to be correctly used, all RowOps that
affect the same table MUST be consecutively placed in the varbind
list, and also the first such RowIdentifier MUST NOT contain the
inheritance OID. The above is known as name-level inheritance.
If a RowIdentifier of any request type has a NULL varbind value, this
indicates that the most recent non-NULL varbind value is to be
inherited. If the first RowIdentifier in a request contains a NULL
varbind value, the OID of 1.0 will be substituted. This is known as
instance-level inheritance.
The third form of inheritance (prefix-level inheritance) occurs
whenever the varbind name of any AggName of a RowIdentifier begins
with the OID prefix of 0.0 AND four or more subids exist in the OID.
In such cases, the OID value of 1.3.6.1 is to be substituted in place
of the 0.0 prefix.
The example below shows two RowOps, each comprised of one
RowIdentifier and one Operand (op). Name- and prefix-level
inheritance are used:
[<0.0.foo><op>] [<0.0><op>]
The following is logically identical, though it forms a larger PDU:
[<1.3.6.1.foo><op>] [<1.3.6.1.foo><op>]
The following OID is not a candidate for prefix-level inheritance
because it has less than four subids: 0.0.1
Each RowOp is fully independent of any other despite any inheritance
it may use.
3.2.6. The Operands
The remaining varbinds for a given RowOp are referred to as its
Operands and are formed as standard request varbinds except that the
name of each varbind is an OID whose length is either two or three
subids long, as follows:
0.ObjectSubid (where ObjectSubid > 0 and ObjectSubid <= 39)
or
0.1.ObjectSubid (where ObjectSubid == 0 or ObjectSubid > 39)
Each Operand contained in the same RowOp SHOULD be ordered according
EOS Working Group Expires December 2001 [Page 13]
Internet Draft SNMP Row Operations Extensions 15 June 2001
to ascending values of the ObjectSubids.
By way of example, if a table, foo, had four columns whose
descriptors (ObjectSubids) were 0, 1, 39 and 40, their Operand names
would be 0.1.0, 0.1, 0.39 and 0.1.40, respectively. Because the
majority of MIB object descriptors are between 1 and 39, typical
Operand names will take the form of 0.X.
3.2.7. Extended Error Codes
In addition to the standard error-status and error-index values in a
response PDU, and varbind-level exceptions, an implementation MAY
provide application-specific (extended) error indications in any
response by inserting one new varbind at the end of the varbind list.
Only the last varbind MAY contain extended error information.
Extended error information may be included in the PDU whether or not
other errors/exceptions are indicated in the response (e.g. error-
status).
The name of any varbind containing an extended error code is
constructed as follows:
0.0.<ErrorInfo><ErrorInfo><...>
Each ErrorInfo component is constructed as follows:
0.ErrorCode[.<VbList>]
The ErrorInfo component may repeat multiple times but MUST have at
least one occurrence. The leading subid of 0 in the ErrorInfo
component serves as a separator between successive ErrorInfo
components.
ErrorCode is a value in the range 1..4294967295.
The optional VbList is one or more subids which indicates a list of
varbind positions (one per subid) within the same response PDU that
associate to the preceding ErrorCode. The subids MUST be a value in
the range of 1..max-bindings [RFC1905].
The value component of a varbind containing an extended error
information is always NULL.
A properly formed varbind name will have a prefix of 0.0.0. This
prefix allows EOS-enabled SNMP applications to distinguish these
varbinds from all other varbind types (i.e. Singletons,
EOS Working Group Expires December 2001 [Page 14]
Internet Draft SNMP Row Operations Extensions 15 June 2001
RowIdentifiers or Operands).
The ErrorCode of 3 in the following example indicates the 4th and 5th
varbinds raised that error.
vb.name = 0.0.0.3.4.5
vb.name = NULL
The same varbinds MAY be associated to one or more extended error
codes. The following example indicates an error code of 2 (for
varbinds 1 and 2), an error code of 5 (no specific varbinds
provided), an error code of 8 (for varbinds 2, 6 and 7) and an error
code of 9 (for varbind 8). An error code that does not have a VbList
(e.g. 5 in the above example) maps to a condition that applies to the
entire PDU as opposed to a set of varbinds.
vb.name = 0.0.0.2.1.2.0.5.0.8.2.6.7.0.9.8
vb.name = NULL
The set of all returned errors and exceptions indicated within a
Request-PDU is comprised of the error indicated in error-status (and
error-index), if any, the extended errors codes, if any, and the
exceptions present in any varbind, if any. Each error and/or
exception is independent of any other.
An implementation SHOULD NOT provide extended error information if
the desired information can instead be adequately conveyed using the
error-status/index fields or varbind-level exceptions. An
implementation MAY use extended error codes to convey a more detailed
error status than is otherwise possible using traditional
error/exception mechanisms. For example, if a wrongValue error is
returned for varbind 5, an implementation may also choose to provide
an extended error value to indicate that the provided value was
"TooLarge".
The presence of extended error codes (or lack thereof) in a response
does not guarantee all possible errors in the original request have
been identified (or that there are no unknown errors). The presense
of extended error information does not determine success/failure of a
protocol operation. Rather, the error-status of noError implies a
successful operation, whereas all other error-status values imply
failure.
The method used to impart meaning to the returned error values is out
of scope to this document. See [TBD] for details.
EOS Working Group Expires December 2001 [Page 15]
Internet Draft SNMP Row Operations Extensions 15 June 2001
3.2.8. RowOps and Group Scalar Objects.
It is also possible to use the new requests to access or modify
groups of scalar objects where each RowOp relates to a specific
group. The only exception to this is that GetBulkRow RowOps are
limited to operating on tables only (though the Singletons within a
GetBulkRow may reference scalar objects).
To form a valid RowOp that refers to a group, the following MUST be
done: First, the AggName instead refers to a valid group OID (e.g.
the system group OID is 1.3.6.1.2.1.1), second, the RowIdentifier
Instance prefix value is always provided as 0.0 (instead of 1.0 as
for tables) and third, there is no Instance provided. The following
example shows the relevant OIDs within a RowOp which accesses the
system group scalars:
RowIdentifier = <vb.name=AggName=0.0.2.1.1, -- 1.3.6.1.2.1.1
vb.type=OID,
vb.value=0.0> -- not a table
Operand1 = 0.1 -- sysDescr
Operand2 = 0.2 -- sysObjectID
Operand3 = 0.3 -- sysUptime
Operand4 = 0.4 -- sysContact
Operand5 = 0.5 -- sysName
Operand6 = 0.6 -- sysLocation
Operand7 = 0.7 -- sysServices
A CreateRow request can be used for group scalars if the affected
scalars MAX-ACCESS values are read-create and the objects do not
exist.
A DeleteRow request can be used for group scalars if the affected
scalars MAX-ACCESS values are read-create.
An EditRow request can be used for group scalars if the affected
scalars MAX-ACCESS values are either read-write or read-create.
The GetRow or GetNextRow requests may also be used for group scalars.
The following shows a request with three RowOps using instance-level
inheritance for group scalar access:
[<system:0.0><op>]
[<snmpTargetObjects:NULL><op>]
[<snmpEngine:NULL><op>]
The following is logically identical to the above example, though it
forms a larger PDU:
EOS Working Group Expires December 2001 [Page 16]
Internet Draft SNMP Row Operations Extensions 15 June 2001
[<system:0.0><op>]
[<snmpTargetObjects:0.0><op>]
[<snmpEngine:0.0><op>]
3.2.9. Three-Phase Sets
All SetRow requests are processed using a three-phase processing
model instead of the two-phase model defined in [RFC1905]. The new
third phase (retrieve Operand values) occurs only if the first phase
(test) completes successfully. If the test phase results in an
error, all Operand values in the response will be set to NULL or
appropriate errors and exceptions will be returned. Otherwise, all
Operand values in the response will contain the value of the
indicated object as it exists at the start of the third-phase (i.e.
after the completion of the commit phase) or may contain exceptions
if the Operand value is unavailable. In the event any Operand refers
to an object which is known to have existed at the start of the first
phase but not at the start of the third phase (as is possible with
DeleteRow), the value of such Operands will be NULL in the final
response.
3.2.10. Response PDUs
The traditional Response-PDU [RFC1905] is used as the standard
response to each of the SetRow and RetrieveRow requests, except that
the varbinds are constructed using the same OID suppression
techniques as described above and, except for a successful GetBulkRow
response, the number and type of varbinds (though not necessarily
their names and values) returned are identical to the original
request. Any response MAY also contain an additional varbind (the
last) containing extended error information. The structure and
contents of GetBulkRow responses are a bit more unpredictable.
Singletons within a GetBulkRow (or any) request always have
corresponding Singletons in the response (i.e. the first N varbinds
MAY be Singletons). The RowOps in a GetBulkRow request, however, are
not returned in a successful response; instead, new RowOps and/or
Singletons are inserted into the response after varbind N. A RowOp
will be included only if it contains two or more Operands, whereas a
Singleton will be included if a RowOp with only one Operand from a
given row would otherwise be returned. Thus, RowOps and Singletons
may be interspersed together in the response, although in all cases
they are provided in row by row order.
The returned row information MUST be ordered so that RowOp i is
lexicographically smaller than or equal to RowOp i+1. RowOps with
EOS Working Group Expires December 2001 [Page 17]
Internet Draft SNMP Row Operations Extensions 15 June 2001
similar AggName values MUST also be sub-ordered in lexicographically
ascending order based on their Instance values. Any two returned
RowOps MUST NOT contain identical AggName and Instance values.
Similarly, for all new Singletons included after varbind N, Singleton
i MUST be lexicographically smaller than Singleton i+1 and they MUST
be interspersed with RowOps so that all RowIdentifier and Singleton
varbinds (after varbind N) are ordered in lexicographically ascending
order. In addition, Singletons MUST NOT be inserted between any
RowIdentifier and one of its Operands.
If an otherwise successful response to a GetBulkRow request ever
fails to include all the data requested (due to PDU size
limitations), then the response MAY include an appropriate extended
error indicating this fact. In this way, the last RowOp (or
Singleton) in the response contains an Instance that can be used to
calculate the beginning search range for a subsequent GetBulkRow
request.
SNMP applications which generate GetBulkRow requests MUST preserve
(i.e. remember) the value of the non-repeaters field for each request
where it was non-zero. This allows the application to easily and
correctly distinguish the first N (N = non-repeaters) Singletons from
subsequent response components.
3.2.11. Determining Varbind Roles
Varbinds function as either Singletons, RowIdentifiers, Operands, or
as carriers of extended error information. It is important for an
implementation to correctly determine the role of every varbind in
any given request or response. The following procedure is used to
correctly identify the role of a given varbind, V, where V is a value
in the range (1..max-bindings) in a request or response, and where N
= non-repeaters in the associated request. The first rule below that
applies determines the correct role of the varbind.
- If V <= N, and N > 0, V is a Singleton.
- If V is the last varbind in a Response-PDU, and V has a name
prefixed by the value, 0.0.0, V contains extended error
information.
- If the name of V is comprised of exactly two subids and this
name is the value 0.X (where X > 0 and X <= 39), V is an
Operand.
EOS Working Group Expires December 2001 [Page 18]
Internet Draft SNMP Row Operations Extensions 15 June 2001
- If the name of V is comprised of exactly three subids and this
name is the value 0.1.X (where X = 0, or X > 39), V is an
Operand.
- If V is in any request or response other than a successful
GetBulkRow response, V is a RowIdentifier.
- If V is in a successful GetBulkRow response and the varbind V+1
exists, and varbind V+1 is an Operand, then V is a
RowIdentifier.
- If V is in a successful GetBulkRow response and the varbind V+1
exists, and varbind V+1 is NOT an Operand, then V is a
Singleton.
- Otherwise, V is a Singleton
4. Elements of Procedure
4.1. CreateRow Request Processing
TBD
4.2. DeleteRow Request Processing
TBD
4.3. EditRow Request Processing
TBD
4.4. GetRow Request Processing
TBD
4.5. GetNextRow Request Processing
TBD
EOS Working Group Expires December 2001 [Page 19]
Internet Draft SNMP Row Operations Extensions 15 June 2001
4.6. GetBulkRow Request Processing
TBD
4.7. Response-PDU Processing
TBD
5. Coexistence and Transition
An essential requirement for these operations is that they must
operate seamlessly in existing networks and not disrupt legacy SNMP
devices. This is satisfied by the fact that the new protocol
operations have new and unique ASN.1 tags, which allow older
implementations to efficiently and silently drop these new requests.
Some entities may only support these extensions for certain tables.
For example, different AgentX subagents may or may not support these
operations. This requires that the requests fail whenever a table is
targeted that cannot support the new operation. The elements of
procedure indicate the proper exceptions in these cases.
It is also possible that some table implementations may support only
some subset of the new operations, for example, the RetrieveRow
requests, but not the SetRow requests.
In an ideal world, the extensions herein would be easily translatable
to traditional operations. However, this is not the case for the
CreateRow, DeleteRow and GetBulkRow requests. On the other hand, it
is believed the GetRow, GetNextRow and EditRow requests can be
translated into conventional request formats (or subagent
operations).
One possible transition strategy is to enable existing SNMP
applications to support GetRow, GetNextRow and EditRow requests (with
or without the traditional requests). A proxy application, for
example, could bridge an EOS network with a non-EOS network by
translating those EOS requests into conventional requests (and
responses). Similarly, an AgentX master agent could translate this
same subset of EOS requests into conventional AgentX requests (and
responses). The benefits achieved with this strategy would be to
obtain smaller PDU sizes on the network along with a 100% reuse of
existing instrumentation methods (and subagent protocols). Subsequent
support of the CreateRow, DeleteRow and GetBulkRow requests is always
possible at a future date, or on a subagent by subagent basis
(assuming a compatible subagent protocol has been adopted).
EOS Working Group Expires December 2001 [Page 20]
Internet Draft SNMP Row Operations Extensions 15 June 2001
The procedures to translate EOS requests into conventional
operations, where possible, are out of scope of this document.
It is RECOMMENDED, however, that new SNMP implementations support
(for all MIB objects) all of the RetrieveRow class of requests. It is
further RECOMMENDED that new implementations supporting any of the
SetRow class of requests instead support all of the SetRow requests
(for all applicable MIB objects).
Also, it is RECOMMENDED that new SNMP MIBs SHOULD use the RowState
textual-convention in lieu of RowStatus, if applicable.
Proxy applications wishing to fulfill these recommendations can only
serve as EOS request forwarders for the CreateRow, DeleteRow and
GetBulkRow requests, and as request translators (or forwarders) for
the other requests.
6. Protocol Operations Definitions
SNMP-ROWOP-PDUS-MIB DEFINITIONS ::= BEGIN
IMPORTS
BulkPDU
SNMPv2-PDU;
ROWOP-PDUs ::=
CHOICE {
create-row-request
CreateRowRequest-PDU,
delete-row-request
DeleteRowRequest-PDU,
edit-row-request
EditRowRequest-PDU,
get-row-request
GetRowRequest-PDU,
get-next-row-request
GetNextRowRequest-PDU
get-bulk-row-request
GetBulkRowRequest-PDU
}
CreateRowRequest-PDU ::=
EOS Working Group Expires December 2001 [Page 21]
Internet Draft SNMP Row Operations Extensions 15 June 2001
[9]
IMPLICIT BulkPDU
DeleteRowRequest-PDU ::=
[10]
IMPLICIT BulkPDU
EditRowRequest-PDU ::=
[11]
IMPLICIT BulkPDU
GetRowRequest-PDU ::=
[12]
IMPLICIT BulkPDU
GetNextRowRequest-PDU ::=
[13]
IMPLICIT BulkPDU
GetBulkRowRequest-PDU ::=
[14]
IMPLICIT BulkPDU
END
7. Managed Object Definitions
SNMP-ROWOP-MIB DEFINITIONS ::= BEGIN
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE,
OBJECT-IDENTITY,
snmpModules FROM SNMPv2-SMI
TEXTUAL-CONVENTION FROM SNMPv2-TC
MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF;
snmpRowopMIB MODULE-IDENTITY
LAST-UPDATED "200106151500Z"
ORGANIZATION "EOS Working Group"
CONTACT-INFO "WG-EMail: eos@ops.ietf.org
Subscribe: eos-request@ops.ietf.org
Co-Chair: Dale Francisco
EMail: dfrancisco@acm.org
phone: +1 408-324-1389
Co-Chair: Glenn Waters
EOS Working Group Expires December 2001 [Page 22]
Internet Draft SNMP Row Operations Extensions 15 June 2001
Nortel Networks
EMail: gww@nortelnetworks.com
Editor: Lauren Heintz
Cisco Systems, Inc.
postal: 130 Baytech Drive
San Jose, CA 95134
USA
EMail: lheintz@cisco.com
phone: +1 408-853-6568
"
DESCRIPTION "The SNMP Row Operations MIB"
REVISION "200106151500Z"
DESCRIPTION "The initial version, published in
draft-ietf-eos-snmp-rowops-01.txt.
"
::= { snmpModules TBD }
-- Textual Conventions
RowState ::= TEXTUAL-CONVENTION
STATUS current
DESCRIPTION "
This textual-convention provides a means
to represent the state of a conceptual row;
it does not provide a means to manage creation
and/or destruction of conceptual rows.
In any row which includes a definition of RowState
that is also mandatory, that row MUST contain
an instantiation of a RowState object if any other
object in the same row is instantiated.
A status column of this type has three defined
values:
- `active', which indicates that the
conceptual row is in use by the managed
device and is considered fully operational
from a management perspective;
- `notInService', which indicates that the
conceptual row is available for use by
the managed device but is NOT considered
fully operational from a management
perspective; a row in this state contains
all information necessary for a transition to
the active state;
EOS Working Group Expires December 2001 [Page 23]
Internet Draft SNMP Row Operations Extensions 15 June 2001
- `notReady', which indicates that the
conceptual row is not available for use
by the managed device, perhaps because the
row is missing information or the row has
been explicitly set to this state;
Any of the three states may be specified in a
management protocol set operation. At any time,
the value of an existing RowState object may be
modified or changed to any other state unless
the current value is notReady and the row (after
completion of a management set operation) would
not be consistent with an active state (i.e.
information is missing or inconsistent and as a
result the row could not assume an active state
until further management set operations were
performed). In this case, the value MUST remain
at notReady and an inconsistentValue error is
returned.
A RowState object whose value is notReady MUST
implicitly promote itself from notReady to
notInService if any management protocol set
operation not referencing the status column
explicitly changes the value of any other object
in the same row AND the row afterward is now
consistent with the active state (i.e all
information needed to make the row active is
available).
When a row does not exist, and a management
protocol set operation causes any object in the row
to be created, the status object will also be
instantiated and its initial value will be determined
by the first of the following rules that are satisfied:
1. if the set operation includes an initial value,
the RowState object will take on the highest
value (i.e. active is highest) consistent with
the state definitions, but no higher than the
provided value. For example, if a set operation
contains a varbind where RowState=notInService
(or active), the initial value will be notReady
if the row is in an inconsistent state after the
operation is complete; otherwise, it will be
notInService (or active).
2. if the set operation does not include an initial
EOS Working Group Expires December 2001 [Page 24]
Internet Draft SNMP Row Operations Extensions 15 June 2001
value, but the RowState definition does include
a supported DEFVAL, the initial value will be the
highest value consistent with the state definitions
but no higher than the value specified in the
DEFVAL, unless the DEFVAL specifies a value of
notReady, which in this case, the DEFVAL is ignored
(i.e. case 3 below instead applies).
3. otherwise, the set operation does not include an
initial value, and the RowState definition does
not include a DEFVAL, and the initial value will
be set to the highest value consistent with the
state definitions. Thus, the initial state will
be active if the new row is consistent with that
state, or it will be notReady otherwise.
No constraint is imposed on whether other objects
in the same row can be modified, regardless of the
value of the associated RowState object. If such
constraints are desired, they MUST be explicitly
stated in the DESCRIPTION clause of the status column.
In the absence of such statements, the managed device
MUST allow any object in any row to be modified at
any time, notwithstanding the possibility that other
MIB objects MAY also impose similar constraints.
An inconsistentValue error is returned when an invalid
attempt is made to alter a row whose state precludes
such an operation.
RowState description clauses, in addition to
the DESCRIPTION clauses of associated column
objects, SHOULD together describe the general
conditions under which a row can be made active.
In the absence of such statements, any row SHOULD
generally be capable of being made active at any
time.
The agent must detect conceptual rows that
have been in the notReady state for an abnormally
long period of time and remove them. It is the
responsibility of the DESCRIPTION clause of the
status column to indicate what an abnormally long
period of time would be. This period of time should
be long enough to allow for human response time
(including `think time') between the creation of the
conceptual row and the setting of the status to `active'.
In the absense of such information in the DESCRIPTION
clause, it is suggested that this period be approximately
EOS Working Group Expires December 2001 [Page 25]
Internet Draft SNMP Row Operations Extensions 15 June 2001
5 minutes in length. This removal action applies not only
to newly-created rows, but also to previously active rows
which are set to, and left in, the notReady state for a
prolonged period exceeding that which is considered normal
for such a conceptual row."
SYNTAX INTEGER {
active(1),
notInService(2),
notReady(3)
}
END
8. IANA Considerations
This document requires IANASnmpExtendedProtocol values to be reserved
for allowing command responders to advertise their ability to support
the extensions outlined in this document. IANASnmpExtendedProtocol
values are administered by IANA. IANASnmpExtendedProtocol is defined
in SNMP-X-PROTOCOL-TC.
9. Intellectual Property
The IETF takes no position regarding the validity or scope of any
intellectual property 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; neither does it represent that it
has made any effort to identify any such rights. Information on the
IETF's procedures with respect to rights in standards-track and
standards-related documentation can be found in BCP-11. Copies of
claims of rights made available for publication 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 implementors or users of this specification can
be obtained from the IETF Secretariat.
The IETF invites any interested party to bring to its attention any
copyrights, patents or patent applications, or other proprietary
rights which may cover technology that may be required to practice
this standard. Please address the information to the IETF Executive
Director.
EOS Working Group Expires December 2001 [Page 26]
Internet Draft SNMP Row Operations Extensions 15 June 2001
10. Acknowledgements
This document is the result of the efforts of the Evolution Of SNMP
(EOS) Working Group. Some special thanks are in order to the
following EOS WG members for their ideas, efforts and asundry
contributions:
Dr. Jeff Case
Sharon Chisholm
Dale Francisco
Sandra McLeod
Steve Moulton
David Perkins
Randy Presuhn
Jeurgen Schoenwaelder
Robert Story
Glenn Waters
Matt White
11. Security Considerations
TBD
12. References
[RFC1155] Rose, M. and K. McCloghrie, "Structure and
Identification of Management Information for TCP/IP-
based internets", STD 16, RFC 1155, May 1990.
[RFC1157] Case, J., M. Fedor, M. Schoffstall and J. Davin, "The
Simple Network Management Protocol", STD 15, RFC 1157,
May 1990.
[RFC1212] Rose, M. and K. McCloghrie, "Concise MIB Definitions",
STD 16, RFC 1212, March 1991.
[RFC1901] The SNMPv2 Working Group, Case, J., McCloghrie, K.,
Rose, M. and S. Waldbusser, "Introduction to
Community-based SNMPv2", RFC 1901, January 1996.
[RFC2571] Harrington, D., Presuhn, R., and B. Wijnen, "An
Architecture for Describing SNMP Management Frameworks",
RFC 2571, April 1999.
[RFC2578] McCloghrie, K., Perkins, D. and J. Schoenwaelder,
"Structure of Management Information Version 2 (SMIv2)",
STD 58, RFC 2578, April 1999.
EOS Working Group Expires December 2001 [Page 27]
Internet Draft SNMP Row Operations Extensions 15 June 2001
[RFC2579] McCloghrie, K., Perkins, D., and J. Schoenwaelder,
"Textual Conventions for SMIv2", STD 58, RFC 2579, April
1999.
[RFC2580] McCloghrie, K., Perkins, D., and J. Schoenwaelder,
"Conformance Statements for SMIv2", STD 58, RFC 2580,
April 1999.
[RFC-PROTO] Presuhn, R., Case, J., McCloghrie, K., Rose, M., and S.
Waldbusser, "Protocol Operations for the Simple Network
Management Protocol", <draft-ietf-snmpv3-update-proto-
05.txt>, June 2001.
[RFC-TMM] Presuhn, R., Case, J., McCloghrie, K., Rose, M., and S.
Waldbusser, "Transport Mappings for the Simple Network
Management Protocol", <draft-ietf-snmpv3-update-
transmap-05.txt>, June 2001.
[RFC-MIB] Presuhn, R., Case, J., McCloghrie, K., Rose, M. and S.
Waldbusser, "Management Information Base for the Simple
Network Management Protocol", <draft-ietf-snmpv3-
update-mib-05.txt>, June 2001.
[RFC-COEX] Frye, R., Levi, D., Routhier, S., and B. Wijnen,
"Coexistence between Version 1, Version 2, and Version 3
of the Internet-standard Network Management Framework",
<draft-ietf-snmpv3-coex-v2-00.txt>, June 2001.
[RFC1909] McCloghrie, K., Editor, "An Administrative
Infrastructure for SNMPv2", RFC 1909, February 1996.
[RFC1910] Waters, G., Editor, "User-based Security Model for
SNMPv2", RFC 1910, February 1996.
[RFC2279] Yergeau, F., "UTF-8, a transformation format of ISO
10646", RFC 2279, January, 1998.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, March 1997.
[BCP-11] Hovey, R. and S. Bradner, "The Organizations Involved in
the IETF Standards Process", BCP 11, RFC 2028, October
1996.
[RFC2863] McCloghrie, K. and F. Kastenholz. "The Interfaces Group
MIB." RFC 2863, June 2000.
[SNMP-MPD] Case, J., Harrington, D., Presuhn, R. and B. Wijnen,
EOS Working Group Expires December 2001 [Page 28]
Internet Draft SNMP Row Operations Extensions 15 June 2001
"Message Processing and Dispatching for the Simple
Network Management Protocol (SNMP)", <draft-ietf-
snmpv3-mpd-v2-00.txt>, June 2001.
[SNMP-USM] Blumenthal, U. and B. Wijnen, "The User-Based Security
Model for Version 3 of the Simple Network Management
Protocol (SNMPv3)", <draft-ietf-snmpv3-usm-v2-00.txt>,
June 2001.
[SNMP-ACM] Wijnen, B., Presuhn, R. and K. McCloghrie, "View-based
Access Control Model for the Simple Network Management
Protocol (SNMP)", <draft-ietf-snmpv3-vacm-04.txt>,
February 1999. <draft-ietf-snmpv3-vacm-v2-00.txt>, June
2001.
[RFC-APPL] Levi, D., Meyer, P. and B. Stewart, "SNMP
Applications", <draft-ietf-snmpv3-apps-v2-00.txt>, June
2001.
[RFC2570] Case, J., Mundy, R., Partain, D. and B. Stewart,
"Introduction to Version 3 of the Internet-standard
Network Management Framework", <draft-ietf-snmpv3-
intro-04.txt>, January 1999.
[RFC-COEX] Frye, R., Levi, D., Routhier, S., and B. Wijnen,
"Coexistence between Version 1, Version 2, and Version 3
of the Internet-standard Network Management Framework",
<draft-ietf-snmpv3-coex-v2-00.txt>, June 2001.
EOS Working Group Expires December 2001 [Page 29]
Internet Draft SNMP Row Operations Extensions 15 June 2001
13. Editor's Addresses
Lauren Heintz
Cisco Systems, Inc.
130 Baytech Drive
San Jose, Ca 95134
Phone: +1 408-853-6568
EMail: lheintz@cisco.com
EOS Working Group Expires December 2001 [Page 30]
Internet Draft SNMP Row Operations Extensions 15 June 2001
APPENDIXES
A. Impact to SNMP and other Protocols
A.1. SNMPv3
An issue remains whether a new message processing model MUST be
specified as part of the SNMPv3 (or later) standard. Otherwise, it is
not seen that these extensions pose any impact to other SNMPv3
architectural components (i.e. USM, VACM) because the new protocol
operations and their contents contain sufficient information (along
with the information provided in whatever version-specific message
wrapper they are contined within) to satisfy the abstract service
interfaces for those components.
However, these extensions may not be fully compatible with the SNMPv3
proxy application (or any legacy SNMP application incorporating a
message processing module that receives and processes or forwards
SNMP messages).
A.2. AgentX
These extensions imply that AgentX will have to evolve in order to
support the new protocol operations. For example, AgentX does not
provide a delete PDU (to support DeleteRow), and neither does its
TestSet PDU provide for a standard way to indicate whether the
operation being performed maps to a CreateRow or EditRow request.
Furthermore, master agents will need to know how to recognize and
process the new protocol operations (i.e. distinguish RowIdentifiers
from Operands, logically expand the targeted object OIDs and map them
to subtree registrations).
The feature to allow extended error codes to be returned in response
PDUs may also require AgentX to provide a means to communicate such
information from the subagent(s) to the master agent.
B. Examples of Row Operations
B.1. CreateRow
Create two new rows in the snmpNotifyTable [RFC2573]. This table
uses RowStatus, so we choose to explicitly set its value for each row
(new impls may allow the request to omit a RowStatus varbind if its
EOS Working Group Expires December 2001 [Page 31]
Internet Draft SNMP Row Operations Extensions 15 June 2001
value is createAndGo). The response includes the values of the
specified Operands after row creation.
CreateRow
(
request-id = 1
non-repeaters = 0 -- 0 Singletons
max-repetitions = 0
-- RowOp 1
-- RowIdentifier
vb1.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb1.value = 1.0.114.111.119.49 -- "row1"
vb2.name = 0.2 -- snmpNotifyTag
vb2.value = "tag1"
vb3.name = 0.3 -- snmpNotifyType
vb3.value = 1 -- trap
-- skip snmpNotifyStorageType. Use DEFVAL
vb4.name = 0.5 -- snmpNotifyRowStatus
vb4.value = createAndGo
-- RowOp 2
-- RowIdentifier
vb5.name = 0.0 -- inherit snmpNotifyTable
vb5.value = 1.0.114.111.119.50 -- "row2"
vb6.name = 0.3 -- snmpNotifyType
vb6.value = 1 -- trap
vb7.name = 0.5 -- snmpNotifyRowStatus
vb7.value = createAndWait
)
ResponsePdu
(
request-id = 1
error-status = noError
-- RowOp 1
-- RowIdentifier
vb1.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
EOS Working Group Expires December 2001 [Page 32]
Internet Draft SNMP Row Operations Extensions 15 June 2001
vb1.value = 1.0.114.111.119.49 -- "row1"
vb2.name = 0.2 -- snmpNotifyTag
vb2.value = "tag1"
vb3.name = 0.3 -- snmpNotifyType
vb3.value = 1 -- trap
vb4.name = 0.5 -- snmpNotifyRowStatus
vb4.value = active
-- RowOp 2
-- RowIdentifier
vb5.name = 0.0 -- inherit snmpNotifyTable
vb5.value = 1.0.114.111.119.50 -- "row2"
vb6.name = 0.3 -- snmpNotifyType
vb6.value = 1 -- trap
vb7.name = 0.5 -- snmpNotifyRowStatus
vb7.value = notInService
)
This protocol exchange illustrates the use of the CreateRow request
to create two new rows in the snmpNotifyTable [RFC2573] except that
we pretend here that RowState was used in the design of that table
instead of RowStatus.
CreateRow
(
request-id = 2
non-repeaters = 0 -- 0 Singletons
max-repetitions = 0
-- RowOp 1
-- RowIdentifier
vb1.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb1.value = 1.0.114.111.119.49 -- "row1"
vb2.name = 0.2 -- snmpNotifyTag
vb2.value = "tag1"
vb3.name = 0.3 -- snmpNotifyType
vb3.value = 1 -- trap
-- skip snmpNotifyStorageType. Use DEFVAL
EOS Working Group Expires December 2001 [Page 33]
Internet Draft SNMP Row Operations Extensions 15 June 2001
-- By omitting a RowState varbind, it is the
-- same as setting RowState=Active.
-- RowOp 2
-- RowIdentifier
vb4.name = 0.0 -- inherit snmpNotifyTable
vb4.value = 1.0.114.111.119.50 -- "row2"
vb5.name = 0.3 -- snmpNotifyType
vb5.value = 1 -- trap
-- Explicitly set RowState to an initial
-- value because we don't want to go
-- active just yet. Even though we hint
-- for an initial value of NotInService,
-- it's possible that the result might
-- show NotReady (if the row as defined
-- by this RowOp were not ready to go Active).
-- If a DEFVAL (NotInService) were provided
-- in the MIB, this varbind could be omitted
-- from this RowOp.
vb6.name = 0.5 -- snmpNotifyRowState
vb6.value = NotInService
)
ResponsePdu
(
request-id = 2
error-status = noError
-- RowOp 1
-- RowIdentifier
vb1.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb1.value = 1.0.114.111.119.49 -- "row1"
vb2.name = 0.2 -- snmpNotifyTag
vb2.value = "tag1"
vb3.name = 0.3 -- snmpNotifyType
vb3.value = 1 -- trap
-- RowOp 2
-- RowIdentifier
vb4.name = 0.0 -- inherit snmpNotifyTable
vb4.value = 1.0.114.111.119.50 -- "row2"
EOS Working Group Expires December 2001 [Page 34]
Internet Draft SNMP Row Operations Extensions 15 June 2001
vb5.name = 0.3 -- snmpNotifyType
vb5.value = 1 -- trap
vb6.name = 0.5 -- snmpNotifyRowState
vb6.value = NotInService
)
B.2. DeleteRow
Delete the two rows created in either of the two previous examples.
Note that the RowIdentifier in the second RowOp does not inherit the
table OID from the first RowOp. Although this is legal, it also
needlessly increases the request PDU size. Also note that the
command responder instead chose to use name-level inheritance.
DeleteRow
(
request-id = 3
non-repeaters = 0 -- 0 Singletons
max-repetitions = 0
-- RowOp 1
-- RowIdentifier
vb1.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb1.value = 1.0.114.111.119.49 -- "row1"
-- RowOp 2
-- RowIdentifier
vb2.name = 1.3.6.1.6.3.13.1.1 -- snmpNotifyTable
vb2.value = 1.0.114.111.119.50 -- "row2"
)
ResponsePdu
(
request-id = 3
error-status = noError
-- RowOp 1
-- RowIdentifier
vb1.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb1.value = 1.0.114.111.119.49 -- "row1"
-- RowOp 2
EOS Working Group Expires December 2001 [Page 35]
Internet Draft SNMP Row Operations Extensions 15 June 2001
-- RowIdentifier
vb2.name = 0.0 -- snmpNotifyTable
vb2.value = 1.0.114.111.119.50 -- "row2"
)
This DeleteRow example illustrates the use of Singletons. The
Singletons allow a complete object instance to be provided (whereas
the previous example contained no Operands and thus did not have
access to the column descriptors, which are needed to form complete
OIDs). If the user's VACM view only allowed him/her to delete certain
rows in a table, the DeleteRow request would have to contain enough
information to satisfy the isAccessAllowed service interface
[RFC2573], and the above example does not. This can be accomplished
by either providing an Operand within each RowOp or by instead using
Singletons, which are more efficient than using RowOps in such cases.
DeleteRow
(
request-id = 4
non-repeaters = 2 -- 2 Singletons
max-repetitions = 0
-- Singleton 1
-- delete snmpNotifyTag in row1, which
-- in this case also deletes all of row1
vb1.name = 0.0.6.3.13.1.1.1.2.114.111.119.49
vb1.value = NULL
-- Singleton 2
-- delete snmpNotifyTag in row2, which
-- in this case also deletes all of row2
vb1.name = 0.0.6.3.13.1.1.1.2.114.111.119.50
vb1.value = NULL
)
B.3. GetRow
This is an example of a protocol exchange for a GetRow request and
its response.
GetRow
(
request-id = 5
non-repeaters = 0 -- 0 Singletons
max-repetitions = 0
EOS Working Group Expires December 2001 [Page 36]
Internet Draft SNMP Row Operations Extensions 15 June 2001
-- RowOp 1
-- RowIdentifier
vb1.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb1.value = 1.0.114.111.119.49 -- "row1"
vb2.name = 0.2 -- snmpNotifyTag
vb2.value = NULL
vb3.name = 0.3 -- snmpNotifyType
vb3.value = NULL
-- RowOp 2
-- RowIdentifier
vb4.name = 0.0 -- inherit snmpNotifyTable
vb4.value = 1.0.114.111.119.50 -- "row2"
vb5.name = 0.5 -- snmpNotifyRowStatus
vb5.value = NULL
-- must use the 0.1.X OID form because 999 > 39
vb6.name = 0.1.999 -- Should result in NoSuchObject
vb6.value = NULL
)
ResponsePdu
(
request-id = 5
error-status = noError
-- RowOp 1
-- RowIdentifier
vb1.name = 0.0.6.3.13.1.1.1 -- snmpNotifyTable
vb1.value = 1.0.114.111.119.49 -- "row1"
vb2.name = 0.2 -- snmpNotifyTag
vb2.value = "tag1"
vb3.name = 0.3 -- snmpNotifyType
vb3.value = 1 -- trap
-- RowOp 2
-- RowIdentifier
vb4.name = 0.0 -- inherit snmpNotifyTable
vb4.value = 1.0.114.111.119.50 -- "row2"
EOS Working Group Expires December 2001 [Page 37]
Internet Draft SNMP Row Operations Extensions 15 June 2001
vb5.name = 0.5 -- snmpNotifyRowStatus
vb5.value = NotInService
vb6.name = 0.1.999
vb6.value = NoSuchObject
)
This GetRow request includes one Singleton using prefix-level
inheritance to retrieve the sysUpTime value along with one RowOp.
GetRow
(
request-id = 6
non-repeaters = 1 -- 1 Singleton
max-repetitions = 0
-- Singletons
vb1.name = 0.0.2.1.1.3.0 -- get(sysUpTime.0)
vb1.value = NULL
-- RowOp 1
-- RowIdentifier
vb2.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb2.value = 1.0.114.111.119.49 -- "row1"
vb3.name = 0.2 -- snmpNotifyTag
vb3.value = NULL
vb4.name = 0.3 -- snmpNotifyType
vb4.value = NULL
}
ResponsePdu
(
request-id = 6
error-status = noError
-- Singletons
-- Singleton 1. The original request
-- contained non-repeaters = 1. This
-- count is not transmitted back in the
-- response, so the originating command generator
-- must maintain this count and associate it
-- to the returned request-id.
vb1.name = 0.0.2.1.1.3.0 -- sysUpTime.0
EOS Working Group Expires December 2001 [Page 38]
Internet Draft SNMP Row Operations Extensions 15 June 2001
vb1.value = 123456
-- RowOp 1
-- RowIdentifier
vb2.name = 0.0.6.3.13.1.1.1 -- snmpNotifyTable
vb2.value = 1.0.114.111.119.49 -- "row1"
vb3.name = 0.2 -- snmpNotifyTag
vb3.value = "tag1"
vb4.name = 0.3 -- snmpNotifyType
vb4.value = 1 -- trap
)
B.4. GetNextRow
This is an example of a protocol exchange for a GetNextRow request
and its response.
GetNextRow
(
request-id = 7
non-repeaters = 1 -- 1 Singleton
max-repetitions = 0
-- Singletons
vb1.name = 0.0.2.1.1.3 -- getNext(sysUpTime)
vb1.value = NULL
-- RowOp 1
-- RowIdentifier
vb2.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb2.value = 1.0.114.111.119 -- "row" (partial instance)
vb3.name = 0.2 -- snmpNotifyTag
vb3.value = NULL
vb4.name = 0.3 -- snmpNotifyType
vb4.value = NULL
-- RowOp 2
-- RowIdentifier
vb5.name = 0.0 -- inherit snmpNotifyTable
EOS Working Group Expires December 2001 [Page 39]
Internet Draft SNMP Row Operations Extensions 15 June 2001
vb5.value = 1.0
-- No Operands, this RowOp is logically identical
-- to GetNext(snmpNotifyEntry). A bit inefficient
-- since it produces a response RowOp containing
-- only one Operand (would be better as a Singleton)..
)
ResponsePdu
(
request-id = 7
error-status = noError
-- Singletons
vb1.name = 0.0.2.1.1.3.0 -- sysUpTime.0
vb1.value = 123457
-- RowOp 1
-- RowIdentifier
vb2.name = 0.0.6.3.13.1.1.1 -- snmpNotifyTable
vb2.value = 1.0.114.111.119.49 -- "row1"
vb3.name = 0.2 -- snmpNotifyTag
vb3.value = "tag1"
vb4.name = 0.3 -- snmpNotifyType
vb4.value = 1 -- trap
-- RowOp 2
-- RowIdentifier
vb5.name = 0.0 -- inherit snmpNotifyTable
vb5.value = 1.0.114.111.119.49 -- "row1"
vb6.name = 0.2 -- snmpNotifyTag
vb6.value = "tag1"
)
The RowOps in this GetNextRow request are logically the same as a
getNext(snmpNotifyEntry), getNext(snmpNotifyTag) and getNext(system).
The fourth RowOp is illegally constructed and would return a genErr
error, because although the RowIdentifier is correctly formed, in
this case it contains an Instance without at least one Operand, and
without an Operand it is impossible to decide which table object the
getNext should be performed on. Note that it would be more efficient
to instead provide these types of RowOps as individual Singletons.
EOS Working Group Expires December 2001 [Page 40]
Internet Draft SNMP Row Operations Extensions 15 June 2001
GetNextRow
(
request-id = 8
non-repeaters = 0 -- 0 Singletons
max-repetitions = 0
-- RowOp 1, same as getNext(snmpNotifyEntry)
-- RowIdentifier
vb1.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb1.value = 1.0
-- RowOp 2, same as getNext(snmpNotifyTag)
-- RowIdentifier
vb2.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb2.value = 1.0
vb3.name = 0.2 -- snmpNotifyTag
vb3.value = NULL
-- RowOp 3, same as getNext(system)
-- RowIdentifier
vb4.name = 0.0.2.1.1 -- system
vb4.value = 0.0 -- not a table
-- RowOp 4, same as getNext(snmpNotifyEntry)
-- RowIdentifier (missing Operand produces genErr)
vb5.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb5.value = 1.0.114.111.119.49 -- "row1"
}
B.5. GetBulkRow
This GetBulkRow request includes one Singleton using prefix-level
inheritance to retrieve the sysUpTime value along with two RowOps.
Though both of the RowOps in this request are legal, note that RowOp2
returns a subset of RowOp1's desired values. Therefore, RowOp2 could
be omitted without affecting the response.
GetBulkRow
(
request-id = 9
non-repeaters = 1 -- 1 Singleton
max-repetitions = 0 -- head/tail disabled
EOS Working Group Expires December 2001 [Page 41]
Internet Draft SNMP Row Operations Extensions 15 June 2001
-- Singletons
vb1.name = 0.0.2.1.1.3 -- getNext(sysUpTime)
vb1.value = NULL
-- RowOp 1
-- RowIdentifier
-- Retreive all snmpNotifyTags and
-- RowStatus objects from
-- row1 to end of table (Instance2 not provided).
vb2.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb2.value = 1.0.4.114.111.119.49 -- "row1"
vb3.name = 0.2 -- snmpNotifyTag
vb3.value = NULL
vb4.name = 0.5 -- snmpNotifyRowStatus
vb4.value = NULL
-- RowOp 2
-- RowIdentifier
-- Retreive all snmpNotifyTags and
-- RowStatus objects from
-- row1 to row3 (inclusive)
vb5.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb5.value = 1.0.4.114.111.119.49.114.111.119.51
vb6.name = 0.2 -- snmpNotifyTag
vb6.value = NULL
vb7.name = 0.5 -- snmpNotifyRowStatus
vb7.value = NULL
}
ResponsePdu
(
request-id = 9
error-status = noError
-- Singletons
vb1.name = 0.0.2.1.1.3.0 -- sysUpTime.0
vb1.value = 123458
-- RowOp 1
EOS Working Group Expires December 2001 [Page 42]
Internet Draft SNMP Row Operations Extensions 15 June 2001
-- RowIdentifier
vb2.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb2.value = 1.0.4.114.111.119.49 -- "row1"
vb3.name = 0.2 -- snmpNotifyTag
vb3.value = "tag1"
vb4.name = 0.5 -- snmpNotifyRowStatus
vb4.value = Active
-- RowOp 2
-- RowIdentifier
vb5.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb5.value = 1.0.4.114.111.119.50 -- "row2"
vb6.name = 0.2 -- snmpNotifyTag
vb6.value = "tag2"
vb7.name = 0.5 -- snmpNotifyRowStatus
vb7.value = Active
-- RowOp 3
-- RowIdentifier
vb8.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb8.value = 1.0.4.114.111.119.51 -- "row3"
vb9.name = 0.2 -- snmpNotifyTag
vb9.value = "tag3"
vb10.name = 0.5 -- snmpNotifyRowStatus
vb10.value = Active
-- RowOp 4
-- RowIdentifier
vb11.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb11.value = 1.0.4.114.111.119.52 -- "row4"
vb12.name = 0.2 -- snmpNotifyTag
vb12.value = "tag4"
vb13.name = 0.5 -- snmpNotifyRowStatus
vb13.value = Active
-- RowOp 5
EOS Working Group Expires December 2001 [Page 43]
Internet Draft SNMP Row Operations Extensions 15 June 2001
-- RowIdentifier
vb14.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb14.value = 1.0.4.114.111.119.53 -- "row5"
vb15.name = 0.2 -- snmpNotifyTag
vb15.value = "tag5"
vb16.name = 0.5 -- snmpNotifyRowStatus
vb16.value = Active
}
This GetBulkRow request is the same as the previous example except
that RowOp2 specifies a column not included in RowOp1. The response
would be identical to the above response except that RowOps1-3 (row
1-3) would include a Operand/value for snmpNotifyType.
GetBulkRow
(
request-id = 10
non-repeaters = 1 -- 1 Singleton
max-repetitions = 0 -- head/tail disabled
-- Singletons
vb1.name = 0.0.2.1.1.3 -- getNext(sysUpTime)
vb1.value = NULL
-- RowOp 1
-- RowIdentifier
-- Retreive all snmpNotifyTags and
-- RowStatus objects from
-- row1 to end of table (Instance2 not provided).
vb2.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb2.value = 1.0.4.114.111.119.49 -- "row1"
vb3.name = 0.2 -- snmpNotifyTag
vb3.value = NULL
vb4.name = 0.5 -- snmpNotifyRowStatus
vb4.value = NULL
-- RowOp 2
-- RowIdentifier
-- Retreive all snmpNotifyTypes and
-- RowStatus objects from
-- row1 to row3 (inclusive)
EOS Working Group Expires December 2001 [Page 44]
Internet Draft SNMP Row Operations Extensions 15 June 2001
vb5.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb5.value = 1.0.4.114.111.119.49.114.111.119.51
vb6.name = 0.3 -- snmpNotifyType
vb6.value = NULL
vb7.name = 0.5 -- snmpNotifyRowStatus
vb7.value = NULL
}
This GetBulkRow request includes two RowOps to show how to perform a
head and tail function, respectively.
In RowOp1 (head function), the search range is indicated by the OID
1.0.0 (no Instance or Instance2 values provided). That value along
with a non-zero max-reps value indicates a head function with a
possible search range of the entire table.
In RowOp2 (tail function), the search range is indicated by the the
OID 1.0 (no InstanceLen, Instance or Instance2 values provided). That
value along with a non-zero max-reps value indicates a tail function
with a possible search range of the entire table.
The Response indicates the desired objects in the first and last two
rows of the table are returned (five rows in table, so row3 is not
returned).
Note that if max-reps were instead 0, the two RowOps would be
logically identical.
GetBulkRow
(
request-id = 11
non-repeaters = 0 -- 0 Singletons
max-repetitions = 2 -- head/tail enabled
-- RowOp 1
-- RowIdentifier
vb1.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb1.value = 1.0.0 -- head search entire table
vb2.name = 0.2 -- snmpNotifyTag
vb2.value = NULL
vb3.name = 0.5 -- snmpNotifyRowStatus
vb3.value = NULL
EOS Working Group Expires December 2001 [Page 45]
Internet Draft SNMP Row Operations Extensions 15 June 2001
-- RowOp 2
-- RowIdentifier
vb4.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb4.value = 1.0 -- tail search entire table
vb5.name = 0.2 -- snmpNotifyTag
vb5.value = NULL
vb6.name = 0.5 -- snmpNotifyRowStatus
vb6.value = NULL
}
ResponsePdu
(
request-id = 11
error-status = noError
-- RowOp 1
-- RowIdentifier
vb1.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb1.value = 1.0.4.114.111.119.49 -- "row1"
vb2.name = 0.2 -- snmpNotifyTag
vb2.value = "tag1"
vb3.name = 0.5 -- snmpNotifyRowStatus
vb3.value = Active
-- RowOp 2
-- RowIdentifier
vb4.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb4.value = 1.0.4.114.111.119.50 -- "row2"
vb5.name = 0.2 -- snmpNotifyTag
vb5.value = "tag2"
vb6.name = 0.5 -- snmpNotifyRowStatus
vb6.value = Active
-- RowOp 3
-- RowIdentifier
vb7.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb7.value = 1.0.4.114.111.119.52 -- "row4"
EOS Working Group Expires December 2001 [Page 46]
Internet Draft SNMP Row Operations Extensions 15 June 2001
vb8.name = 0.2 -- snmpNotifyTag
vb8.value = "tag4"
vb9.name = 0.5 -- snmpNotifyRowStatus
vb9.value = Active
-- RowOp 4
-- RowIdentifier
vb10.name = 0.0.6.3.13.1.1 -- snmpNotifyTable
vb10.value = 1.0.4.114.111.119.53 -- "row5"
vb11.name = 0.2 -- snmpNotifyTag
vb11.value = "tag5"
vb12.name = 0.5 -- snmpNotifyRowStatus
vb12.value = Active
}
This GetBulkRow requests data from two columns of the same table. The
response shows RowOps and Singletons interspersed with one another
(i.e. rows with only one object to return cause Singletons to be
returned instead of RowOps, which be definitions MUST have two or
more Operands in GetBulkRow responses). Although this example uses a
shorthand notation (i.e. fooTable), the actual OIDs would utilize OID
inheritance wherever possible. Also note that row3 did not produce a
result.
GetBulkRow
(
request-id = 12
non-repeaters = 0 -- 0 Singletons
max-repetitions = 0 -- head/tail disabled
-- RowOp 1
-- RowIdentifier
vb1.name = fooTable
vb1.value = 1.0 -- search entire table
vb2.name = 0.2 -- fooColumnA
vb2.value = NULL
vb3.name = 0.3 -- fooColumnB
vb3.value = NULL
}
ResponsePdu
EOS Working Group Expires December 2001 [Page 47]
Internet Draft SNMP Row Operations Extensions 15 June 2001
(
request-id = 12
error-status = noError
-- RowOp 1
-- RowIdentifier
vb1.name = fooTable
vb1.value = 1.0.1 -- row 1
vb2.name = 0.2 -- fooColumnA
vb2.value = 1
vb3.name = 0.3 -- fooColumnB
vb3.value = 1
-- Singleton 1
vb4.name = fooColumnA.2 -- row 2
vb4.value = 2
-- Singleton 2
vb5.name = fooColumnB.3 -- row 4
vb5.value = 4
-- RowOp 2
-- RowIdentifier
vb6.name = fooTable
vb6.value = 1.0.5 -- row 5
vb7.name = 0.2 -- fooColumnA
vb7.value = 5
vb8.name = 0.3 -- fooColumnB
vb8.value = 5
-- Singleton 3
vb9.name = fooColumnA.6 -- row 6
vb9.value = 6
}
B.6. EditRow
This EditRow hypothetically produces the shown response which
EOS Working Group Expires December 2001 [Page 48]
Internet Draft SNMP Row Operations Extensions 15 June 2001
indicates several errors: first, varbind 2 caused a wrongValue error,
secondly, varbind 2 also caused an application specific error 11
(perhaps tooManySlicesInserted), and finally, varbinds 3 and 6 both
caused yet another application specific error 14 (perhaps
tempTooHigh). Additionally, the returned Operand values are set to
NULL to indicate the third-phase (get) was not executed (due to
test-phase failure).
EditRow
(
request-id = 13
non-repeaters = 0 -- no Singletons
max-repetitions = 0
-- RowOp 1
-- RowIdentifier
vb1.name = toasterTable
vb1.value = 1.0.1 -- toaster/row "1"
vb2.name = 0.2 -- toasterSlicesInserted
vb2.value = 100
vb3.name = 0.3 -- toasterTemp
vb3.value = 1000
-- RowOp 2
-- RowIdentifier
vb4.name = toasterTable
vb4.value = 1.0.2 -- toaster/row "2"
vb5.name = 0.2 -- toasterSlicesInserted
vb5.value = 2
vb6.name = 0.3 -- toasterTemp
vb6.value = 1000
}
ResponsePdu
(
request-id = 13
error-status = 10 (wrongValue)
error-index = 2
-- RowOp 1
-- RowIdentifier
EOS Working Group Expires December 2001 [Page 49]
Internet Draft SNMP Row Operations Extensions 15 June 2001
vb1.name = toasterTable
vb1.value = 1.0.1 -- toaster/row "1"
vb2.name = 0.2 -- toasterSlicesInserted
vb2.value = NULL
vb3.name = 0.3 -- toasterTemp
vb3.value = NULL
-- RowOp 2
-- RowIdentifier
vb4.name = toasterTable
vb4.value = 1.0.2 -- toaster/row "2"
vb5.name = 0.2 -- toasterSlicesInserted
vb5.value = NULL
vb6.name = 0.3 -- toasterTemp
vb6.value = NULL
-- Extended errors:
vb7.name = 0.0.0.11.2.0.14.3.6
vb7.value = NULL
}
C. Known issues
This section will be deleted before becoming an RFC.
These are known issues that need to be resolved before going
standards track:
- Should the coexistence and transition section be moved to a
different document?
- Need to specify a way for extended error codes to be mapped to
meaningful error messages. Perhaps IANA would maintain an
IANAExtendedErrorCodes textual-convention (along the lines of
IANAIfType) and all extended error codes would thus be
controlled via IANA. Also, a small range of the codes may need
to be reserved up-front for use by the IETF so that the
standard SNMP error-status codes and varbind-level exceptions
can also be mapped to extended code values. For example, we
may want to return "tooBig" in the case where a successful
GetBulkRow response is returned with only a portion of the
EOS Working Group Expires December 2001 [Page 50]
Internet Draft SNMP Row Operations Extensions 15 June 2001
requested data. The tooBig extended error is a "more" signal
to perform at least one more GetBulkRow (using the Instance in
the last RowOp as a beginnning search range).
- What other extended error codes should be reserved and defined
up front? For example, perhaps an "unsupportedOperation" needs
to be defined so that the EOS requests could return that error
on a RowOp by RowOp basis (where a given subagent is non-EOS
capable and others are). In such cases, incrementing the
droppedPdu counter may not be possible.
- How can SetRequests and/or EditRows be used to safely create
rows in tables using RowState in multi-mgr environments? It
would be ideal to have such a mechanism (without re-creating
RowStatus all over again) in order to ease the transition to
EOS-capable networks.
- Should this document contain procedures to translate EOS
operations to/from conventional operations?
- Should the MIB defs in this document (and all other EOS
documents) instead be located in one EOS document? This could
reduce the number of modules needed to be IMPORTED in future
MIBs/appls.
D. Full Copyright Statement
Copyright (C) The Internet Society (2001). All Rights Reserved.
This document and translations of it may be copied and furnished to
others, and derivative works that comment on or otherwise explain it
or assist in its implementation may be prepared, copied, published
and distributed, in whole or in part, without restriction of any
kind, provided that the above copyright notice and this paragraph are
included on all such copies and derivative works. However, this
document itself may not be modified in any way, such as by removing
the copyright notice or references to the Internet Society or other
Internet organizations, except as needed for the purpose of
developing Internet standards in which case the procedures for
copyrights defined in the Internet Standards process must be
followed, or as required to translate it into languages other than
English.
The limited permissions granted above are perpetual and will not be
revoked by the Internet Society or its successors or assigns.
This document and the information contained herein is provided on an
EOS Working Group Expires December 2001 [Page 51]
Internet Draft SNMP Row Operations Extensions 15 June 2001
"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
TASK FORCE DISCLAIMS 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.
Acknowledgement
Funding for the RFC Editor function is currently provided by the
Internet Society.
EOS Working Group Expires December 2001 [Page 52]