📄 rfc1023.txt
字号:
or dict GET-ATTRIBUTES dict If there is no template, emit Attribute objects for all of the items in the dictionary. This is equivalent to providing a template that lists all of the items in the dictionary. This allows a complete list of a dictionary's contents to be obtained. GET-ATTRIBUTES-MATCH dict value template GET-ATTRIBUTES-MATCH dict <array> should be an array (dictionary containing only one type of item). The first tag in <value> and <template> must match this type. For each entry in <array>, match the <value> against the contents of the entry. If there is a match, emit the atributes based upon <template>, just as in a GET-ATTRIBUTES operation. GET-ATTRIBUTES-MATCH is necessary because there will be situations where the contents of the elements of an array may differ, even though the array elements themselves are of the same type. The most obvious example of this is the situation where several network interfaces exist and are of different types, with different data collected for each type. NOTE: The GET-ATTRIBUTES-MATCH operator will disappear if a generalized filtering mechanism is devised. ADDITIONAL NOTE: A much cleaner method would be to store the attributes as sub-components of the data item of interest. For example, requesting: system{ clock-msec() } GET would normally just get the value of the data. Asking for anTrewitt & Partridge [Page 12]RFC 1023 HEMS Language October 1987 additional layer down the tree would now get its attributes: system{ clock-msec{ shortDesc, unitsDesc } GET would get the named attributes. (The attributes would be named with application-specific tags.) Unfortunately, ASN.1 doesn't provide an obvious notation to describe this type of organization. So, we're stuck with the GET-ATTRIBUTES operator. However, if this cleaner organization becomes possible, this decision may be re-thought.Examining Memory Even with the ability to symbolically access all of this information in an entity, there will still be times when it is necessary to get to very low levels and examine memory, as in remote debugging operations. The building blocks outlined so far can easily be extended to allow memory to be examined. Memory is modeled as an array, with an ASN.1 representation of OctetString. Because of the variety of addressing architectures in existence, the conversion between the OctetString and "memory" is very machine-dependent. The only simple case is for byte-addressed machines with 8 bits per byte. Each address space in an entity is represented by one dictionary. In a one-address-space situation, this dictionary will be at the top level. If each process has its own address space, then one "memory" dictionary may exist for each process. The GET-RANGE operator is provided for the primary purpose of retrieving the contents of memory, but can be used on any array. It is only useful in these other contexts if the array index is meaningful. GET-RANGE array start length GET-RANGE dict Get <length> elements of <array> starting at <start>. <start> and <length> are both ASN.1 INTEGER type. The returned data may not be <length> octets long, since it may take more than one octet to represent one memory location. Memory is special in that it will not automatically be returned as part of a request for an entire dictionary (e.g., If memory is part of the "system" dictionary, then requesting: system{} will emit the entire contents of the system dictionary, but not the memory item). NOTE: The GET-RANGE operator may disappear if a generalized filtering mechanism is devised.Trewitt & Partridge [Page 13]RFC 1023 HEMS Language October 1987Controlling Things All of the operators defined so far only allow data in an entity to be retrieved. By replacing the "template" arguments used in the GET operators with values, data in the entity can be changed. There are many control operations that do not correspond to simply changing the value of a piece of data, such as bringing an interface "down" or "up". In these cases, a special data item associated with the component being controlled (e.g., each interface), would be defined. Control operations then consist of "setting" this item to an appropriate command code. SET dict value SET dict Set the value(s) of data in the entity to the value(s) given in <value>. SET-MATCH array mvalue svalue SET-MATCH dict <array> should be a array (dictionary containing only one type of item). The first tag in <mvalue> and <svalue> must match this type. For each entry in <array>, match the <mvalue> against the contents of the entry. If there is a match, set value(s) in the entity to the value(s) in <svalue>, just as in SET. CREATE array value SET dict Insert a new entry into <array>. Depending upon the context, there may be severe restrictions about what constitutes a valid <value>. DELETE array value SET dict Delete the entry(s) in <array> that have values that match <value>. If there are several leaf items in the matched value, as in route-entry{ interface(1), cost(3) } all of them must match an array entry for any values to be changed. Here is an example of how this operator would be used to shut down the interface with ip-address 10.0.0.51 changing its status to "down". interfaces BEGIN -- get dictionary interface{ ip-addr(10.0.0.51) } -- value to match interface{ status(down) } -- value to set SET-MATCH END -- finished with dictTrewitt & Partridge [Page 14]RFC 1023 HEMS Language October 1987 Delete the routing table entry for 36.0.0.0. route-table BEGIN -- get dictionary route-entry{ ip-addr(36.0.0.0) } -- value to match DELETE END -- finished with dict Note that this BEGIN/END pair ends up sending an empty ASN.1 item. We don't regard this as a problem, as it is likely that there will be some get operations executed in the same context. In addition, the "open" ASN.1 item provides the correct context for reporting errors. (See page 14.) NOTE: The SET-MATCH operator will disappear and the DELETE operator will change if a generalized filtering mechanism is devised.Atomic Operations Atomic operations can be provided if desired by allowing the stack to contain a fragment of a query. A new operation would take a query fragment and verify its executability and execute it, atomically. This is mentioned as a possibility, but it may be difficult to implement. More study is needed.ERRORS If some particular information is requested but is not available for any reason (e.g., it doesn't apply to this implementation, isn't collected, etc.), it can ALWAYS be returned as "no-value" by giving the ASN.1 length as 0. When there is any other kind of error, such as having improper arguments on the top of the stack or trying to execute BEGIN when the tag doesn't refer to a dictionary, an ERROR object be emitted. The contents of this object identify the exact nature of the error and are discussed in RFC-1024. Since there may be several unterminated ASN.1 objects in progress at the time the error occurs, each one must be terminated. Each unterminated object will be closed with a copy of the ERROR object. Depending upon the type of length encoding used for this object, this will involve filling the value for the length (definite length form) or emitting two zero octets (indefinite length form). After all objects are terminated, a final copy of the ERROR object will be emitted. This structure guarantees that the error will be noticed at every level of interpretation on the receiving end.Trewitt & Partridge [Page 15]RFC 1023 HEMS Language October 1987 If there was an error before any ASN.1 objects were generated, then the result would simply be: error(details) If a couple of ASN.1 objects were unterminated, the result might look like: interfaces{ interface { name(...) type(...) error(details) } error(details) } error{details}EXTENDING THE SET OF VALUES There are two ways to extend the set of values understood by the query language. The first is to register the data and its meaning and get an ASN.1 tag assigned for it. This is the preferred method because it makes that data specification available for everyone to use. The second method is to use the VendorSpecific application type to "wrap" the vendor-specific data. Wherever an implementation defines data that is not in RFC-1024, the "VendorSpecific" tag should be used to label a dictionary containing the vendor-specific data. For example, if a vendor had some data associated with interfaces that was too strange to get standard numbers assigned for, they could, instead represent the data like this: interfaces { interface { in-pkts, out-pkts, ... VendorSpecific { ephemeris, declination } } } In this case, ephemeris and declination are two context-dependent tags assigned by the vendor for its non-standard data. If the vendor-specific method is chosen, the private data MUST have descriptions available through the GET-ATTRIBUTES and GET- ATTRIBUTESMATCH operators. Even with this descriptive ability, the preferred method is to get standard numbers assigned if possible.IMPLEMENTATION Although it is not normally in the spirit of RFCs to define an implementation, the authors feel that some suggestions will be usefulTrewitt & Partridge [Page 16]RFC 1023 HEMS Language October 1987 to early implementors of the query language. This list is not meant to be complete, but merely to give some hints about how the authors imagine that the query processor might be implemented efficiently. - The stack is an abstraction -- it should be implemented with pointers, not by copying dictionaries, etc. - An object-oriented approach should make initial implementation fairly easy. Changes to the "shape" if the data items (which will certainly occur, early on) will also be easier to make. - Only a few "messages" need to be understood by objects. - Most interesting objects are dictionaries, each of which can be implemented using pointers to the data and procedure "hooks" to perform specific operations such as GET, MATCH, SET, etc. - The hardest part is actually extracting the data from an existing TCP/IP implementions that weren't designed with detailed monitoring in mind. This should be less of a problem if a system is designed with easy monitoring as a goal.OBTAINING A COPY OF THE ASN.1 SPECIFICATION Copies of ISO Standard ASN.1 (Abstract Syntax Notation 1) are available from the following source. It comes in two parts; both are needed: IS 8824 -- Specification (meaning, notation) IS 8825 -- Encoding Rules (representation) They are available from: Omnicom Inc. 115 Park St, S.E. (new address as of March, 1987) Vienna, VA 22180 (703) 281-1135Trewitt & Partridge [Page 17]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -