RFC 1024
HEMS variable definitions
Part 1 of 11 ๐
RFC 1024: HEMS Variable Definitions ๐
okay bestie, let's start with the title block โจ This is RFC 1024, titled "HEMS VARIABLE DEFINITIONS". It's from the Network Working Group and was written by C. Partridge (BBN/NNSC) and G. Trewitt (Stanford), dated October 1987. The title block doesn't say anything about what it obsoletes or updates, and it doesn't list a category. The memo's own status section describes its status instead ๐ซถ
STATUS OF THIS MEMO ๐
okay so this memo assigns instruction codes, and defines object formats and object semantics, for use with the High-Level Monitoring and Control Language. That language is defined in RFC-1023 ๐ง
this memo is provisional, which means the definitions can change ๐ readers should check that they have the most recent version of the memo. no cap, this matters ๐
the authors assume you already know the ISO data encoding standard, ASN.1, and you have a general understanding of the IP protocol suite ๐ธ
distribution of this memo is unlimited ๐ฆ
INTRODUCTION ๐
in other memos [RFC-1021, RFC-1022] the authors described a general system for monitoring and controlling network entities. this system is called the High-Level Entity Management System (HEMS) ๐ it lets applications read and write values in remote entities that run a simple query processor. iconic ๐ญ
in this memo we standardize three things for the language: the instruction codes, the objects that can be read or written, and the meanings of any constants stored in those objects. this standardization has three parts ๐
- assigning an ASN.1 tag to each value
- defining the external representation of the value (for example, INTEGER, OCTETSTRING, etc.)
- defining the meaning, or semantics, of a value (for example, what types of packets a particular packet counter actually tracks) โจ
this definition is provisional. the authors hope it gets expanded and improved as the community gets more experienced with HEMS ๐ if you have ideas for new object definitions, or better ones, the authors really want to hear from you ๐ซถ
MESSAGE FORMATS ๐
all HEMS values are passed between applications and entities using the High-Level Entity Management Protocol (HEMP), which is specified in RFC-1022 ๐ฆ every value in this memo goes in the data sections of HEMP messages. for every message type, the data section is a SEQUENCE of objects. for requests, those objects are operations and their operands. replies hold a sequence of objects that a request retrieved. events start with an initial event object, followed by an optional number of objects related to the event ๐
messages that follow this memo should set the link field in the HEMP CommonHeader to 1, which means version 1 of HEMS. the resourceId field should be set to NULL ๐
CONTROL LANGUAGE INSTRUCTIONS ๐ง
the HEMS Monitoring and Control Language defines a suite of operations that the query processor must be able to perform ๐ these operations and their operands are ASN.1 objects, sent to the query processor over a network connection. they're sent in postfix form, so the operation comes after its operands. operands get pushed onto a stack, and they're processed when the operation shows up ๐ธ
so that operations are easy to spot in the input stream, they're all encoded in a single application-specific type. here it is ๐
Operation ::= [APPLICATION 1] IMPLICIT INTEGER {
reserved(0), get(1) begin(2), end(3),
get-match(4), get-attributes(5),
get-attributes-match(6), get-range(7),
set(8), set-match(9)
}
when the query processor hits an Operation object, it checks the value to figure out which operation to run (for example, GET) ๐ฅ
GENERAL COMMENTS ON OBJECTS STORED IN ENTITIES ๐
the High-Level Monitoring and Control Language needs the object space to have a tree-shaped type space. to find a particular object, you have to identify the section of the tree where that object lives. (there's a more detailed explanation of the scheme in RFC-1023 ๐ง)
this memo defines a universal type space. a subset of it is expected to be a suitable type space for any entity, like a gateway or a multi-user host. the type space is split into required and optional portions. implementors should implement the required portion, plus whichever part of the optional type space fits their particular entity ๐
here's the tricky part: some interesting objects aren't universal at all. they're very machine specific, like status registers on specialized hardware ๐ so that implementors can still retrieve those implementation-specific objects through HEMS, a special APPLICATION type is reserved for non-standard values โจ
putting objects into ASN.1 form means being able to map to and from ASN.1 format. one design goal here was to minimize how much ASN.1 compilation the query processor has to do, to keep the cost of processing queries at entities low. (that does mean the applications querying entities have to be more powerful ๐ช) most of the complex mapping happens when objects are read, since most writable objects have a simple format, like an INTEGER or an OCTETSTRING. because of this, the design leans heavily on the ASN.1 SET type, which lets values show up in any order. applications that need particular fields in an object can use the template structure to ask for those fields, but the query processor can still return them in whatever order is easiest for it ๐ซถ
to make the ASN.1 compilation problem easier, query processors are not required to reduce an INTEGER to the minimum number of octets that ASN.1 specifies. applications should be ready to receive INTEGERs with leading octets that are all zeros or all ones ๐ธ
more generally, a big HEMS design goal was to limit the data processing done at the entity, and put the burden of data reduction on the querying application. so the objects here are usually counters, or values the entity already has to compute ๐ object definitions that make the entity do data reduction aren't supported, though making them optionally available might be considered ๐
last but definitely not least, HEMS has to support access by multiple network management centers or applications. this brings some big consequences ๐ญ first, the SET operation can't be applied to any Counter, since changing a Counter's value could mess up data acquisition for other centers. beyond that, there are questions about competing or clashing SET requests from management centers. right now HEMS doesn't provide any way to protect against those requests. if that kind of protection becomes necessary, the authors picture enhancing the object definitions to include the idea of "owned" objects ๐
๐ Reading the Object Definitions ๐
okay bestie, so most of the rest of this memo is basically one giant list of every object the query processor manages โจ A lot of them are dictionaries, which are objects that point at other objects, so when you define one you have to say what class of objects it references ๐
The important stuff, like packet counts, lives at the leaves of the object data tree ๐ธ Those leaves need super careful definitions so their meaning stays consistent across every HEMS implementation ๐ฅ Each one gets written up in this format:
OBJECT: This is the name of the object.
Type: This is the ASN.1 type of the object.
Definition: The meaning of the data the object contains. Implementations should make sure their instance of the object fulfills this definition, because a big feature of HEMS is that objects mean the same thing on every machine. It's better not to implement an object than to abuse its definition ๐
Notes: An OPTIONAL section of the definition, used to talk about issues that aren't covered in the other sections of this specification.
Object Status: An OPTIONAL section that says whether the object is required of all HEMS implementations, encouraged, or just considered useful. There are currently four levels:
- Required: The object is felt to provide critical information and MUST be included in a fully conforming HEMS implementation.
- Required On Condition: The object is felt to provide critical information about an OPTIONAL feature of an IP entity (for example, support of the Transmission Control Protocol). The object is REQUIRED if the feature is implemented in the entity.
- Encouraged: The object is felt to provide very useful management information, and implementors are encouraged to implement it.
- Defined: The object MAY be useful and has been defined so that all implementations of the object are consistent.
If the object status is not specified, the object SHOULD be considered REQUIRED. If the parent dictionary is OPTIONAL, then the object SHOULD be considered REQUIRED if the parent dictionary is supported.
Operations on Object: The definition of how each monitoring and control operation acts on the object. Lots of operations have the same effect on almost every value, so some default definitions are listed here. If there's no operation specification, implementors SHOULD use the default operations defined here ๐
- BEGIN: The default is for BEGIN to be defined for dictionaries, and an error if performed on leaf objects in the tree.
- CREATE: The default is that CREATE is undefined.
- DELETE: The default is that DELETE is undefined.
- END: END is a stack operation and is defined for all objects. Note that END may fail if there is no object on the stack.
- GET-ATTRIBUTES: The default is that GET-ATTRIBUTES is defined on the contents of all dictionaries specified in this memo. The text description attributes are OPTIONAL for values defined in this memo, but REQUIRED for implementation-specific objects. Any descriptions of objects listed in this memo SHOULD cite this memo. GET-ATTRIBUTES MUST be supported on all entity-specific values. GET-ATTRIBUTES returns an Attributes object, which is defined in the well-known types section below.
- GET-ATTRIBUTES-MATCH: The default is that GET-ATTRIBUTES-MATCH is optionally defined on any object which supports GET-MATCH, and is an error otherwise. The rules for attributes returned by GET-ATTRIBUTES-MATCH are the same as those for GET-ATTRIBUTES.
- GET: The default definition of GET is to emit the operand specified if it is a leaf object, and if the operand is a dictionary, to recursively GET the entire dictionary and its subdictionaries.
- GET-MATCH: Unless otherwise specified, GET-MATCH is not supported on an object.
- GET-RANGE: Unless otherwise specified, GET-RANGE is not supported on an object.
- SET: Unless otherwise specified, SET is not supported on an object.
- SET-MATCH: Unless otherwise specified, SET-MATCH is not supported on an object.
ATTRIBUTES โจ
HEMS requires that remote applications be able to discover the meaning of an object by querying the entity in which the object is stored ๐ฆ They do this with the GET-ATTRIBUTES operator, which makes an Attributes object get returned to the application. The Attributes object is described below ๐
Attributes ::= [APPLICATION 2] IMPLICIT SEQUENCE {
tagASN1 [0] IMPLICIT INTEGER,
valueFormat [1] IMPLICIT INTEGER,
longDesc [2] IMPLICIT IA5String OPTIONAL,
shortDesc [3] IMPLICIT IA5String OPTIONAL,
unitsDesc [4] IMPLICIT IA5String OPTIONAL,
precision [5] IMPLICIT INTEGER OPTIONAL,
properties [6] IMPLICIT BITSTRING OPTIONAL,
}
Here's what each attribute means ๐
- tagASN1: The ASN.1 tag for this object. This attribute is REQUIRED.
- valueFormat: The underlying ASN.1 type of the object (e.g., SEQUENCE, or OCTETSTRING). This attribute is REQUIRED.
- longDesc: A potentially lengthy text description which fully defines the object. This attribute is OPTIONAL for objects defined in this memo and REQUIRED for entity-specific objects.
- shortDesc: A short mnemonic string of less than 15 octets which is suitable for labelling the value on a display. This attribute is OPTIONAL.
- unitsDesc: A short string used for integer values to indicate the units in which the value is measured (e.g. "ms", "sec", "packets", etc). This attribute is OPTIONAL.
- precision: For Counter objects, the value at which the Counter will roll-over. REQUIRED for all Counter objects.
- properties: A bitstring of boolean properties of the object. If the bit is on, it has the given property. This attribute is OPTIONAL. The bits currently defined are:
0 -- If true, the difference between two values
of this object is significant. For example,
the changes in a packet count is always
significant, it always conveys information.
In this case, the 0 bit would be set. On the
other hand, the difference between two readings
of a queue length may be meaningless.
IMPLEMENTATION SPECIFIC TYPES ๐ง
Every vendor or implementation specific value MUST be contained within a VendorSpecific object ๐ The format of the VendorSpecific object is shown below.
Type: VendorSpecific
VendorSpecific ::= [APPLICATION 3] IMPLICIT SET of ANY
If you want the full story on why this type exists, check out RFC 1023 ๐ซถ
WELL-KNOWN TYPES โจ
okay so there are some generally useful types that are defined across the whole system, and they're considered well-known ๐ธ they back up abstract ideas that keep showing up in other definitions, so they're basically the foundation ๐ซถ
TYPE: Error
Error ::= [APPLICATION 0] IMPLICIT SEQUENCE {
errorCode INTEGER,
errorOffset INTEGER
errorDescription IA5String,
}
the Error type gets sent back inside reply messages whenever an error is countered ๐ญ errorCode is a number that tells you the general class of error, and errorOffset is the octet in the query where the error was discovered. the query starts at the first octet (octet 0) of the HEMP data section, so count from there ๐ง errorDescription is a text message explaining what went wrong. ngl this is basically the same as the HEMP protocol error structure, except for where the offset starts. the error codes were picked so the code spaces stay distinct, which makes error messages way easier to process ๐ the defined errorCodes are:
100 -- Any error not listed below.
101 -- System error. The query processor has failed
in some way.
102 -- Format error. An error has been detected in
the input stream.
103 -- Stack error. A stack overflow or underflow has
occurred.
104 -- Instruction error. The instruction is either
unknown, or not supported on the object to which
it has been applied.
105 -- Operand error. The wrong number of operands or
inappropriate operands have been given to an
instruction.
TYPE: Counter
Counter ::= [APPLICATION 4] IMPLICIT INTEGER
the Counter type is an unsigned integer that rolls over to 0 once it's incremented past a certain value ๐ฆ (you can find the roll-over point by looking at the attributes for that particular counter.) counter sizes should be chosen so the counters won't roll over more than once every 24 hours โฐ that's the vibe, bestie.
TYPE: InstructionGroup
InstructionGroup ::= [APPLICATION 5] IMPLICIT SEQUENCE
of ANY
an InstructionGroup is an encapsulated sequence of operands and operations ๐ it lets applications encode queries as objects. literally so cool.
TYPE: Histogram
Histogram ::= SET of HistEntry
HistEntry ::= SEQUENCE {
histValue INTEGER,
histCount Counter
}
a Histogram links a count (histCount) to a numeric value (histValue) ๐ this definition doesn't put any meaning on the count or the value. each HistEntry can be a simple map (like histCount instances of histValue), or something more complex, like a count of all values between this histValue and the next lowest histValue in the Histogram ๐ the meaning of the particular Histogram is given in the object definition, so check there!
TYPE: TrafficMatrix
TrafficMatrix ::= SET of TrafficEntry
TrafficEntry ::= SEQUENCE {
src IpAddress,
dst IpAddress,
count Counter
}
a TrafficMatrix measures traffic observed between two IP addresses ๐ typically it's used to count packets flowing through a gateway. main character energy for gateways, honestly ๐
TYPE: IpAddress
IpAddress ::= OCTETSTRING
this is the 4 octet IP address. if the string is less than 4 octets long, the missing octets are wildcarded ๐ a zero length string is a default address (for example, for indicating default routes). iconic ๐
TYPE: Fraction
Fraction ::= INTEGER
a Fraction is an integer way of representing a fractional value ๐ซง it holds the numerator of a value expressed over 256. so if you divide the Fraction by 256, you get the fractional value. the math is giving clean ๐งฎ
TYPE: BootClock
BootClock ::= INTEGER
the time in milliseconds since the machine was last booted or reset โณ this value is always defined. no excuses ๐
TYPE: localClock
LocalClock ::= INTEGER
the local system clock, measured in milliseconds since 00:00 1 January 1900 UTC ๐ฐ๏ธ it's assumed to be only a local estimate of the time, so don't treat it like gospel. the value 0 is reserved for an uninitialized clock (for example, an uninitialized time-of-day chip) ๐
TYPE: NetClock
NetClock ::= INTEGER
a network synchronized clock, which is assumed to be synchronized across some part of a network ๐ the clock value is measured in milliseconds since 00:00 1 January 1900 UTC. specific info about the synchronization protocol is in the system variable dictionary. the value 0 is used to indicate an uninitialized clock ๐ซถ
TYPE: TimeStamp
TimeStamp ::= CHOICE {
[0] BootClock
[1] localClock
[2] NetClock
}
a TimeStamp can be taken from the boot clock, the system clock, or the synchronized clock โญ in general, a time of day is preferred over time since boot, and a synchronized clock is preferred over an unsynchronized one. it's way more useful to know an event happened at a particular time than that it happened so many milliseconds after the machine booted ๐ฅน
OBJECT DEFINITIONS ๐
The Root Dictionary
okay so in HEMS, all data is stored in dictionaries ๐๏ธ a dictionary is basically a conceptual grouping of values. the top-level one is the root dictionary. the form of the root dictionary for is shown below.
RootDictionary ::= [APPLICATION 32] IMPLICIT SET {
SystemVariables,
EventControls OPTIONAL,
Interfaces,
IpNetworkLayer,
IpRoutingTable,
IpTransportLayer,
IpApplications OPTIONAL
}
the root dictionary is split into seven general dictionaries ๐ธ
SystemVariablesstores general system values like the system clock, machine memory, and system up/down status โฐEventControlsstores all the objects needed to observe and control the event generating mechanism in entities that support events ๐interfacesholds all the info on all the network interfaces and the IP to physical address maps (ARP tables, X.25 Standard mappings, etc) ๐IpNetworkLayerhas info about how the IP layer works. that includes stuff like routing tables, general packet counts, and host-traffic matrices ๐ฆIpRoutingTablehas info on how the machine routes packets. it turned out to be more useful to segregate routing info than to keep it stored with the network layer data ๐ฃ๏ธIpTransportLayerstores info on the transport protocols the entity supports ๐IpApplicationsmay store info about various internet applications, like the domain system. this section is not required of HEMS entities ๐ง
the next several sections define the values stored in the five dictionaries ๐
The SystemVariables Dictionary ๐
okay so the SystemVariables dictionary is the grab bag ๐งบ for stuff that isn't tied to any one protocol, network, or app. Think machine load, clocks, and processor status. Here's the shape of it:
SystemVariables ::= [APPLICATION 33] IMPLICIT SET {
referenceClock [0] IMPLICIT TimeStamp,
netClockInfo [1] IMPLICIT SET OPTIONAL,
processorLoad [2] IMPLICIT INTEGER,
entityState [3] IMPLICIT INTEGER,
kernelMemory [4] IMPLICIT OCTETSTRING OPTIONAL,
pktBuffers [5] IMPLICIT INTEGER OPTIONAL,
pktOctets [6] IMPLICIT INTEGER OPTIONAL,
pktBuffersFree [7] IMPLICIT INTEGER OPTIONAL,
pktOctetsFree [8] IMPLICIT INTEGER OPTIONAL
systemID [9] IMPLICIT IA5STRING,
}
OBJECT: SystemVariables Type: SET Definition: see above
The objects in the dictionary are defined below. ๐ธ
OBJECT: referenceClock ๐ฐ๏ธ
Type: TimeStamp
Definition: This is the system clock used to stamp information with times. Using a NetClock is encouraged. โจ
Operations on Object: Defaults.
Notes: Adjusting clocks across networks is best handled by a proper time synchronization protocol, not by using SET. ๐ โโ๏ธ
OBJECT: netClockInfo ๐งพ
Type: SET
Definition: Detailed info about the referenceClock, but only if the referenceClock is a NetClock. The format is shown below.
netClockInfo ::= [1] IMPLICIT SET {
estError INTEGER,
refClockType INTEGER {
unspecified(0), primary-reference(1),
ntp-secondary-reference(2), secondary-reference(3),
wristwatch(4)
}
}
So estError is the estimated error, measured in milliseconds. โฑ๏ธ refClockType says what kind of reference clock was consulted for network time. The values come straight from the Network Time Protocol specification, RFC-958. ๐ง
Object Status: Required if the referenceClock is a NetClock. ๐
OBJECT: processorLoad ๐ฅ
Type: Fraction
Definition: This is a Fraction showing how busy the entity's processing is right now. A value of 256 (which is 1.0) means running at capacity. ngl this is an imprecise definition, because capacity can be measured a bunch of different ways. A multiprocessor might have loads of room even when one processor is maxed out. Or it might be "at capacity" just because that one processor is the master and handles all the context switching. ๐ The goal is that remote apps can get a vibe check on the entity's current workload. โจ
The time scale should be small. A load measure averaged over the past 10 seconds is fine, but one averaged over the past 10 minutes is not. Implementors should choose some mapping between system load and this scale so that 256 means a machine under severe strain. ๐ต (This also means values above 256 might show up in rare cases.)
OBJECT: entityState ๐
Type: INTEGER
Definition: This object tells you the system state. There are several defined values. Some are read-only, meaning you can only read them from the object. Others are write-only and will never be read back from the object. Over values are write-only and will never be read from the object. Over values are write-only and will never be read from the object.The values are:
The read-only values are:
(0)-- reserved.(1)-- running. The entity is up and running. ๐ข(2)-- testing. The entity is running some sort of diagnostics which may affect its network operation. ๐งช
The write-only values are:
(0)-- reserved.(1)-- reset the entity. ๐(2)-- reboot the entity. This value is assumed to cause a more aggressive recycling of the system than reset, though this need not be the case. ๐ฅ(3)-- halt the entity. This value stops the entity. It is assumed to prevent the entity from operating until it is manually restarted. (I.e. the halt takes the machine off the network.) ๐
Note: Being able to change an entity's state requires very strong access controls. ๐จ๐
Operations on Object: The defaults except as noted below.
- SET: Optionally writes the value into the object. The message requesting the SET must be authenticated. ๐ชช
- SET-MATCH: Optionally writes the value into the object if the current value is matched. ๐ฏ
OBJECT: kernelMemory ๐ง
Type: OCTETSTRING
Definition: A sequence of octets that represents the image of the kernel software running on the entity. This exists so you can do remote network debugging. ๐
By kernel software, we mean the software that controls operations and access to the hardware. The kernel is expected to contain all network software up through the IP layer. ๐งฑ
Implementations that use lightweight processes or segmented images should consider providing some way to map their internal representation into a single contiguous stream of octets. ๐งฉ
Note: Access control is required to read this object. ๐๐
Object Status: Useful. ๐
Operations on Object: The defaults except as noted below.
- GET-RANGE: Emits the section of memory specified.
- GET: Emits all of memory, but note that a GET on the system dictionary should not emit this object. ๐ซ
OBJECT: pktBuffers ๐ฆ
Type: INTEGER
Definition: The total number of packet buffers in the entity. ๐งบ
Object Status: Required if the entity has a maximum number of buffers. Note that most entities do have a limit (even if it's for practical purposes, near infinite) and should return that limit. โพ๏ธ
OBJECT: pktOctets ๐ข
Type: INTEGER
Definition: The maximum number of octets that can be buffered in the entity at any one time. ๐
Object Status: Required if the entity has a maximum number of octets it can buffer. Note that most entities do have a limit and should return that limit. ๐งฎ
OBJECT: pktBuffersFree ๐
Type: INTEGER
Definition: The number of packet buffers currently available. Subtracting pktBuffersFree from pktBuffers should give the number of buffers in use. โ
Object Status: Required if there is a limit on the number of buffers. ๐ง
OBJECT: pktOctetsFree ๐ซง
Type: INTEGER
Definition: The number of octets currently available, including those not used in allocated buffers. Subtracting this value from pktOctets should give the number of octets in use. ๐ง
This object can be used to track how well the entity buffers its data. ๐ต๏ธโโ๏ธ
Object Status: Required if there is a limit on the number of octets that can be buffered. ๐ง
OBJECT: systemID ๐ท๏ธ
Type: IA5STRING
Definition: The text identification of the entity. This value should include the full name of the vendor, the type of system, and the version number of the hardware and software running on the entity. ๐ชชโจ
The EventControls Dictionary ๐ฆ
The EventControls dictionary holds objects for controlling and monitoring how event messages get delivered to operations centers. ๐ฌ Here's the format:
EventControls ::= [APPLICATION 34] IMPLICIT SET OPTIONAL {
lastEvent [0] IMPLICIT OCTETSTRING OPTIONAL,
eventMessageID [1] IMPLICIT Counter,
eventCenters [2] IMPLICIT SET of IpAddress,
eventList [3] IMPLICIT SET of eventEntry,
}
OBJECT: eventControls ๐๏ธ
Type: SET
Definition: See above.
Object Status: This object will be required in entities that support events, once the event definitions have been properly specified. See the discussion of the event formats at the end of this memo. ๐
A description of the fields in this dictionary is given below. ๐
OBJECT: lastEvent โฎ๏ธ
Type: OCTETSTRING
Definition: The last event message sent. ๐
Object Status: Implementing this object is encouraged if the transport protocol used for events is unreliable (e.g., UDP). ๐ช๏ธ
OBJECT: eventMessageID ๐
Type: Counter
Definition: The HEMP MessageId to be used in the next event message. This equals the number of events sent. ๐ข
OBJECT: eventCenters ๐
Type: SET of IpAddress
Definition: The list of IP addresses that events get sent to. This list receives all events. For more selective monitoring, centers should list themselves under the particular events they're interested in. ๐ฏ
Note: If the SET operator is defined, then some form of access control is recommended. ๐
Operations on Object: The defaults except as listed below.
- CREATE: Adds an address to the list. The new address may not be a broadcast address (it may be a multicast address). ๐ฃ
- DELETE: Deletes an address from the list. ๐๏ธ
- SET-MATCH: Defined on the IP address. Replaces the address with a new value. ๐
- EMIT-MATCH: Defined on the IP address. ๐ค
OBJECT: eventList ๐
Type: SET of eventEntry
Definition: An array of entries containing objects that let management centers control how and when events are sent. (The contents of the eventEntry structure are explained below.) ๐งฉ
The eventControls Dictionary: eventList/eventEntry โจ
Okay so the eventEntry is basically the control panel for each event ๐๏ธ It gives you the control objects that decide how a particular event gets sent. Here's the format:
eventEntry ::= [0] IMPLICIT SET {
eventID [0] IMPLICIT INTEGER,
eventMode [1] IMPLICIT INTEGER,
eventCount [2] IMPLICIT Counter,
threshold [3] IMPLICIT Counter,
thresholdIncr [4] IMPLICIT INTEGER,
eventExecution [5] IMPLICIT InstructionGroup OPTIONAL,
eventCenters [6] IMPLICIT SET of IpAddress
}
eventEntry ๐
Type: SET
Definition: See Above.
eventID ๐ฆ
Type: INTEGER
Definition: The particular event ID.
eventMode ๐ธ
Type: INTEGER
Definition: This is the control object that decides how and whether this event is sent. The three modes are:
0 -- unused.
1 -- off. The event is not sent.
2 -- on. The event is sent every time it occurs.
3 -- threshold. The event is sent every time the
event count reaches the threshold.
eventCount ๐ข
Type: Counter
Definition: The number of times this event has occurred.
threshold ๐ฏ
Type: Counter
Definition: The event threshold. If the eventMode is "threshold", then an event is sent every time the eventCount equals this value.
Operations on Object: The defaults, except as noted below.
SET: Changes the threshold.
thresholdIncr ๐
Type: INTEGER
Definition: The threshold increment. Every time an event threshold is reached, the threshold value is incremented by this value (modulo the precision of the Counter) to find the new threshold.
Operations on Object: The defaults, except as noted below.
SET: Changes the increment.
eventExecution ๐ง
Type: InstructionGroup
Definition: A query to be executed whenever the event is actually sent. Any data retrieved by this query is appended to the event message.
Object Status: Encouraged.
Operations on Object: The defaults, except as noted below.
SET: Changes the buffer.
eventCenters ๐
Type: SET
Definition: The IP addresses of the monitoring centers that want to listen to this particular event. Note that events should be sent to both these centers and the global list of event centers.
Operations on Object: The defaults, except as noted below.
CREATE: Adds an address to the list of centers.DELETE: Deletes an address from the list.SET-MATCH: Defined on the IP address. Replaces the entry with a new value.EMIT-MATCH: Defined on the IP address.
The Interfaces Dictionary ๐
Okay, the Interfaces dictionary is a list of per-interface objects. One of the big goals of HEMS is to use generic interfaces across differing hardware, so every hardware interface gets described by the same data structure: the InterfaceData. ๐ซถ
Interfaces ::= [APPLICATION 35] IMPLICIT SET OF InterfaceData
Interfaces โจ
Type: SET
Definition: See above.
The Interfaces Dictionary: The InterfaceData structure ๐
The InterfaceData structure holds all the information on one particular interface. Here's the shape of it:
InterfaceData ::= [0] IMPLICIT SET {
addresses [0] IMPLICIT SET of IpAddress,
mtu [1] IMPLICIT INTEGER,
netMask [2] IMPLICIT IpAddress,
pktsIn [3] IMPLICIT Counter,
pktsOut [4] IMPLICIT Counter,
inputPktsDropped [5] IMPLICIT Counter,
outputPktsDropped [6] IMPLICIT Counter,
bcastPktsIn [7] IMPLICIT Counter OPTIONAL,
bcastPktsOut [8] IMPLICIT Counter OPTIONAL,
mcastPktsIn [9] IMPLICIT Counter OPTIONAL,
mcastPktsOut [10] IMPLICIT Counter OPTIONAL,
inputErrors [11] IMPLICIT Counter,
outputErrors [12] IMPLICIT Counter,
outputQLen [13] IMPLICIT INTEGER,
name [14] IMPLICIT IA5String,
status [15] IMPLICIT INTEGER,
ifType [16] IMPLICIT INTEGER,
mediaErrors [17] IMPLICIT Counter OPTIONAL,
upTime [18] IMPLICIT TimeStamp,
broadcast [19] IMPLICIT BITSTRING
multicast [20] IMPLICIT SET of BITSTRING,
addressList [21] IMPLICIT SET OPTIONAL,
}
InterfaceData ๐
Type: SET
Definition: See above.
Operations on Object: The defaults, except as noted below.
SET-MATCH: This operation is optionally defined on the address field of the structure. Only certain fields in this structure may be changed. The fields that may be SET are indicated in the descriptions below.GET-MATCH: Defined to emit information on the interface that matches the address given.
The fields in the structure are defined below. ๐
addresses ๐
Type: SET of IpAddress
Definition: The IP addresses that the interface accepts. Note that additional information on multicast addresses may be found in the IgmpValues dictionary.
mtu ๐ฆ
Type: INTEGER
Definition: The maximum transmission unit of the device.
netMask ๐ญ
Type: IpAddress
Definition: The subnet mask, which is an address with all the network bits set to 1 and all the hosts bits set to 0. Used to identify subnets.
pktsIn ๐ฅ
Type: Counter
Definition: The total number of packets received on this interface, including those in error.
pktsOut ๐ค
Type: Counter
Definition: The total number of packets that higher levels have attempted to send, including those that were not sent.
inputPktsDropped ๐ซ
Type: Counter
Definition: The number of good inbound packets dropped (presumably to free up buffer space).
outputPktsDropped ๐ซ
Type: Counter
Definition: The number of good outbound packets dropped (presumably to free up buffer space).
bcastPktsIn ๐ก
Type: Counter
Definition: The number of broadcast packets received, including those in error.
Object Status: Encouraged on interfaces that support broadcast.
bcastPktsOut ๐ก
Type: Counter
Definition: The number of broadcast packets that higher levels attempted to send, including those that were not sent.
Object Status: Encouraged on interfaces that support broadcast.
mcastPktsIn ๐ถ
Type: Counter
Definition: The number of multicast packets received, including those in error.
Object Status: Encouraged on interfaces that support multicast.
mcastPktsOut ๐ถ
Type: Counter
Definition: The number of multicast packets sent, including those that were not sent.
Object Status: Encouraged on interfaces that support multicast.
inputErrors ๐จ
Type: Counter
Definition: The number of inbound packets that could not be delivered. The number of inbound packets delivered should equal inputPkts less this value and inputPktsDropped.
outputErrors ๐จ
Type: Counter
Definition: The number of outbound packets that could not be transmitted because of errors. The number of outbound packets placed on the network should equal outputPkts less this value and outputPktsDropped.
outputQLen ๐ชฃ
Type: INTEGER
Definition: The length of the output packet queue (in packets).
name ๐ท๏ธ
Type: IA5String
Definition: A text string that completely identifies the interface. This string should include the name of the manufacturer, the product name, and the version of the hardware.
status ๐ฆ
Type: INTEGER
Definition: The status of the object. The status values are:
0 -- reserved
1 -- testing (the interface is in some test mode)
2 -- down (the interface is down)
3 -- up (the interface is up ready to pass packets)
Note: If set operations are defined, access control is required.
Operations on Object: The defaults, except as noted below.
SET: Optionally defined to change the state of the interface.
ifType ๐
Type: INTEGER
Definition: A flag that indicates the type of interface in use. The currently defined types are:
0 -- reserved
1 -- 1822 HDH
2 -- 1822
3 -- FDDI
4 -- DDN X.25
5 -- RFC-877 X.25
6 -- StarLan
7 -- Proteon 10Mbit
8 -- Proteon 80Mbit
9 -- Ethernet
10 -- 802.3 Ethernet
11 -- 802.4 Token Bus
12 -- 802.5 Token Ring
13 -- Point-to-Point Serial
mediaErrors ๐ง๏ธ
Type: Counter
Definition: A counter of media errors, such as collisions on Ethernets, token regeneration on token-passing rings, or lost RFNMs on PSNs.
Object Status: Encouraged for interfaces to media that have such errors.
upTime โฐ
Type: TimeStamp
Definition: When the interface was put in its current state.
broadcast ๐ฃ
Type: BITSTRING
Definition: Whether this interface has a physical broadcast address.
Object Status: Required if the interface has a broadcast address.
multicast ๐ง
Type: SET of BITSTRING
Definition: The set of hardware multicast addresses currently enabled on the device.
Object Status: Encouraged in interfaces that support multicast.
addressList ๐บ๏ธ
Definition: SET of addressMap
addressMap ::= [0] IMPLICIT SET {
ipAddr [0] IMPLICIT IpAddress
physAddr [1] IMPLICIT BITSTRING
}
Definition: Most interfaces maintain tables that map physical network addresses to IP addresses. An example is an ARP table. This table stores that map as a series of entries, each of which maps IP addresses to the physical address. ๐งญ
Object Status: Required if the interface has to map IP addresses to physical addresses.
The IpNetworkLayer Dictionary ๐
okay bestie, this one is the IP Layer dictionary and it holds all the info about the IP layer ๐ here's the format:
IpNetworkLayer ::= [APPLICATION 36] IMPLICIT SET {
gateway [0] IMPLICIT BOOLEAN,
inputPkts [1] IMPLICIT Counter,
inputErrors [2] IMPLICIT Counter,
inputPktsDropped [3] IMPLICIT Counter,
inputQLen [4] IMPLICIT INTEGER OPTIONAL,
outputPkts [5] IMPLICIT Counter,
outputErrors [6] IMPLICIT Counter,
outputPktsDropped [7] IMPLICIT Counter,
outputQLen [8] IMPLICIT INTEGER OPTIONAL,
ipID [9] IMPLICIT Counter,
fragCreated [10] IMPLICIT Counter OPTIONAL,
fragRcvd [11] IMPLICIT Counter OPTIONAL,
fragDropped [12] IMPLICIT Counter OPTIONAL,
pktsReassembled [13] IMPLICIT Counter OPTIONAL,
pktsFragmented [14] IMPLICIT Counter OPTIONAL,
htm [15] IMPLICIT TrafficMatrix OPTIONAL,
itm [16] IMPLICIT TrafficMatrix OPTIONAL
}
OBJECT: IpNetworkLayer โจ
Type: SET
Definition: see above.
The fields of the dictionary are defined below ๐
gateway
Type: BOOLEAN
Definition: this is true if the entity gateways packets ๐ช
inputPkts
Type: Counter
Definition: the total number of input packets received, including the ones that came in with errors ๐ฅ
inputErrors
Type: Counter
Definition: the number of input packets thrown out because of errors (unknown protocols, format errors, etc) ๐
inputPktsDropped
Type: Counter
Definition: the number of input packets dropped because there wasn't enough buffer space ๐ญ
inputQLen
Type: INTEGER
Definition: the number of inbound packets currently waiting to be processed by the IP layer โณ
Object Status: Encouraged.
outputPkts
Type: Counter
Definition: the total number of outbound packets, counting both the ones higher layers handed to the IP layer and the packets that get gatewayed ๐ฆ
outputErrors
Type: Counter
Definition: the number of output packets discarded because of errors (unable to route, format errors, etc) ๐
outputPktsDropped
Type: Counter
Definition: the number of output packets dropped for lack of buffer space ๐ซ
outputQLen
Type: INTEGER
Definition: the number of outbound packets waiting to be processed by the IP layer ๐ฆ
Object Status: Encouraged.
ipID
Type: Counter
Definition: the next IP packet ID identifier to be used ๐. note that in some implementations the transport layer may set the IP identifier. if that happens, this value is used only when the transport layer hasn't set the IP identifier.
fragCreated
Type: Counter
Definition: the number of IP fragments created at this entity. for example, if an IP datagram gets split into three fragments here, this counter goes up by three โ๏ธ
Object Status: Encouraged.
fragRcvd
Type: Counter
Definition: the number of IP fragments received at this entity ๐ฉ
Object Status: Encouraged.
fragDropped
Type: Counter
Definition: the number of IP fragments discarded at this entity for whatever reason (timed out, errors, etc) ๐๏ธ
Object Status: Encouraged.
pktsReassembled
Type: Counter
Definition: the number of IP datagrams that have been reassembled at this entity ๐งฉ
Object Status: Encouraged
pktsFragmented
Type: Counter
Definition: the number of IP datagrams that have been fragmented at this entity ๐ฐ
Object Status: Encouraged.
htm
Type: TrafficMatrix
Definition: a host traffic matrix, mapping all traffic switched between any pair of sources and destinations. the count in each trafficEntry routeDst is expressed in packets. source routed IP packets should be logged as being between their source and the destination (i.e., they should not be treated as destined for this entity). ๐บ๏ธ
Notes: this info may be considered sensitive ๐
Object Status: Encouraged in gateways.
itm
Type: TrafficMatrix
Definition: an interface traffic matrix showing traffic switched between interfaces in an entity. the source and destinations fields are the IP addresses of the interfaces between which the packet was switched. the count in each trafficEntry is expressed in packets. ๐
Object Status: Useful.
The IpRoutingTable Dictionary ๐ฃ๏ธ
the IpRoutingTable dictionary holds all the routing info ๐บ๏ธ quick note: info about any routing protocols used to maintain the routing table lives under the entry for that routing protocol. here's the format:
IpRoutingTable ::= [APPLICATION 37] IMPLICIT SET {
routingProtocols [0] IMPLICIT OCTETSTRING,
coreRouter [1] IMPLICIT BOOLEAN,
autoSys [2] IMPLICIT INTEGER,
metricUsed [3] IMPLICIT OCTET,
[4] RoutingEntries,
}
OBJECT: IpRoutingTable โจ
Type: SET
Definition: see above.
the objects inside this dictionary are described below ๐
routingProtocols
Type: OCTETSTRING
Definition: a sparse list of the routing protocols used to update the routing table (e.g., EGP and ICMP). each octet contains one of the following values:
0 -- anything not specified below.
1 -- local (non-protocol) information. (E.g.
routing tables can be changed by hand).
2 -- HEMS (was changed/set by a HEMS operation)
3 -- Internet Control Message Protocols, (i.e.
ICMP redirects).
4 -- Exterior Gateway Protocol (EGP).
5 -- Gateway-to-Gateway Protocol (GGP).
6 -- Dissimilar Gateway Protocol (DGP).
7 -- HELO
8 -- RIP
9 -- Proprietary IGP
coreRouter
Type: BOOLEAN
Definition: this is set to true if this entity is a reference router for any other router (i.e., if it distributes any of its routes to other machines) ๐ก
autoSys
Type: INTEGER
Definition: the autonomous system number of the autonomous system this entity lives in ๐
metricUsed
Type: OCTET
Definition: classifies the routing metric used in the routing table entries. the value should be picked from the list of values for routingProtocols above, and it indicates which metric definition is used (e.g., this entity uses an EGP metric internally) ๐
RoutingEntries
Type: SET of RoutingEntry
Definition: the set of all routing entries. the RoutingEntry is defined below ๐
The IpRoutingTable Dictionary: The RoutingEntry ๐งญ
the RoutingEntry holds all the info on one particular route ๐ค๏ธ here's the structure:
RoutingEntry ::= [0] IMPLICIT SET {
routeMetric [0] IMPLICIT INTEGER,
routeDst [1] IMPLICIT IpAddress,
nextHop [2] IMPLICIT IpAddress,
routeAuthor [3] IMPLICIT IpAddress OPTIONAL,
routeproto [4] IMPLICIT Octet OPTIONAL,
routeTime [5] TimeStamp,
routeTOS [6] IMPLICIT INTEGER OPTIONAL,
valid [7] IMPLICIT BOOLEAN
}
OBJECT: RoutingEntry
Type: SET
Definition: see above.
Operations on Object: defaults, except as specified below ๐
- CREATE: adds a new routing entry. it should be confirmed that the entry is new ๐
- DELETE: deletes a routing entry ๐๏ธ
- GET-MATCH: the match operator is defined on the
routeDstfield. a match on anIpAddressis defined as a search to find the route or routes that would be used to reach thatIpAddress. more than one route may apply, in which case all possible routes should be returned ๐ - SET-MATCH: is optionally defined on the object. a SET on an entire
RoutingEntryreplaces the whole entry with a new value. certain fields (indicated below) can also be changed using a SET-MATCH.
The match operator is defined on the routeDst and routeTOS fields. to SET a value, the match must be exact on the IP address (this is different from the search definition for GET-MATCH).
Note that support of the operator on an entity which uses a dynamic routing protocol such as GGP or EGP will require close coordination with the routing protocol to keep the data consistent. (Arguably, this facility should not be supported on such machines.) โ ๏ธ
the definitions of the fields in the RoutingEntry are given below ๐
routeMetric
Type: INTEGER
Definition: the routing metric on this route. the type of metric is defined in the metricUsed field of the IpRoutingTable dictionary ๐
routeDst
Type: IpAddress
Definition: the final destination that can be reached via this route ๐ฏ
nextHop
Type: IpAddress
Definition: the next hop on the way to the final destination ๐ฃ
routeAuthor
Type: IpAddress
Definition: the IP address of the entity from which this route was first received. that is, the first entity which stated that the destination was reachable via nextHop. the default IpAddress should be used to indicate routes which originated on the entity itself โ๏ธ
Object Status: Encouraged.
routeProto
Type: Octet
Definition: the routing protocol this route was learned from. the value is taken from the list of values for routingProtocols above ๐
Object Status: Encouraged.
routeTime
Type: TimeStamp
Definition: when this route was first received โฐ
Object Status: Encouraged.
routeTOS
Type: INTEGER
Definition: the IP Type of Service this routing entry serves ๐ฆ
Object Status: Required if type of service routing is supported.
valid
Type: BOOLEAN
Definition: whether the route is active. (some machines keep routes that are no longer valid, for various reasons ๐)
The IpTransportLayer Dictionary ๐
okay so the IpTransportLayer Dictionary is where we keep all the info about transport protocols that run on top of IP ๐ For easy lookup, the ASN.1 tag of each transport protocol's dictionary is the same as its assigned IP Protocol number ๐ฆ Heads up that a lot of protocols don't have their dictionaries defined yet ๐
IpTransportLayer ::= [APPLICATION 38] IMPLICIT SET {
[0] IMPLICIT ProtocolsSupported,
[1] IMPLICIT IcmpValues,
[2] IMPLICIT IgmpValues OPTIONAL,
[3] IMPLICIT GgpValues OPTIONAL,
[7] IMPLICIT TcpValues OPTIONAL,
[8] IMPLICIT EgpValues OPTIONAL,
[17] IMPLICIT UdpValues OPTIONAL,
[20] IMPLICIT HmpValues OPTIONAL,
[27] IMPLICIT RdpValues OPTIONAL,
[30] IMPLICIT NetbltValues OPTIONAL,
}
OBJECT: IpTransportLayer ๐
Type: SET
Definition: see above โจ
The objects in this dictionary are defined below ๐ธ
The IpTransportLayer Dictionary: ProtocolsSupported ๐ง
OBJECT: protocolsSupported
Type: OCTETSTRING
Definition: This is a sparse list of the transport protocols that are supported ๐ Each octet in the OCTETSTRING holds the IP protocol number of one supported protocol. For this definition, an entity counts as supporting a protocol only if it has BOTH the software that makes it possible for the protocol to be used in communications with the entity, and it keeps the required values (if any) that this memo defines for that protocol ๐
The IpTransportLayer Dictionary: IcmpValues ๐ฆ
The IcmpValues dictionary is a subdictionary of the IpTransportLayer dictionary, and it keeps track of how the Internet Control Message Protocol is doing, which is defined in RFC-792 ๐ Here's the form it takes:
IcmpValues ::= SET {
inputPktCount [0] IMPLICIT Counter,
inputPktErrors [1] IMPLICIT Counter,
inputPktDeliver [2] IMPLICIT Counter,
inputPktTypes [3] IMPLICIT Histogram OPTIONAL,
outputPktCount [4] IMPLICIT Counter,
outputPktErrors [5] IMPLICIT Counter,
outputPktTypes [6] IMPLICIT Histogram OPTIONAL,
icmpTraffic [7] IMPLICIT TrafficMatrix OPTIONAL,
ipID [8] IMPLICIT Counter OPTIONAL
}
OBJECT: IcmpValues ๐
Type: SET
Definition: see above โจ
The objects in this dictionary are defined below ๐
OBJECT: inputPktCount ๐ฅ
Type: Counter
Definition: This is the total number of ICMP packets received, errors included ๐
OBJECT: inputPktErrors ๐
Type: Counter
Definition: This counts the ICMP packets received that turned out to have errors, like bad checksums, bad lengths, and so on. If you subtract this value from inputPktCount, you should get the number of valid ICMP packets received ๐ซถ
OBJECT: inputPktDeliver ๐ธ
Type: Counter
Definition: This is the number of valid ICMP packets that were successfully processed, for example delivered up to the higher protocol โจ
OBJECT: inputPktTypes ๐
Type: Histogram
Definition: This is a histogram of the ICMP message types and codes received, leaving out any messages that turned out to contain errors. The histogram's histValue field holds a 16-bit value, which is (ICMP type * 256) + ICMP code, and the histCount field holds how many valid messages with that type/code pair have been received ๐ฆ
The message type and code values are the ones defined in RFC-792. For example, the Time Exceeded Message with a code of "fragment reassembly time exceeded" is (11 * 256) + 1 = 2817 ๐
Object Status: Useful โจ
Operations on Object: The defaults apply, except as listed below ๐
- GET-MATCH: Matching is defined on the value of the
histValuefield ๐
OBJECT: outputPktCount ๐ง
Type: Counter
Definition: This is the total number of ICMP packets the entity tried to send. That includes the ones that failed because of things like running out of buffers, a missing route, or other temporary transmission problems ๐
OBJECT: outputPktErrors ๐
Type: Counter
Definition: This is the number of ICMP packets the entity couldn't send because of transmission problems, such as running out of buffers, a missing route, or other temporary transmission problems. This value isn't required to include errors that the ICMP layer couldn't reasonably be expected to detect, like damage to the packet while it was in transit ๐ If you subtract this value from the PktCount field, you should get the number of ICMP packets the entity believes it successfully sent ๐ซถ
OBJECT: outputPktTypes ๐ธ
Type: Histogram
Definition: This is a histogram of the ICMP message types and codes sent, including messages that later failed to be transmitted. The histogram's histValue field holds a 16-bit value, which is (ICMP type * 256) + ICMP code, and the histCount field holds how many valid messages with that type/code pair have been sent ๐
The message type and code values are the ones defined in RFC-792. For example, the Time Exceeded Message with a code of "fragment reassembly time exceeded" is (11 * 256) + 1 = 2817 โจ
Object Status: Useful ๐ฆ
Operations on Object: The defaults apply, except as listed below ๐
- GET-MATCH: Matching is defined on the value of the
histValuefield ๐
OBJECT: icmpTraffic ๐ฅ
Type: TrafficMatrix
Definition: This covers all ICMP traffic that originated on this machine. The source address in the traffic matrix should be the interface the packet was sent from. The destination is the address the packet is ultimately going to be delivered to, not an intermediate hop ๐ง
Object Status: Useful ๐
OBJECT: ipID ๐
Type: Counter
Definition: This is the next IP packet ID identifier to be used by the ICMP code ๐
Object Status: Required if the ICMP code generates its own IP identifiers ๐ธ
The IpTransportLayer Dictionary: IgmpValues ๐
IgmpValues ::= SET {
conformance [0] IMPLICIT INTEGER,
inputPktCount [1] IMPLICIT Counter,
inputPktErrors [2] IMPLICIT Counter,
inputPktTypes [3] IMPLICIT Histogram OPTIONAL,
outputPktCount [4] IMPLICIT Counter,
outputPktErrors [5] IMPLICIT Counter,
outputPktTypes [6] IMPLICIT Histogram OPTIONAL,
igmpTraffic [7] IMPLICIT TrafficMatrix OPTIONAL
igmpGroups [8] IMPLICIT SET of IgmpGroupEntry,
ipID [9] IMPLICIT Counter OPTIONAL,
}
OBJECT: IgmpValues โจ
Type: SET
Definition: This is the dictionary of info on the Internet Group Management Protocol, which is defined in RFC-988 ๐ฆ
Object Status: Required in hosts which support IGMP ๐
The objects stored in this dictionary are defined below ๐
OBJECT: conformance ๐
Type: INTEGER
Definition: This is the level of conformance with RFC-988 ๐ซถ The conformance levels are:
0-- Level 0. No support for IP multicasting ๐1-- Level 1. Support for sending but not receiving multicast datagrams ๐ธ2-- Level 2. Full support for IP multicasting ๐ฅ
These values are taken directly from RFC-988 โจ
OBJECT: inputPktCount ๐ง
Type: Counter
Definition: This is the number of IGMP packets received, including the ones that turned out to be in error ๐
OBJECT: inputPktErrors ๐
Type: Counter
Definition: This is the number of IGMP packets received that turned out to be in error. If you subtract this value from inputPktCount, you should get the number of valid IGMP packets received ๐
OBJECT: inputPktTypes ๐ฆ
Type: Histogram
Definition: This is a histogram of the IGMP message types and codes sent, including messages that later failed to be transmitted. The histogram's histValue field holds a 16-bit value, which is (IGMP type * 256) + IGMP code, and the histCount field holds how many valid messages with that type/code pair have been sent ๐
The type and code values are taken from RFC-988 โจ
OBJECT: outputPktCount ๐
Type: Counter
Definition: This is the total number of IGMP packets the entity tried to send. That includes the ones that failed because of things like running out of buffers, a missing route, or other temporary transmission problems ๐
OBJECT: outputPktErrors ๐
Type: Counter
Definition: This is the number of IGMP packets the entity couldn't send because of transmission problems, such as running out of buffers, a missing route, or other temporary transmission problems. This value isn't required to include errors that the IGMP layer couldn't reasonably be expected to detect, like damage to the packet in transit ๐ซถ If you subtract this value from the outputPktCount field, you should get the number of IGMP packets the entity believes it successfully sent ๐ธ
OBJECT: outputPktTypes ๐ฅ
Type: Histogram
Definition: This is a histogram of the IGMP message types and codes sent, including messages that later failed to be transmitted. The histogram's histValue field holds a 16-bit value, which is (IGMP type * 256) + IGMP code, and the histCount field holds how many valid messages with that type/code pair have been sent ๐ง
The type and code values are taken from RFC-988 ๐
OBJECT: igmpTraffic ๐
Type: TrafficMatrix
Definition: This covers all IGMP traffic that originated on this machine. The source address in the traffic matrix should be the interface the packet was sent from. The destination is the address the packet is ultimately going to be delivered to, not an intermediate hop ๐
Object Status: Useful ๐ฆ
OBJECT: igmpGroups ๐
Type: SET
Definition: These are the various igmpGroups this host is aware of. They're stored as a set of IgmpGroupEntry, and the format of an IgmpGroupEntry is shown below ๐
IgmpGroupEntry ::= [0] SET {
groupAddress [0] IMPLICIT IpAddress,
groupAccessKey [1] IMPLICIT OCTETSTRING,
groupAgent [2] IMPLICIT BOOLEAN,
}
The groupAddress is the multicast IP address. The groupAccessKey is the 8 octet key, and this key may be confidential, so it should only be available to authorized querying entities ๐
The groupAgent field is true if this entity is an agent for the multicast group ๐ซถ
OBJECT: ipID ๐ธ
Type: Counter
Definition: This is the next IP packet ID identifier to be used by the IGMP code ๐
Object Status: Required if the IGMP code generates its own IP identifiers โจ
The IpTransportLayer Dictionary: GgpValues ๐ง
The definition of the GgpValues dictionary is left for further study ๐
The IpTransportLayer Dictionary: TcpValues โจ
okay so the TcpValues dictionary is the subdictionary of IpTransportLayer that keeps track of how TCP is doing (that's the Transmission Control Protocol, defined in RFC-793 ๐ ). a bunch of the objects in here point back to definitions in RFC-793, so keep that in your back pocket. here's the shape:
TcpValues ::= SET {
[0] IMPLICIT TcpParam
[1] IMPLICIT TcpStats OPTIONAL,
tcpConnData [2] IMPLICIT SET of TcpConn,
}
OBJECT: TcpValues
Type: IMPLICIT SET
Definition: see above.
Object Status: Required if the entity supports TCP.
the objects inside are covered in the next few sections ๐ง
The IpTransportLayer Dictionary: TcpValues/TcpParam ๐
the TcpParam dictionary holds info about certain parameters, like the round-trip timer estimation constants, that get managed on a per-machine basis. obsessed with how it's laid out:
TcpParam ::= SET {
tcpRtoA [0] IMPLICIT IA5String,
tcpRtoParam [1] IMPLICIT SET of RtoParam,
ipID [2] IMPLICIT Counter,
tcpRtoMin [3] IMPLICIT INTEGER OPTIONAL,
tcpRtoMax [4] IMPLICIT INTEGER OPTIONAL,
tcpMaxSegSiz [5] IMPLICIT INTEGER,
tcpMaxConn [6] IMPLICIT INTEGER OPTIONAL,
tcpMaxWindow [7] IMPLICIT INTEGER OPTIONAL,
}
OBJECT: tcpParam
Type: SET
Definition: see above.
the definitions for each object in the tcpParam dictionary are below ๐
tcpRtoA ๐ฆ
Type: IA5String
Definition: this is the TCP retransmission timeout algorithm. it's written as one or more equations that generate a target value, RTO[N], which is the retransmission timeout for packet N. okay the formatting rules are a vibe:
- expressions use well-understood symbols like
*for multiplication and/for division, plus parentheses for precedence - variables start with an uppercase character
- multiple equations are separated by semicolons
- comments go in braces, like
{} - constants start with a lowercase character
on top of RTO[N], the symbol S[N] means the round-trip sample for packet N. written this way, the algorithm in RFC-793 looks like:
RTO[N] = SRTT[N] * beta ;
SRTT[N] = ( S[N-1] * alpha) + (SRTT[N-1] * (1 - alpha))
Note: the syntax probably needs refining so a program can parse and interpret it. that's left for future study ๐ฅบ
tcpRtoParam ๐ธ
Type: SET of RtoParam
Definition: the list of values for the constants the retransmission timeout algorithm uses. the RtoParam structure looks like this:
RtoParam ::= SEQUENCE {
name IA5String,
value Fraction
}
the name is the name of the constant as it shows up in tcpRtoA, like "beta".
ipID ๐
Type: Counter
Definition: the next IP packet ID identifier that the TCP code is going to use.
Object Status: Required if the TCP code generates its own IP identifiers.
tcpRtoMin โจ
Type: INTEGER
Definition: the minimum value the TCP implementation allows for the retransmission timeout (RTO), in milliseconds.
Note: if the SET operation is optionally defined, access control must be exercised ๐
Object Status: Required if the implementation uses the suggested algorithm in RFC-793, or if it sets any limits on the minimum RTO.
Operations on Object: the defaults, except as listed below:
- SET: optionally defined to change the value. implementations should confirm that the new value is less than
tcpRtoMax.
tcpRtoMax ๐
Type: INTEGER
Definition: the maximum value the TCP implementation allows for the retransmission timeout (RTO), in milliseconds.
Note: if the SET operation is optionally defined, access control must be exercised ๐
Object Status: Required if the implementation uses the suggested algorithm in RFC-793, or if it sets any limits on the maximum RTO.
Operations on Object: the defaults, except as listed below:
- SET: optionally defined to change the value. implementations should confirm that the new value is greater than
tcpRtoMax, and that the value is large (i.e., several seconds).
tcpMaxSegSiz ๐
Type: INTEGER
Definition: the maximum segment size this implementation uses.
Object Status: Required if the entity sets an upper limit on the MTU. (some implementations have no constraints, but choose an MTU based on external constraints, like the maximum MTU of the network interface in use.)
tcpMaxConn ๐ง
Type: INTEGER
Definition: an optional value, which must be present if the entity has a limit on the total number of TCP connections it can support.
Object Status: Required if the entity sets limits.
Note: if the SET operation is defined, access control must be exercised ๐
Operations on Object: the defaults, except as listed below:
- SET: optionally defined to change the value. if the new value is less than the number of currently open connections, implementations are not required to close existing connections, but they may not open any additional ones.
tcpMaxWindow ๐
Type: INTEGER
Definition: an optional value, which must be present if the entity places a fixed upper limit on the size of any connection's TCP window (i.e., if the maximum window size is not configurable per connection).
Object Status: Required if the entity sets limits.
Note: if the SET operation is defined, access control must be exercised ๐
Operations on Object: the defaults, except as listed below:
- SET: optionally defined to change the value. the new value must be at least the size of one maximum TCP segment.
The IpTransportLayer Dictionary: TcpValues/TcpStats ๐
the TcpStats dictionary stores general info about how the TCP layer is working. the form is:
TcpStats ::= SET {
connAttempts [0] IMPLICIT Counter OPTIONAL,
connOpened [1] IMPLICIT Counter OPTIONAL,
connAccepted [2] IMPLICIT Counter OPTIONAL,
connClosed [3] IMPLICIT Counter OPTIONAL,
connAborted [4] IMPLICIT Counter OPTIONAL,
connAbortedInfo [5] IMPLICIT Histogram OPTIONAL,
octetsIn [6] IMPLICIT Counter OPTIONAL,
octetsOut [7] IMPLICIT Counter OPTIONAL,
octetsInDup [8] IMPLICIT Counter OPTIONAL,
octetsRetrans [9] IMPLICIT Counter OPTIONAL,
inputPkts [10] IMPLICIT Counter OPTIONAL,
retransPkts [11] IMPLICIT Counter OPTIONAL,
outputPkts [12] IMPLICIT Counter OPTIONAL,
dupPkts [13] IMPLICIT Counter OPTIONAL,
}
OBJECT: TcpStats
Type: SET
Definition: see above.
Object Status: Encouraged.
the fields in the dictionary are defined below โจ
connAttempts ๐
Type: Counter
Definition: the number of connection attempts made from this host. this includes pending attempts.
Object Status: Encouraged.
connOpened ๐ฆ
Type: Counter
Definition: the number of connection attempts from this host that successfully produced an open connection. this includes currently open connections.
Object Status: Encouraged.
connAccepted ๐ซถ
Type: Counter
Definition: the number of connections accepted by listening peers on this entity. this includes currently open connections.
Object Status: Encouraged.
connClosed ๐ธ
Type: Counter
Definition: the number of connections that were properly closed.
Object Status: Encouraged.
connAborted ๐
Type: Counter
Definition: the number of connections that were aborted. if implementations trace how the connection was aborted, they're encouraged to use the connAbortedInfo histogram.
Object Status: Encouraged.
connAbortedInfo ๐ฅ
Type: Histogram
Definition: the number of connections aborted, sorted by type of abort. the histValue is one of the codes below, and the histCount is the number of connections aborted for that reason. the histValue codes are:
0 -- an abort condition not specified below
1 -- remote abort
2 -- local application abort
3 -- local protocol level abort
Object Status: Useful
octetsIn ๐
Type: Counter
Definition: the total number of TCP octets (not counting duplicates) received at this entity.
Object Status: Required if TcpStats is implemented.
octetsOut ๐
Type: Counter
Definition: the total number of TCP octets (not counting retransmissions) sent from this entity.
Object Status: Required if TcpStats is implemented.
octetsInDup ๐
Type: Counter
Definition: the total number of TCP octets received that were duplicates.
Object Status: Required if TcpStats is implemented.
octetsReTrans ๐
Type: Counter
Definition: the total number of TCP octets that have been retransmitted.
Object Status: Required if TcpStats is implemented.
inputPkts ๐ฅ
Type: Counter
Definition: the total number of valid packets received, including those on current connections.
Object Status: Useful.
retransPkts ๐
Type: Counter
Definition: the total number of packets retransmitted.
Object Status: Useful.
outputPkts ๐ค
Type: Counter
Definition: the total number of packets sent.
Object Status: Useful.
dupPkts ๐ฏ
Type: Counter
Definition: the number of packets received that contained only data already received.
Object Status: Useful.
The IpTransportLayer Dictionary: TcpValues/TcpConn โจ
okay so the tcpConnData field in the TcpValues dictionary is a set of TcpConn ๐ง, and each TcpConn holds info on one particular TCP connection. literally the little diary entry for every connection ๐ here's the shape:
TcpConn ::= SET {
localPort [0] IMPLICIT INTEGER,
localAddress [1] IMPLICIT IpAddress,
foreignPort [2] IMPLICIT INTEGER,
foreignAddress [3] IMPLICIT IpAddress,
state [4] IMPLICIT INTEGER,
snduna [5] IMPLICIT INTEGER,
sndnxt [6] IMPLICIT INTEGER,
sndwnd [7] IMPLICIT INTEGER,
congwnd [8] IMPLICIT INTEGER,
rcvnxt [9] IMPLICIT INTEGER,
rcvwnd [10] IMPLICIT INTEGER,
srtt [11] IMPLICIT INTEGER OPTIONAL,
lastrtt [12] IMPLICIT INTEGER OPTIONAL,
maxSegSize [13] IMPLICIT INTEGER,
octetsSent [14] IMPLICIT Counter OPTIONAL,
octetsRXmit [15] IMPLICIT Counter OPTIONAL,
octetsRcvd [16] IMPLICIT Counter OPTIONAL,
octetDups [17] IMPLICIT Counter OPTIONAL,
octetPastWin [18] IMPLICIT Counter OPTIONAL,
segSizes [19] IMPLICIT Histogram OPTIONAL,
}
the set of TCP connections can be searched a bunch of ways using the local and foreign addresses (port number included) ๐ but you can't grab the individual values of a connection without doing a search first. no shortcuts bestie ๐
OBJECT: TcpConn
Type: SET
Definition: the per TCP connection data ๐
Operations on Object: the defaults, except for this one:
- GET-MATCH: works on any combo of localAddress, localPort, foreignAddress and foreignPort ๐ it hands back every connection that matches the template. (ex: GET-MATCH on one particular foreignAddress gives you every connection to that address ๐ฆ)
the fields of the tcpConn structure are explained below, so let's go ๐ธ
OBJECT: localPort
Type: INTEGER
Definition: the local port number of this connection ๐
Operations on Object: defaults. MATCH operators can be applied to this object to find info on one specific TCP connection โจ
OBJECT: localAddress
Type: IpAddress
Definition: the local IP address of this connection. this can be the default IP address defined above ๐ซถ but this value might not be valid in certain states ๐
Operations on Object: defaults. MATCH operators can be applied to this object too, to locate info on one specific TCP connection ๐
OBJECT: foreignPort
Type: INTEGER
Definition: the foreign port number of this connection. it can be meaningless if the local peer is in certain states (like LISTEN) ๐
Operations on Object: defaults. MATCH operators can be applied to this object to locate info on one specific TCP connection ๐ง
OBJECT: foreignAddress
Type: IpAddress
Definition: the foreign IP address of this connection. same deal as foreignPort: it can be meaningless if the local peer is in certain states (like LISTEN) ๐
Operations on Object: defaults. MATCH operators can be applied to this object to locate info on one specific TCP connection ๐ฅ
OBJECT: state
Type: INTEGER
Definition: the current state of the local peer ๐ญ the values for the different states are: close(0), listen(1), syn-sent(2), syn-received(3), established(4), close-wait(5), fin-wait-1(6), closing(7), last-ack(8), fin-wait-2(9), time-wait(10). implementations have to map their internal state representations onto these values, so everyone's speaking the same language ๐ซถ
OBJECT: snduna
Type: INTEGER
Definition: the SND.UNA value as defined in RFC-793 ๐ธ
OBJECT: sndnxt
Type: INTEGER
Definition: the SND.NXT value as defined in RFC-793 ๐ธ
OBJECT: sndwnd
Type: INTEGER
Definition: the SND.WND value as defined in RFC-793 ๐ธ
OBJECT: congwnd
Type: INTEGER
Definition: the congestion window. this is less than or equal to sndwnd. if it's less than sndwnd, congestion control is in effect and congwnd is the reduced send window size in use ๐ฆ
OBJECT: rcvnxt
Type: INTEGER
Definition: the RCV.NXT value as defined in RFC-793 ๐ธ
OBJECT: rcvwnd
Type: INTEGER
Definition: the RCV.WND value as defined in RFC-793 ๐ธ
OBJECT: srtt
Type: INTEGER
Definition: the smoothed round-trip time in milliseconds โฑ๏ธ
Object Status: Required if the implementation maintains a smoothed round-trip time ๐ฅ
OBJECT: lastrtt
Type: INTEGER
Definition: the last round-trip time sample taken, in milliseconds โญ
Object Status: Encouraged ๐
OBJECT: maxSegSize
Type: INTEGER
Definition: the maximum segment size that can be used on this connection ๐
OBJECT: octetsSent
Type: Counter
Definition: the total number of octets transmitted since the connection was opened, not counting retransmissions. you can also think of it as the current length of the stream ๐
Object Status: Encouraged ๐
OBJECT: octetsRXmit
Type: Counter
Definition: the total number of octets retransmitted since the connection was opened. this plus octetsSent should give you the total number of octets sent ๐งฎ
Object Status: Encouraged ๐
OBJECT: octetsRcvd
Type: Counter
Definition: the number of octets received since the connection was opened, not counting duplicates received. it's the receiver's version of octetsSent ๐ฌ
Object Status: Encouraged ๐
OBJECT: octetDups
Type: Counter
Definition: the total number of octets received since the connection was opened that were redundant (aka, they'd already been received before) ๐ฏ
Object Status: Encouraged ๐
OBJECT: octetPastWin
Type: Counter
Definition: the number of segments that contained data beyond the upper edge of the receive window ๐ง
Object Status: Encouraged ๐
OBJECT: segSizes
Type: Histogram
Definition: a histogram of the sizes of the packets sent on the connection. it's useful for catching cases of silly-window syndrome ๐ต๏ธโโ๏ธ this is a range histogram, so it counts the segments whose size fell into a given range. the histValue field holds a segment size, and the histCount field holds the number of segments between this size and the next largest size ๐
Object Status: Useful ๐
The IpTransportLayer Dictionary: EgpValues โจ
the EgpValues dictionary keeps info on how the Exterior Gateway Protocol is doing, which is defined in RFC-904 ๐ here's the format:
EgpValues ::= SET {
egpState [0] IMPLICIT INTEGER,
[1] IMPLICIT EgpParam,
[2] IMPLICIT EgpStats OPTIONAL,
egpPeerData [3] IMPLICIT SET of EgpPeer
}
OBJECT: EgpValues
Type: SET
Definition: see above ๐
Object Status: Required in entities which support EGP ๐
the subdictionaries of this dictionary are explained below ๐
OBJECT: egpState
Type: INTEGER
Definition: the state of the EGP system. the state values are:
0 -- Idle
1 -- Acquisition
2 -- Down
3 -- Up
4 -- Cease
these values are taken directly from RFC-904 ๐
The IpTransportLayer Dictionary: EgpValues/EgpParam โจ
the EgpParam dictionary stores all the various EGP parameters ๐ here's the format:
EgpParam ::= SET {
p1 [0] IMPLICIT INTEGER,
p2 [1] IMPLICIT INTEGER,
p3 [2] IMPLICIT INTEGER,
p4 [3] IMPLICIT INTEGER,
p5 [4] IMPLICIT INTEGER,
ipID [5] IMPLICIT Counter OPTIONAL
}
OBJECT: EgpParam
Type: SET
Definition: see above ๐
the fields of the dictionary are explained below. all the definitions come from RFC-904 ๐
OBJECT: p1
Type: INTEGER
Definition: the minimum interval acceptable between successive Hello commands received โฐ
Operations on Object: the defaults, except as noted below.
- SET: the set command is optionally defined on this object ๐ง
OBJECT: p2
Type: INTEGER
Definition: the minimum interval acceptable between successive Poll commands received โฐ
Operations on Object: the defaults, except as noted below.
- SET: the set command is optionally defined on this object ๐ง
OBJECT: p3
Type: INTEGER
Definition: the interval between Request or Cease command retransmissions ๐
Operations on Object: the defaults, except as noted below.
- SET: the set command is optionally defined on this object ๐ง
OBJECT: p4
Type: INTEGER
Definition: the interval during which state variables are maintained in the absence of commands or response in the Down and Up states ๐ซง
Operations on Object: the defaults, except as noted below.
- SET: the set command is optionally defined on this object ๐ง
OBJECT: p5
Type: INTEGER
Definition: the interval during which state variables are maintained in the absence of commands or response in the Acquisition and Cease states ๐ซง
Operations on Object: the defaults, except as noted below.
- SET: the set command is optionally defined on this object ๐ง
OBJECT: ipID
Type: Counter
Definition: the next IP packet ID identifier to be used by the EGP code ๐
Object Status: Required if the EGP code generates its own IP identifiers ๐ซถ
The IpTransportLayer Dictionary: EgpValues/EgpStats โจ
Okay bestie, the EgpStats dictionary is where the entity keeps its stats on how it's been using EGP ๐. It's a SET, and it looks like this ๐ :
EgpStats ::= SET {
inputPktCount [1] IMPLICIT Counter,
inputPktErrors [2] IMPLICIT Counter,
inputPktTypes [3] IMPLICIT Histogram OPTIONAL,
outputPktCount [4] IMPLICIT Counter,
outputPktErrors [5] IMPLICIT Counter,
outputPktTypes [6] IMPLICIT Histogram OPTIONAL,
egpTraffic [7] IMPLICIT TrafficMatrix OPTIONAL
}
EgpStats ๐
Type: SET
Definition: see above, it's the whole thing ๐
Now let's look at each object inside ๐
inputPktCount ๐ฅ
Type: Counter
Definition: the number of EGP packets received, including the ones that turned out to be broken โ
inputPktErrors ๐ซ
Type: Counter
Definition: the number of EGP packets received that turned out to be broken. If you take this number away from inputPktCount, you get the number of valid EGP packets received โจ
inputPktTypes ๐
Type: Histogram
Definition: a histogram of the types of valid EGP messages received. The histValue field holds the message type number, and the histCount field holds how many messages of that type were received ๐ง
Object Status: Useful.
outputPktCount ๐ค
Type: Counter
Definition: the total number of EGP packets the entity tried to send. That includes the ones that failed because of things like no buffers, a missing route, or other temporary transmission problems ๐ซ
outputPktErrors ๐
Type: Counter
Definition: the number of EGP packets the entity couldn't send because of transmission problems, like no buffers, a missing route, or other temporary issues. This doesn't have to include errors the EGP layer couldn't reasonably be expected to catch, like a packet getting damaged in transit ๐. If you subtract this from outputPktCount, you get the number of EGP packets the entity thinks it successfully sent ๐
outputPktTypes ๐ฆ
Type: Histogram
Definition: a histogram of the EGP message types sent, including the ones that later failed to go out. The histValue field holds the message type number, and the histCount field holds how many messages of that type were sent ๐
Object Status: Useful.
egpTraffic ๐
Type: TrafficMatrix
Definition: all EGP traffic that started on this machine. In the traffic matrix, the source address should be the interface the packet was sent from. The destination is the address the packet is finally delivered to, not an intermediate hop ๐ค๏ธ
Object Status: Useful.
The IpTransportLayer Dictionary: EgpValues/EgpPeer ๐ฆ
The egpPeerData field of the EgpValues dictionary is a set of EgpPeer structures. Each one holds the state variables for one particular EGP neighbor ๐ค. Here's the EgpPeer structure ๐:
EgpPeer ::= SET {
r [0] IMPLICIT Counter,
s [1] IMPLICIT Counter,
t1 [2] IMPLICIT INTEGER,
t2 [3] IMPLICIT INTEGER,
t3 [4] IMPLICIT INTEGER,
m [5] IMPLICIT BOOLEAN,
timer1 [6] IMPLICIT INTEGER,
timer2 [7] IMPLICIT INTEGER,
timer3 [8] IMPLICIT INTEGER,
addr [9] IMPLICIT IpAddress
}
EgpPeer ๐ธ
Type: SET
Definition: the state info for a given EGP neighbor ๐ฏ
Here's what each field means ๐
r ๐ข
Type: Counter
Definition: the receive sequence number, as defined in RFC-904.
s ๐ข
Type: Counter
Definition: the send sequence number, as defined in RFC-904.
t1 โฑ๏ธ
Type: INTEGER
Definition: the interval between Hello command retransmissions, as defined in RFC-904.
t2 โฑ๏ธ
Type: INTEGER
Definition: the interval between Poll command retransmissions, as defined in RFC-904.
t3 โฑ๏ธ
Type: INTEGER
Definition: the interval during which neighbor-reachability indications are counted, as defined in RFC-904.
m ๐
Type: BOOLEAN
Definition: the Hello Polling mode. It's true when in active mode and false when in passive mode.
Operations on Object: the defaults, except as noted below.
- SET: optionally defined, so you can change the Hello Polling mode ๐๏ธ
timer1 โฒ๏ธ
Type: INTEGER
Definition: the value of timer 1, as defined in RFC-904.
timer2 โฒ๏ธ
Type: INTEGER
Definition: the value of timer 2, as defined in RFC-904.
timer3 โฒ๏ธ
Type: INTEGER
Definition: the value of timer 3, as defined in RFC-904.
addr ๐
Type: IpAddress
Definition: the IP address of the neighbor.
The IpTransportLayer Dictionary: UdpValues ๐ท
The UdpValues dictionary stores all the info on the User Datagram Protocol, which is defined in RFC-768 ๐ฎ. Here's the format ๐ :
UdpValues ::= [17] IMPLICIT SET OPTIONAL {
ipID [0] IMPLICIT Counter OPTIONAL,
[1] IMPLICIT UdpStats,
udpPortData [2] IMPLICIT SET of udpPort
}
UdpValues ๐ผ
Type: SET
Definition: see above.
Object Status: implementation of this dictionary is required if the entity supports UDP.
Here are the fields ๐
ipID ๐
Type: Counter
Definition: the next IP packet ID identifier to be used by the UDP code.
Object Status: required if the UDP code generates its own IP identifiers.
The IpTransportLayer Dictionary: UdpValues/UdpStats ๐
The UdpStats dictionary holds general info about how UDP is behaving on the entity ๐. Here's the format โจ:
UdpStats ::= SET {
inputPkts [0] IMPLICIT Counter,
inputPktErrors [1] IMPLICIT Counter,
outputPkts [2] IMPLICIT Counter,
}
UdpStats ๐
Type: SET
Definition: see above.
Object Status: encouraged.
Here's what's inside ๐ซถ
inputPkts ๐ฅ
Type: Counter
Definition: the total number of UDP packets received at this entity, including any errors.
Object Status: required if the UdpStats dictionary is implemented.
inputPktsErrors ๐ซ
Type: Counter
Definition: the number of UDP packets that couldn't be delivered because of format errors, data corruption, or because there was no application at the destination port ๐
Object Status: required if the UdpStats dictionary is implemented.
outputPkts ๐ค
Type: Counter
Definition: the total number of UDP segments sent from this entity.
Object Status: required if the UdpStats dictionary is implemented.
The IpTransportLayer Dictionary: UdpValues/udpPortData ๐ง
The udpPortData structure stores info about individual UDP applications ๐ช. It's a set of records called udpPorts, and each one tracks how one port is behaving. Both structures look like this ๐:
udpPortData [1] IMPLICIT SET of UdpPort
UdpPort ::= [0] IMPLICIT SET {
localAddress [0] IMPLICIT IpAddress,
localPort [1] IMPLICIT INTEGER,
foreignAddress [2] IMPLICIT IpAddress OPTIONAL,
foreignPort [3] IMPLICIT INTEGER OPTIONAL,
maxPktSize [4] IMPLICIT INTEGER,
pktsRcvd [5] IMPLICIT Counter,
octetRcvd [6] IMPLICIT Counter OPTIONAL,
pktsSent [7] IMPLICIT Counter,
octetSent [8] IMPLICIT Counter OPTIONAL,
}
udpPortData ๐
Type: SET of udpPort
Definition: see above.
UdpPort ๐ฆ
Type: SET
Definition: see above.
Operations on Object: the defaults, except as noted below.
- GET-MATCH: defined on any combination of the values of localAddress, localPort, foreignAddress, and foreignPort. It returns all ports that match the template ๐
Now the meaning of each field in the udpPort record ๐
localAddress ๐
Type: IpAddress
Definition: the local IP address of the port. It may be the default IP address if records are accepted from any interface.
localPort ๐ช
Type: INTEGER
Definition: the local port number.
foreignAddress ๐
Type: IpAddress
Definition: some UDP implementations let applications specify the remote address that packets will be accepted from. In those implementations, this field can be used to return the remote IP address. If it's set to the default IP address, packets from any host are accepted. The default IP address means the application hasn't specified a remote address, but it could if it wanted to ๐คทโโ๏ธ
Object Status: required in entities that let applications specify the remote address.
foreignPort ๐
Type: INTEGER
Definition: some UDP implementations let applications specify the remote address that packets will be accepted from. In those implementations, this field can be used to return the remote port. If it's set to 0, packets from any remote port are accepted.
Object Status: required in entities that let applications specify the remote port.
maxPktSize ๐
Type: INTEGER
Definition: the maximum UDP packet size, if any, that this host supports.
Object Status: required if there's a limit on the UDP packet size.
pktsRcvd ๐ฌ
Type: Counter
Definition: the total number of packets received on this port during the lifetime of this application, meaning the application that opened this port.
octetsRcvd ๐ข
Type: Counter
Definition: the total number of octets received at this port.
pktsSent ๐จ
Type: Counter
Definition: the total number of packets sent on this port during the lifetime of this application, meaning the application that opened this port.
octetsSent ๐ข
Type: Counter
Definition: the total number of octets sent on this port during the lifetime of this application, meaning the application that opened this port.
The IpTransportLayer Dictionary: HmpValues ๐
The HmpValues dictionary would store all the info on the Host Monitoring Protocol, which is defined in RFC-869. But HEMS is designed to replace HMP, so defining this dictionary has been put off until there's a clear need for it ๐ซ
The IpTransportLayer Dictionary: RdpValues ๐
The RdpValues dictionary would store all the info on the Reliable Data Protocol (RDP). RDP is still being tested and revised, so defining this dictionary is left for further study ๐งช
The IpTransportLayer Dictionary: NetbltValues ๐ฆ
okay so the NetbltValues dictionary is where all the info on the Network Block Transfer protocol (Netblt) lives ๐ฆ. but Netblt is still being tested and revised rn, so the definition of this dictionary is left for further study ๐ no cap, it's a "we'll get back to you" situation.
The IpApplications Dictionary ๐ธ
the IpApplications dictionary stores info about networking apps whose operations might affect how the network runs properly ๐ง. examples? domain nameservers or distributed routing agents (like gated or routed) bestie ๐ . the definition of this dictionary is also left for further study โจ.
NOTES ON RETRIEVAL OF OBJECTS ๐
this part is lowkey important. the vibe is that the query processor is only one of many processes running at once on an entity, and the other processes can change the values of the objects the query processor manages ๐. so the query processor is not required to keep values frozen while a query runs. which means related values can change mid-query! applications should be ready for that ๐
also, a few places specify mathematical relations between objects, like object X minus object Y should give some well-defined value ๐ข. in lots of cases X and Y are roll-over counters, so those relations are only valid modulo the precision of the counter. that's acceptable fr ๐ . the relationships are only intended to clarify the association between objects.
EVENTS ๐ฅ
in the rest of this memo we present the format and definition of event messages, which are unsolicited updates sent from entities to management centers ๐จ.
this section needs much more work. the authors included it to show how the trap mechanism works, but way more research is needed on what events should be reported and what info they must carry before it can be finished. the authors welcome any advice from the community on this ๐ซถ
Format of Event Messages ๐
Event messages have the same format as replies: they are a sequence of objects. the only difference between an event message and a regular reply to a query is that the event message is labelled as an event in the HEMP message header, and the first object is a special event leader describing the event. all objects after the event leader are standard objects stored by the entity that might be useful to a monitoring center in understanding the machine state which caused the event ๐ง . each event has a certain number of objects that it must return. additional objects may be returned by loading instructions into the eventExecution buffer of the relevant eventEntry โจ.
The format of the event leader is shown below:
EventLeader ::= [APPLICATION 1024] IMPLICIT SEQUENCE {
eventCode INTEGER,
eventIndex INTEGER,
eventThreshold INTEGER,
eventTime TimeStamp,
eventDescr IA5STRING
}
- eventCode: a number which indicates the type of event. the eventCodes are defined below.
- eventIndex: an implementation specific value. it is considered good practice to make sure that a particular event is only generated in one place. it may be the case that certain HEMS generic events (for example, "no buffer space") may be generated by more than one place in an entity's code. to allow implementors and network managers to determine where the event is actually being generated, implementors should make sure that a distinct eventIndex is assigned to each location in the code that generates a particular event ๐.
- eventThreshold: the value of the event threshold when the event was sent.
- eventTime: indicates when the trap was generated โฐ.
- eventDescr: a text string which describes the event. this description should explain the general problem (e.g., "no buffer space") and may also, optionally, include additional information about why this particular event was generated (e.g., "could not send ICMP redirect") ๐.
Event Definitions ๐
the remainder of this memo presents a few generic events, which are presented for illustration only. implementors interested in supporting events should contact the authors to help work out a more comprehensive set of definitions ๐.
the format of the event definitions is:
- EVENT CODE: the event code number.
- Definition: defines the event.
- Related Objects: the list of related objects which must be returned following the event header. all objects should be returned as fully qualified objects (with ASN.1 codes tracing a complete path from the root object dictionary). if no objects are specified, then no related objects are required.
- Event Status: events are either required of all conforming implementations, required if the entity supports a particular feature (e.g., TCP events), or optional.
- Notes: any additional notes about the event.
List of Events ๐
the next few event codes are for system (as opposed to more network oriented) events ๐ป.
EVENT CODE: 0
- Definition: Unused
EVENT CODE: 1
- Definition: The entity has rebooted.
- Related Objects: An INTEGER which is the highest HEMP messageID reached by the trap system before the system crashed. ๐
EVENT CODE: 2
- Definition: The entity is about to go into test mode.
EVENT CODE: 3
- Definition: The entity is about to reset.
EVENT CODE: 4
- Definition: The entity is about to reboot.
EVENT CODE: 5
- Definition: The entity is about to halt.
EVENT CODE: 6
- Definition: The system is close to depleting its packet buffer space.
- Event Status: optional
EVENT CODE: 7
- Definition: The system has depleted its packet buffer space.
EVENT CODE: 8
- Definition: The system has depleted a non-packet buffer space.
- Note: The two trap codes above do not deal neatly with systems which have multiple buffer pools, each of which may be depleted separately, with very different effects on the entity ๐.
the next set of event codes applies to events related to network interfaces ๐.
EVENT CODE: 1024
- Definition: The given interface has just come up.
- Related Objects: The InterfaceData structure for the interface.
EVENT CODE: 1025
- Definition: The given interface has just been taken down.
- Related Objects: The InterfaceData structure for the interface.
EVENT CODE: 1026
- Definition: The given interface has just gone into test mode.
- Related Objects: The InterfaceData structure for the interface.
the next set of event codes is used to report IP-level errors ๐จ.
EVENT CODE: 2048
- Definition: Unable to route IP packet.
EVENT CODE: 2049
- Definition: Bad IP checksum.
EVENT CODE: 2050
- Definition: An IP packet with a bad header was received (for example, with a broadcast or multicast IP address as the source, or the wrong IP version number, or a header length which is too short).
- Related Objects: Should return the IP header of the packet. Note that an IP header type has not yet been defined.
EVENT CODE: 2051
- Definition: Packet for unsupported IP transport protocol.
- Related Objects: Should return the IP header of the packet. Note that an IP header type has not yet been defined.
EVENT CODE: 2052
- Definition: A stunted IP packet was received (smaller than the IP length says it should be).
- Related Objects: Should return the IP header of the packet. Note that an IP header type has not yet been defined.
EVENT CODE: 2053
- Definition: An oversize IP packet was received (larger than the IP length says it should be).
- Related Objects: Should return the IP header of the packet. Note that an IP header type has not yet been defined.
EVENT CODE: 2054
- Definition: A good IP packet was discarded (usually to free up buffer space).
- Related Objects: Should return the IP header of the packet. Note that an IP header type has not yet been defined.
EVENT CODE: 2055
- Definition: An IP packet's time-to-live as expired.
- Related Objects: Should return the IP header of the packet. Note that an IP header type has not yet been defined.
EVENT CODE: 2056
- Definition: This IP fragment has timed out.
- Related Objects: Should return the header of the fragment. Note that an IP header type has not yet been defined.
AREAS FOR FURTHER STUDY ๐ง
there are several parts of this document that could use additional study, so comments from readers are super welcome ๐.
the whole event system needs a thorough examination ๐. it's not clear that the event control mechanism strikes the proper balance between enough flexibility for monitoring centers to customize their event stream and keeping the basic mechanism simple. further, defining generic events for all entities is an immense task ๐ญ. finally, the system of appending required values after traps, followed by optional values read from the data tree, feels a bit cumbersome. it would be nice if all values were in the same data space ๐ซ .
several readers have suggested it might make more sense to keep TCP connection parameters on a per-connection basis rather than globally ๐ฆ.
the method for specifying the TCP round-trip time algorithm needs to be refined. the expression syntax should be sufficiently general that all round-trip-time-related algorithms (e.g., those for time or routing protocols) can be expressed in it ๐ฅ.
much more research could be done into what information needs to be gathered to effectively monitor a network ๐ธโจ
๐ฆ where this page comes from
- ietf: rfc1024 1987-10
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms