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 then 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 an 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 */
