123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- SNMPv1 agent for lwIP
- Author: Christiaan Simons
- This is a brief introduction how to use and configure the SNMP agent.
- Note the agent uses the raw-API UDP interface so you may also want to
- read rawapi.txt to gain a better understanding of the SNMP message handling.
- 0 Agent Capabilities
- ====================
- SNMPv1 per RFC1157
- This is an old(er) standard but is still widely supported.
- For SNMPv2c and v3 have a greater complexity and need many
- more lines of code. IMHO this breaks the idea of "lightweight IP".
- Note the S in SNMP stands for "Simple". Note that "Simple" is
- relative. SNMP is simple compared to the complex ISO network
- management protocols CMIP (Common Management Information Protocol)
- and CMOT (CMip Over Tcp).
- MIB II per RFC1213
- The standard lwIP stack management information base.
- This is a required MIB, so this is always enabled.
- When builing lwIP without TCP, the mib-2.tcp group is omitted.
- The groups EGP, CMOT and transmission are disabled by default.
-
- Most mib-2 objects are not writable except:
- sysName, sysLocation, sysContact, snmpEnableAuthenTraps.
- Writing to or changing the ARP and IP address and route
- tables is not possible.
-
- Note lwIP has a very limited notion of IP routing. It currently
- doen't have a route table and doesn't have a notion of the U,G,H flags.
- Instead lwIP uses the interface list with only one default interface
- acting as a single gateway interface (G) for the default route.
- The agent returns a "virtual table" with the default route 0.0.0.0
- for the default interface and network routes (no H) for each
- network interface in the netif_list.
- All routes are considered to be up (U).
- Loading additional MIBs
- MIBs can only be added in compile-time, not in run-time.
- There is no MIB compiler thus additional MIBs must be hand coded.
- Large SNMP message support
- The packet decoding and encoding routines are designed
- to use pbuf-chains. Larger payloads than the minimum
- SNMP requirement of 484 octets are supported if the
- PBUF_POOL_SIZE and IP_REASS_BUFSIZE are set to match your
- local requirement.
- 1 Building the Agent
- ====================
- First of all you'll need to add the following define
- to your local lwipopts.h:
- #define LWIP_SNMP 1
- and add the source files in lwip/src/core/snmp
- and some snmp headers in lwip/src/include/lwip to your makefile.
- Note you'll might need to adapt you network driver to update
- the mib2 variables for your interface.
- 2 Running the Agent
- ===================
- The following function calls must be made in your program to
- actually get the SNMP agent running.
- Before starting the agent you should supply pointers
- to non-volatile memory for sysContact, sysLocation,
- and snmpEnableAuthenTraps. You can do this by calling
- snmp_set_syscontact()
- snmp_set_syslocation()
- snmp_set_snmpenableauthentraps()
- Additionally you may want to set
- snmp_set_sysdescr()
- snmp_set_sysobjid() (if you have a private MIB)
- snmp_set_sysname()
- Also before starting the agent you need to setup
- one or more trap destinations using these calls:
- snmp_trap_dst_enable();
- snmp_trap_dst_ip_set();
- In the lwIP initialisation sequence call snmp_init() just after
- the call to udp_init().
- Exactly every 10 msec the SNMP uptime timestamp must be updated with
- snmp_inc_sysuptime(). You should call this from a timer interrupt
- or a timer signal handler depending on your runtime environment.
- An alternative way to update the SNMP uptime timestamp is to do a call like
- snmp_add_sysuptime(100) each 1000ms (which is bigger "step", but call to
- a lower frequency). Another one is to not call snmp_inc_sysuptime() or
- snmp_add_sysuptime(), and to define the SNMP_GET_SYSUPTIME(sysuptime) macro.
- This one is undefined by default in mib2.c. SNMP_GET_SYSUPTIME is called inside
- snmp_get_sysuptime(u32_t *value), and enable to change "sysuptime" value only
- when it's queried (any function which need "sysuptime" have to call
- snmp_get_sysuptime).
- 3 Private MIBs
- ==============
- If want to extend the agent with your own private MIB you'll need to
- add the following define to your local lwipopts.h:
- #define SNMP_PRIVATE_MIB 1
- You must provide the private_mib.h and associated files yourself.
- Note we don't have a "MIB compiler" that generates C source from a MIB,
- so you're required to do some serious coding if you enable this!
- Note the lwIP enterprise ID (26381) is assigned to the lwIP project,
- ALL OBJECT IDENTIFIERS LIVING UNDER THIS ID ARE ASSIGNED BY THE lwIP
- MAINTAINERS!
- If you need to create your own private MIB you'll need
- to apply for your own enterprise ID with IANA: http://www.iana.org/numbers.html
- You can set it by passing a struct snmp_obj_id to the agent
- using snmp_set_sysobjid(&my_object_id), just before snmp_init().
- Note the object identifiers for thes MIB-2 and your private MIB
- tree must be kept in sorted ascending (lexicographical) order.
- This to ensure correct getnext operation.
- An example for a private MIB is part of the "minimal Unix" project:
- contrib/ports/unix/proj/minimal/lwip_prvmib.c
- The next chapter gives a more detailed description of the
- MIB-2 tree and the optional private MIB.
- 4 The Gory Details
- ==================
- 4.0 Object identifiers and the MIB tree.
- We have three distinct parts for all object identifiers:
- The prefix
- .iso.org.dod.internet
- the middle part
- .mgmt.mib-2.ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaPhysAddress
- and the index part
- .1.192.168.0.1
- Objects located above the .internet hierarchy aren't supported.
- Currently only the .mgmt sub-tree is available and
- when the SNMP_PRIVATE_MIB is enabled the .private tree
- becomes available too.
- Object identifiers from incoming requests are checked
- for a matching prefix, middle part and index part
- or are expanded(*) for GetNext requests with short
- or inexisting names in the request.
- (* we call this "expansion" but this also
- resembles the "auto-completion" operation)
- The middle part is usually located in ROM (const)
- to preserve precious RAM on small microcontrollers.
- However RAM location is possible for a dynamically
- changing private tree.
- The index part is handled by functions which in
- turn use dynamically allocated index trees from RAM.
- These trees are updated by e.g. the etharp code
- when new entries are made or removed form the ARP cache.
- /** @todo more gory details */
|