[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: OID compression/suppression support




>>>>> Michael Daniele writes:

Michael> This is a very important point, which I'd like to see more
Michael> fully explored.  Some of the eos drafts list specific
Michael> problems with the existing protocol, but I don't think I've
Michael> seen anything about actual functional requirements from
Michael> applications.

Michael> You know, something like

Michael>     - Retrieve an entire table
Michael>     - Retrieve a particular row -
Michael>     - Set a value or values in a particular row

Not sure I count since I am not working for a big company. But here is
what current scli stubs <http://www.ibr.cs.tu-bs.de/projects/scli/>
provide to the application programmer:

1. Retrieve a projection of an entire table
2. Retrieve a projection of a particular row in a table
3. Retrieve a projection of a group of scalars
4. Set a projection in a particular row in a table
5. Set a projection in a group of scalars
6. Create a row in a table (*)
7. Delete a row in a table (*)

   (*) only tables using the RowStatus TC and also somewhat incomplete
       due to a lack of machine readable information in the SMIv2

[A concrete example how this interface looks like in appended at the end.]

It would be nice to have additional capabilities such as better
filtering. But note that scli usually allows to filter by regular
expressions matched against names which often are not index components
(e.g. all interfaces that match Ethernet.*/0). Having a bit more
support for filtering things like this would be nice (and I guess
Randy Presuhn will love this ;-).

Also, having some more support for transactions would be nice. We
sometimes have to do multiple sets in order implement one of our
primitives (e.g. create a vlan and assign n ports to it, which can
lead to n+1 row creation operations on some boxes). We need to write
code which tries to cleanup things when one of these sets fails. Sure,
one can argue where this rollback logic should reside and I guess
neither agent developers nor management application writers love to
write this code. ;-)

But getting back to the current EOS proposals: Our stubs to retrieve a
projection of an entire table really tend to have unacceptable
performance if the table has more than just a handful of rows
(compared to the native CLI commands that show similar output). So
even if there are no new features other then the ones enumerated
above, it would be a big win if EOS can make them work as fast as
other interfaces into a box.

Note: If EOS folks define better support for the enumerated functions
above, it would be necessary to change our SNMP engine and stub code
generator. Once this is in place, a simple recompilation will allow
all our application code to take advantage of the new protocol
operations. So our migration path would be straight-forward.

/js

-- 
Juergen Schoenwaelder    <http://www.informatik.uni-osnabrueck.de/schoenw/>


/*
 * C type definitions for IF-MIB::ifStackEntry.
 */

#define IF_MIB_IFSTACKSTATUS (1 << 0) 
typedef struct {
    gint32   ifStackHigherLayer;
    gint32   ifStackLowerLayer;
    gint32   *ifStackStatus;
} if_mib_ifStackEntry_t;

extern void
if_mib_get_ifStackTable(GSnmpSession *s, 
		        if_mib_ifStackEntry_t ***ifStackEntry, 
                        gint mask);

extern void
if_mib_free_ifStackTable(if_mib_ifStackEntry_t **ifStackEntry);

extern if_mib_ifStackEntry_t *
if_mib_new_ifStackEntry(void);

extern void
if_mib_get_ifStackEntry(GSnmpSession *s, 
                        if_mib_ifStackEntry_t **ifStackEntry, 
                        gint32 ifStackHigherLayer, 
                        gint32 ifStackLowerLayer,
                        gint mask);

extern void
if_mib_set_ifStackEntry(GSnmpSession *s, 
                        if_mib_ifStackEntry_t *ifStackEntry, 
			gint mask);

extern void
if_mib_free_ifStackEntry(if_mib_ifStackEntry_t *ifStackEntry);

extern void
if_mib_create_ifStackEntry(GSnmpSession *s, 
                           gint32 ifStackHigherLayer,
                           gint32 ifStackLowerLayer);

extern void
if_mib_delete_ifStackEntry(GSnmpSession *s, 
                           gint32 ifStackHigherLayer,
                           gint32 ifStackLowerLayer);