Vedran Zakanj
Vedran Zakanj

Reputation: 101

C# SNMP agent - representing complex types in MIB

I'm writing my first SNMP agent in C# and I want to expose some system event information through SNMP GET requests.

On the C# side, all system events are represented by a simple class:

public class MySystemEvent  
{  
    public int Id { get;set; }
    public string Message { get; set; }
    public DateTime Occurred { get; set; }
}

I would like to expose each of these specific events (determined by event id) as a separate node in the MIB, but am not entirely sure how to create a custom ASN.1 complex type that would correspond to the class above. I'm aware I can use SEQUENCE to represent these, but not sure if I'm using them properly.

What I've done so far:

enterprise OBJECT IDENTIFIER       ::= { private 1 }
penNode OBJECT IDENTIFIER          ::= { enterprise <PEN> }
customSystemNode OBJECT IDENTIFIER ::= { penNode 1 }
events OBJECT IDENTIFIER           ::= { customSystemNode 1 }

Event ::= SEQUENCE {
    id Integer32,
    message DisplayString,
    occurred DateAndTime
}

firstSpecificEvent OBJECT-TYPE
    SYNTAX Event
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "First specific event."
    INDEX { eventId }
    ::= { events 1 }

eventId OBJECT-TYPE
    SYNTAX Integer32
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "Event Id."
    ::= { firstSpecificEvent 1 }

eventMessage OBJECT-TYPE
    SYNTAX DisplayString
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "Event message."
    ::= { firstSpecificEvent 2 }

eventOccurred OBJECT-TYPE
    SYNTAX DateAndTime
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "Event occurred."
    ::= { firstSpecificEvent 3 }

The above MIB defines the following tree:

What I want to add are multiple other events with the same structure to the "events" node e.g. right after the firstSpecificEvent I want to have:

How do I that without adding separate eventId, eventMessage and eventOccurred OBECT-TYPE definitions for every specific event? Is it possible to define a CustomEventComplexType which would allow the following?

firstSpecificEvent OBJECT-TYPE
    SYNTAX CustomEventComplexType
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "First specific event."
    ::= { events 1 }

secondSpecificEvent OBJECT-TYPE
    SYNTAX CustomEventComplexType
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "Second specific event."
    ::= { events 2 }

thirdSpecificEvent OBJECT-TYPE
    SYNTAX CustomEventComplexType
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "Third specific event."
    ::= { events 3 }

etc.

Upvotes: 4

Views: 783

Answers (1)

Vedran Zakanj
Vedran Zakanj

Reputation: 101

I ended up solving this just the way @LexLi suggested, by creating a table of events. This way OBJECT-TYPE definitions are needed only once for the definition of a row entry.

enterprise OBJECT IDENTIFIER       ::= { private 1 }
penNode OBJECT IDENTIFIER          ::= { enterprise <PEN> }
customSystemNode OBJECT IDENTIFIER ::= { penNode 1 }

Event ::= SEQUENCE {
    id Integer32,
    message DisplayString,
    occurred DateAndTime
}

eventTable OBJECT-TYPE
    SYNTAX SEQUENCE OF Event
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "Table containing event information."
    ::= { customSystemNode 1 }

eventTableRowEntry OBJECT-TYPE
    SYNTAX Event
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "A row entry in the event table."
    INDEX { eventId }
    ::= { eventTable 1 }

eventId OBJECT-TYPE
    SYNTAX Integer32
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "Event id."
    ::= { eventTableRowEntry 1 }

eventMessage OBJECT-TYPE
    SYNTAX DisplayString
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "Event message."
    ::= { eventTableRowEntry 2 }

eventOccurred OBJECT-TYPE
    SYNTAX DateAndTime
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "Event occurred timestamp."
    ::= { eventTableRowEntry 3 }

Upvotes: 1

Related Questions