FAQ:Coding 17

From Net-SNMP Wiki
Revision as of 17:12, 23 November 2006 by Dts12 (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

How can I support a large table, with more than 256 column objects?

This is a problem (at least apparently) with the v4 UCD module API, which uses a "magic number" to distinguish between the various column objects implemented by a common variable handling routine. Since this field is defined as an unsigned character, it can only take values 0-255. So at first sight, it would appear that the agent cannot support tables (or scalar groups) with more than 256 objects, since this would start to duplicate these magic numbers.

However, the agent doesn't actually care which routine implements a given object, and magic numbers only need to be unique within a single variable handling routine. So it is actually perfectly possible to implement a larger table by splitting it between two (or more) variable handling routines. These can then re-use the magic numbers quite safely:

 struct variable1 [] = {
     {MAGIC1,   ASN_INTEGER, RWRITE, var_myfirst,  1, {  1}},
     {MAGIC2,   ASN_INTEGER, RWRITE, var_myfirst,  1, {  2}},
               :
     {MAGIC255, ASN_INTEGER, RWRITE, var_myfirst,  1, {255}},
     {MAGIC1,   ASN_INTEGER, RWRITE, var_mysecond, 1, {256}},
     {MAGIC2,   ASN_INTEGER, RWRITE, var_mysecond, 1, {257}},
               :
     {MAGIC255, ASN_INTEGER, RWRITE, var_mysecond, 1, {510}}
 };

All that matters is that a given magic number isn't re-used within the same variable handling routine. The v5 table handlers typically use an integer variable for holding column information, so aren't subject to the same limitations.

Though I'd have to question whether having such a wide table is necessarily a particularly good design strategy!

   FAQ:Coding
   
  1. How do I write C code to integrate with the agent?
  2. How does the agent fetch the value of a MIB variable from the system?
  3. Mib2c complains about a missing "mib reference" - what does this mean?
  4. Mib2c complains about not having a "valid OID" - what does this mean?
  5. Why doesn't mib2c like the MIB file I'm giving it?
  6. Mib2c ignores my MIB and generates a pair of 'mib-2' code files. Why?
  7. What's the difference between the various mib2c configuration files?
  8. Which mib2c configuration file should I use?
  9. How can I have mib2c generate code for both scalars and tables?
  10. Are there any examples, or documentation for generating MIB modules?
  11. Where should I put the files produced by 'mib2c'?
  12. Why doesn't my new MIB module report anything?
  13. Why does the iterator call my get_{first,next} routines so often?
  14. How can I get the agent to generate a trap (or inform)?
  15. How can I get an AgentX sub-agent to generate a trap (or inform)?
  16. How can I get the agent to send an SNMPv1 (or SNMPv2c) trap?
  17. How can I get the agent to include varbinds with an SNMPv1 trap?
  18. How can I get the agent to send an SNMPv1 enterprise-specific trap?
  19. How can I get the agent to send an SNMPv3 trap (or inform)?
  20. Why does calling 'send_v2trap' generate an SNMPv1 trap (or vice versa)?
  21. How can I register a MIB module in a different (SNMPv3) context?