      Frequently Asked Questions (FAQ) for the UCD/Net-SNMP package
      =============================================================
		       FAQ Author: Dave Shield
			Net-SNMP Version: 5.7.3
	    Net-SNMP/UCD-SNMP Project Leader: Wes Hardaker
	     Email: net-snmp-coders@lists.sourceforge.net

TABLE OF CONTENTS
=================

 TABLE OF CONTENTS
 GENERAL
   What is it?
   Where can I get it?
   What documentation is available?
   Are there binaries available?
   What's the difference between UCD-SNMP and Net-SNMP?
   What operating systems does it run on?
   What happens if mine isn't listed?
   Does it run on Windows?
   How do I find out about new releases?
   How can I find out what other people are doing?
   How do I submit a patch or bug report?
   Can I reuse the code in my commercial application?
   What's the difference between SNMPv1, SNMPv2 and SNMPv3?
   What's the difference between SNMPv2 and SNMPv2c?
   Which versions of SNMP are supported in this package?
   Can I use SNMPv1 requests with an SNMPv2 MIB (or vice versa)?
   How can I monitor my system with SNMP?
   Where can I find more information about network management?
   What ports does SNMP use?
   Is Net-SNMP thread safe?
 APPLICATIONS
   How do I add a MIB?
   How do I add a MIB to the tools?
   Why can't I see anything from the agent?
   Why doesn't the agent respond?
   I can see the system group, but nothing else.  Why?
   Why can't I see values in the <ENTERPRISE> tree?
   The agent worked for a while, then stopped responding.  Why?
   Requesting an object fails with "Unknown Object Identifier"  Why?
   Why do I get "noSuchName" when asking for "sysUpTime" (or similar)?
   Why do I sometimes get "End of MIB" when walking a tree, and sometimes not?
   How do I use SNMPv3?
   Why can't I set any variables in the MIB?
   Variables seem to disappear when I try to set them.  Why?
   Why can't I change sysLocation (or sysContact)?
   I get an error when trying to set a negative value - why?
   I get an error when trying to query a string-indexed table value - why?
   How should I specify string-indexed table values?
   How do I send traps and notifications?
   How do I receive traps and notifications?
   How do I receive SNMPv1 traps?
   Why don't I receive incoming traps?
   My traphandler script doesn't work when run like this - why not?
   How can the agent receive traps and notifications?
   How big can an SNMP request (or reply) be?
   How can I monitor my systems (disk, memory, etc)?
   Applications complain about entries in your example 'snmp.conf' file.  Why?
   OK, what should I put in snmp.conf?
   How do I specify IPv6 addresses in tools command line arguments?
 PERL
   What is the purpose of the Perl SNMP module?
   Where can I get the Perl SNMP package?
   How do I install the Perl SNMP modules?
   But compiling this fails! Why?
   Compiling the Perl module works OK, but 'make test' fails. Why?
   Why can't mib2c (or tkmib) locate SNMP.pm?
   Why can't mib2c (or tkmib) load SNMP.so?
   Why can't tkmib locate Tk.pm?
   Why does your RPM complain about missing Perl modules?
   I've got a problem with the Net-SNMP module.  Can you help?
 MIBS
   Where can I find a MIB compiler?
   Why aren't my MIB files being read in?
   Where should I put my MIB files?
   What does "Cannot find module (XXX-MIB)" mean?
   I'm getting answers, but they're all numbers. Why?
   What does "unlinked OID" mean?
   The parser doesn't handle comments properly. Why not?
   How can I get more information about problems with MIB files?
   What's this about "too many imported symbols"?
   Do I actually need the MIB files?
 AGENT
   What MIBs are supported?
   What protocols are supported?
   How do I configure the agent?
   How do I remove a MIB from the agent?
   I've installed a new MIB file.  Why can't I query it?
   How do I add a MIB to the agent?
   What's the difference between 'exec', 'sh', 'extend' and 'pass'?
   What's the difference between AgentX, SMUX and proxied SNMP?
   What is the purpose of 'dlmod'?
   Which should I use?
   Can I use AgentX when running under Windows?
   How can I run AgentX with a different socket address?
   How can I turn off SMUX support?
   How can I combine two copies of the 'mib2' tree from separate subagents?
   What traps are sent by the agent?
   Where are these traps sent to?
   How can I send a particular trap to selected destinations?
   When I run the agent it runs and then quits without staying around. Why?
   After a while the agent stops responding, and starts eating CPU time.  Why?
   How can I stop other people getting at my agent?
   How can I listen on just one particular interface?
   The agent is complaining about 'snmpd.conf'.  Where is this?
   Why does the agent complain about 'no access control information'?
   How do I configure access control?
   How do I configure SNMPv3 users?
   The 'createUser' line disappears when I start the agent.  Why?
   What's the difference between /var/net-snmp and /usr/local/share/snmp?
   My new agent is ignoring the old snmpd.conf file. Why?
   Where should the snmpd.conf file go?
   Why am I getting "Connection refused"?
   Why can't I see values in the UCDavis 'extensible' or 'disk' trees?
   Why can't I see values in the UCDavis 'memory' or 'vmstat' tree?
   What do the CPU statistics mean - is this the load average?
   How do I get percentage CPU utilization using ssCpuRawIdle?
   What about multi-processor systems?
   The speed/type of my network interfaces is wrong - how can I fix it?
   The interface statistics for my subinterfaces are all zero - why?
   Does the agent support the RMON-MIB?
   What does "klread:  bad address" mean?
   What does "nlist err:  wombat not found" (or similar) mean?
   What does "Can't open /dev/kmem" mean?
   The system uptime (sysUpTime) returned is wrong!
   Can the agent run multi-threaded?
   Can I use AgentX (or an embedded SNMP agent) in a threaded application?
 COMPILING
   How do I control the environment used to compile the software?
   How do I control the environment used to compile the software under Windows?
   Why does the compilation complain about missing libraries?
   How can I reduce the memory footprint?
   How can I reduce the installation footprint or speed up compilation?
   How can I compile the project for use on an embedded system?
   How can I compile the project to use static linking?
   Why does 'make test' skip various tests?
   Why does 'make test' complain about a pid file?
 CODING
   How do I write C code to integrate with the agent?
   How does the agent fetch the value of a MIB variable from the system?
   Mib2c complains about a missing "mib reference" - what does this mean?
   Mib2c complains about not having a "valid OID" - what does this mean?
   Why doesn't mib2c like the MIB file I'm giving it?
   Mib2c ignores my MIB and generates a pair of 'mib-2' code files.  Why?
   What's the difference between the various mib2c configuration files?
   Which mib2c configuration file should I use?
   How can I have mib2c generate code for both scalars and tables?
   Are there any examples, or documentation for developing MIB modules?
   Where should I put the files produced by 'mib2c'?
   Why doesn't my new MIB module report anything?
   Why does the iterator call my get_{first,next} routines so often?
   How can I get the agent to generate a trap (or inform)?
   How can I get an AgentX sub-agent to generate a trap (or inform)?
   How can I get the agent to send an SNMPv1 (or SNMPv2c) trap?
   How can I get the agent to include varbinds with an SNMPv1 trap?
   How can I get the agent to send an SNMPv1 enterprise-specific trap?
   How can I get the agent to send an SNMPv3 trap (or inform)?
   Why does calling 'send_v2trap' generate an SNMPv1 trap (or vice versa)?
   How can I register a MIB module in a different (SNMPv3) context?
 MISC
   What ASN.1 parser is used?
   What is the Official Slogan of the net-snmp-coders list?


GENERAL
=======

What is it?
----------

  - Various tools relating to the Simple Network Management Protocol
    including:

	* An extensible agent
	* An SNMP library
	* tools to request or set information from SNMP agents
	* tools to generate and handle SNMP traps
	* a version of the unix 'netstat' command using SNMP
	* a graphical Perl/Tk/SNMP based mib browser

    This package is originally based on the Carnegie Mellon University
    SNMP implementation (version 2.1.2.1), but has developed significantly
    since then.



Where can I get it?
------------------

  Download:
    - http://www.net-snmp.org/download/
    - ftp://ftp.net-snmp.org/pub/sourceforge/net-snmp/
  Web page:
    - http://www.net-snmp.org/
  Sourceforge Project page:
    - http://www.net-snmp.org/project/
  Mirrors (note that sourceforge download servers are mirrored themselves):
    - US:          ftp://ftp.freesnmp.com/mirrors/net-snmp/
    - Greece:      ftp://ftp.ntua.gr/pub/net/snmp/net-snmp/


What documentation is available?
-------------------------------

	This FAQ (!)
	README and individual READMEs for various platforms
	README.thread (discusses threading issues)
	INSTALL
	PORTING
	EXAMPLE.conf
	man pages for the individual tools, files and the API
	A guide for extending the agent
	Tutorials for both ucd-snmp v4 and net-snmp v5
           at  http://www.net-snmp.org/tutorial/
           and http://www.net-snmp.org/tutorial-5/ respectively

      Most of this documentation (plus archives of the mailing lists)
	 is also available on our web page:

        	http://www.net-snmp.org/

      There is also a Wiki (including a community-maintained version
      of this FAQ) at

                http://www.net-snmp.org/wiki/



Are there binaries available?
----------------------------

  There are binaries for some versions/systems available under
  the "net-snmp binaries" package on the SourceForge "Files"
  page, which is linked to from the main project download web
  page at http://www.net-snmp.org/download.html.

  These binaries are also available on the project FTP site,
  with a link on the same web page.

  There is also a mirror at ftp://ftp.freesnmp.org/mirrors/net-snmp/



What's the difference between UCD-SNMP and Net-SNMP?
---------------------------------------------------

  Not a great deal, really.
  Although the project originally started at UC Davis (hence the name),
  and it has always been based there, most of the contributors have had
  little or no connection with this institution.

    The move to SourceForge was intended to provide a more flexible
  environment for the project, and to distribute the administrative
  workload more evenly.  The change of name simply reflects this move,
  which was the last remaining link with UC Davis.

    The 4.2.x line saw the last releases made using the ucd-snmp name,
  and all releases on this line have been been bug-fixes only.  Release
  5.0 was the first version released under the Net-SNMP name, and all
  further development is being done on the 5.x code base.  The 4.2.x
  code line is now effectively closed down, as are the older 5.x branches.

    Much of the work done for the various 5.x releases has involved
  some fairly significant changes to the code - in particular the
  architecture of the agent.  However attempts have been made to retain
  backwards compatibility as much as possible, and most code written
  for earlier releases should continue to work.  The most visible
  change from the 4.2.x UCD suite to the 5.x Net-SNMP releases was a
  restructuring of the header file organisation - not least a change
  from <ucd-snmp/xxx.h> to <net-snmp/yyy.h>.

    But given the maturity of the Net-SNMP code, this should be less
  of a consideration for most current SNMP development projects.



What operating systems does it run on?
-------------------------------------

  Both the applications and the agent have been reported as running
  (at least in part) on the following operating systems:

	* Linux (kernels 2.6 to 1.3)
	* Solaris/SPARC (11 to 2.3), Solaris/Intel (10, 9) -- see 
	  README.solaris
	* HP-UX (11.31 to 9.01) -- see README.hpux11
	* Mac OS X (10.5 to 10.1) -- see README.osX
	* NetBSD (2.0 to 1.0)
	* FreeBSD (7.0 to 2.2)
	* OpenBSD (4.0 to 2.6)
	* BSDi (4.0.1 to 2.1)
	* AIX (6.1, 5.3, 5.2, 5.1, 4.3.3, 4.1.5, 3.2.5) -- see README.aix
	* IRIX (6.5 to 5.1)
	* OSF (4.0, 3.2 and Tru64 Unix 5.1B) -- see README.tru64
	* SunOS 4 (4.1.4 to 4.1.2)
	* Ultrix (4.5 to 4.2)
	* Dynix/PTX 4.4
	* QNX 6.2.1A

  We have also been informed about a port to the Stratus VOS.
  See http://ftp.stratus.com/vos/network/network.html for details.

  See the next question but one for the status of Windows support.

  Certain systems fail to compile particular portions of the agent.
  These can usually be persuaded to compile (at the loss of some
  functionality) by omitting the modules affected.
  See the next question for more details.

  Also note that the presence of a particular configuration in this
  list does not imply a perfect or complete implementation.  This
  is simply what various people have reported as seeming to work.
 (Or more frequently, the configurations where people have reported
  problems that we think we've subsequently fixed!)



What happens if mine isn't listed?
---------------------------------

  It's probably worth trying to compile it anyway.  Unless your
  system is significantly different to the supported configurations,
  most of the code (library, applications and the agent infrastructure)
  should probably compile with little or no difficulty.  The most
  likely source of problems will be MIB modules within the agent,
  as this tends to be where the most system-specific code is found.

    If only a few modules fail to compile, try removing them from
  the agent by running "configure --with-out-mib-module=xxx,yyy",
  and re-compiling.  If a large number of modules fail, then it
  might be easier to start from a relatively bare system, using
  "configure --enable-mini-agent --with-defaults".  Then if this
  minimal agent compiles and runs successfully, try adding each of
  the missing mibgroups individually using the configure option
  '--with-mib-module'.
  
    If configure fails with "invalid configuration" messages, or
  you get completely stuck, contact the coders list for advice.
  Similarly, if you manage to get this working on a new system,
  please let us know of any code changes that you needed to make,
  together with details of the hardware you're using, and what
  versions of the operating system you've tried it on.  The entry
  'host' in the file 'config.status' should show this information.
  Oh, and congratulations!



Does it run on Windows?
----------------------

    The suite should compile and run on Win32 platforms, including
  the library, command-line tools and the basic agent framework.
  Note that the agent now includes support for the MIB-II module,
  but this requires Microsoft's Core Platform SDK.  Instructions
  for how to install this are given in README.win32.

    Pre-compiled binaries are available from the project web site.

    As of v5.4, the Net-SNMP agent is able to load the Windows SNMP
  service extension DLLs by using the Net-SNMP winExtDLL extension.

    Some other Net-SNMP MIB modules, including the UCD pass-through
  extensions, do not currently work under Windows.  Volunteers to assist
  with these missing modules are likely to welcomed with open arms :-)

    Further details of Windows support (currently Visual C++, MinGW
  and Cygnus cygwin32) is available in the file README.win32.



How do I find out about new releases?
------------------------------------

  There is a mailing list for these announcements

  	net-snmp-announce@lists.sourceforge.net

  To be added to (or removed from) this list, visit
        http://www.net-snmp.org/lists/net-snmp-announce/
  Or you can send a message to the address
        net-snmp-announce-request@lists.sourceforge.net
  with a subject line of 'subscribe' (or 'unsubscribe' as appropriate).

  Advance notice of upcoming releases are also made on the
  net-snmp-users list (for "release candidates") for a week
  or two before the full release, and on the net-snmp-coders
  list (for "pre-releases") during the period prior to this.

  Major code revisions may be announced more widely, but these
  lists are the most reliable way to keep in touch with the
  status of the package.

  Patches to fix known problems are also made available via the web site:

        http://www.net-snmp.org/patches/



How can I find out what other people are doing?
----------------------------------------------

  There is a general purpose discussion list

  	net-snmp-users@lists.sourceforge.net

  To be added to (or removed from) this list, visit
        http://www.net-snmp.org/lists/net-snmp-users/
  Or you can send a message to the address
        net-snmp-users-request@lists.sourceforge.net
  with a subject line of 'subscribe' (or 'unsubscribe' as appropriate).

  To find out what the developers are doing, and to help them
  out, please read the PORTING file enclosed with the package.

  There is also a #net-snmp IRC channel set up on the freenode.net
  chat system.  You can connect to this via chat.freenode.net.
  See http://www.freenode.net/ for more information on getting
  started with IRC.
    Several core developers hang out on this channel on a fairly
  regular basis.



How do I submit a patch or bug report?
-------------------------------------

  The best way to submit a bug report is via the bug database through
  the interface found at
         http://www.net-snmp.org/bugs/
  Be sure to include the version of the package that you've been working
  with, the output of the command 'uname -a', the precise configuration
  or command that triggers the problem and a copy of any output produced.

    Questions about using the package should be directed at the
  net-snmp-users@lists.sourceforge.net mailing list.  Note that this
  mailing list is relatively busy, and the people answering these
  questions are doing so out of the goodness of their hearts, and in
  addition to their main employment.  Please note the following:

     - use plain text mail, rather than HTML
     - don't resend questions more than once
          (even if no-one answered immediately)
     - include full details of exact commands and error messages
          ("I've tried everything, and it doesn't work" isn't much use!)
     - do *NOT* send messages to -users and -coders mailing lists
          (most developers read both anyway)
     - don't mail the developers privately - keep everything on the list

    We can't promise to be able to solve all problems, but we'll
  certainly try and help.  But remember that this is basically an
  unsupported package.  It's Open Source, so if you need something
  fixing badly enough,  fundamentally it's up to you to do the work.

    All patches should be submitted to the patch manager at
         http://www.net-snmp.org/patches/
  If possible, submit a bug report describing the patch as well
  (referencing it by its patch number) since the patch manager
  doesn't contain a decent description field.

  The best way to submit patch (diff) information is by checking out
  the current code from the development git trunk, making your changes
  and then running "git diff" or "git format-patch" after you're done.

  (Please see http://www.net-snmp.org/wiki/index.php/Git for further
  information on using git with the Net-SNMP project)

  If you're working from a source code distribution, and comparing old
  and new versions of a code file, use "diff -u OLDFILE NEWFILE" 



Can I reuse the code in my commercial application?
-------------------------------------------------

  The details of the COPYRIGHTs on the package can be found in the COPYING
  file.  You should have your lawyer read this file if you wish to use the
  code in your commercial application.  We will not summarize here what is
  in the file, as we're not lawyers and are unqualified to do so.



What's the difference between SNMPv1, SNMPv2 and SNMPv3?
-------------------------------------------------------
What's the difference between SNMPv2 and SNMPv2c?
------------------------------------------------

  A full description is probably beyond the scope of this FAQ.
  Very briefly, the original protocol and admin framework was
  described in RFCs 1155-1157, and is now known as SNMPv1.

    Practical experience showed up various problems and deficiencies
  with this, and a number of revised frameworks were developed to try
  and address these problems.  Unfortunately, it proved difficult to
  achieve any sort of agreement - particularly over the details of
  the administrative framework to use.

    There was less disagreement over the proposed changes to the
  protocol operations.  These included:
        * increasing the range of errors that could be reported
        * introducing "exception values"
            (so a single missing value didn't affect
             the other varbinds in the same request)
        * a new GETBULK operation
            (a supercharged GETNEXT)
        * new notification PDUs
            (closer in structure to the other request PDUs)

  Strictly speaking, it's this revised protocol (originally defined
  in RFC 1905, and most recently in RFC 3416) that is "SNMPv2".

  The only framework based on this protocol that saw a significant
  level of use was "Community-based SNMPv2" or "SNMPv2c" (defined
  in RFC 1901). This retained the same administrative framework
  as SNMPv1 (with all of the accompanying limitations), but using
  the new protocol operations.

  More recently, a new administrative framework has been developed,
  building on the various competing SNMPv2 proposals, and using the
  same SNMPv2 protocol operations.  This is SNMPv3, which is defined
  in RFCs 3411-3418.    It addresses some of the deficiencies of the
  community-based versions, including significant improvements to
  the security of SNMP requests (like it finally has some!).
     SNMPv3 is now a full IETF standard protocol.

  Strictly speaking, SNMPv3 just defines a fairly abstract framework,
  based around the idea of "Security Models" and "Access Control Models".
  It's this combination of SNMPv3 plus accompanying models that actually
  provides a working SNMP system.
     However, the only models in common use are the "User-based Security
  Model" (RFC 3414) and the "View-based Access Control Model" (RFC 3415).
  So "SNMPv3" is frequently used to mean the combination of the basic
  SNMPv3 framework with these two particular models.
     This is also sometimes described as "SNMPv3/USM".


  So in brief:
        - SNMPv2c updated the protocol operations
                  but left the administrative framework unchanged.
        - SNMPv3  updated the administrative framework
                  but left the protocol operations unchanged.



Which versions of SNMP are supported in this package?
----------------------------------------------------

  This package currently supports the original SNMPv1 (RFC 1157),
  Community-based SNMPv2 (RFCs 1901-1908), and SNMPv3 (RFCs 3411-3418).
    The agent will respond to requests using any of these protocols,
  and all the tools take a command-line option to determine which
  version to use.

  Support for SNMPv2 classic (a.k.a. "SNMPv2 historic" - RFCs 1441-1452)
  was dropped with the 4.0 release of the UCD-snmp package.



Can I use SNMPv1 requests with an SNMPv2 MIB (or vice versa)?
------------------------------------------------------------

    Yes.

    The syntax used to specify a MIB file (better referred
  to as SMIv1 or SMIv2) is purely concerned with how to define
  the characteristics of various management objects.  This is
  (almost) completely unrelated to the versions of the protocol
  used to operate on these values.  So it is quite reasonable to
  use SNMPv1 requests on objects defined using SMIv2, or SNMPv2
 (or SNMPv3) requests on objects defined using SMIv1.

    The one exception is objects of syntax Counter64, which are
  only accessible using SNMPv2 or higher.  SNMPv1 requests will
  either treat such objects as an error, or skip them completely.

  Note that SMIv1 is effectively obsolete, and all new MIBs
  should be written using SMIv2.

  

How can I monitor my system with SNMP?
-------------------------------------

  There are two main methods of using SNMP for monitoring.  One is to regularly
  query the SNMP agent for information of interest, graphing these values and/or
  saving them for later analysis.  That's not really the focus of the Net-SNMP
  project - our tools are more low-level, single-shot commands.  For this sort
  of high-level management, you're really looking at a management console
  application (such as Nagios or OpenNMS), or a data logging application
  (such as RRDtool, or one of its front-ends - MRTG, Cacti, etc).

  The other approach is to configure the SNMP agent to monitor the relevant
  information itself, and issue an alert when the values pass suitable limits.
  See the section ACTIVE MONITORING in the snmpd.conf(5) man page for details.

  Note that this entry makes no reference as to _what_ you should monitor, or
  what values might be significant.  That's because it is impossible to provide
  a universal answer to these questions.  The information to monitor, and the
  normal operating values will ultimately depend on your local environment.
  SNMP is simply a tool to _help_ you manage your systems - it isn't a magic
  panacea - you still have to think for yourself!



Where can I find more information about network management?
----------------------------------------------------------

  There are a number of sites with network management information on
  the World Wide Web.  Some of the most useful are

      http://www.simpleweb.org/
      http://www.snmplink.org/
      http://www.mibdepot.com/

  The SNMP Usenet newsgroup is now mostly defunct, but although the
  FAQ hasn't been updated for a while, it still contains a large
  amount of useful information relating to SNMP, including books,
  software, other sites, how to get an enterprise number, etc, etc.
  This is available from

      ftp://rtfm.mit.edu/pub/usenet/comp.protocols.snmp/

  or via any of the Web sites above.



What ports does SNMP use?
------------------------

  There are three main network ports (and one named socket), which are 
  typically used by SNMP.  These are:

    - UDP port 161       - SNMP requests (GET* and SET)
    - UDP port 162       - SNMP notifications  (Traps/Informs)
    - TCP port 705       - AgentX
    - /var/agentx/master - AgentX

  However, these are simply the default "well-known" ports for these purposes,
  and it is perfectly possible to accept requests on other ports.



Is Net-SNMP thread safe?
-----------------------

  Strictly speaking, no.  However, it is possible to use the library within
  a multi-threaded management application.  This is covered in detail in
  the file README.thread (shipped with the standard distribution), but can
  be summarised as follows:

    -	Call 'snmp_sess_init()' prior to activating any threads.
	This reads in and parses MIB information (which isn't thread-safe)
	as well as preparing a session structure for subsequent use.

    -	Open an SNMP session using 'snmp_sess_open()' which returns an
	opaque session handle, which is essentially independent of any
	other sessions (regardless of thread).

    -	Resource locking is not handled within the library, and is the
	responsibility of the main application.

  The Net-SNMP agent has not been designed for multi-threaded use.  It
  should be safe to use the agent library to embed a subagent within a
  threaded application as long as *all* SNMP-related activity (including
  generating traps, and parsing MIBs) is handled within a single thread.

  The command-line tools shipped as part of the Net-SNMP distribution
  are simple single-threaded applications, and are not designed for
  multi-threaded use.  Adapting these to a threaded model is left as
  an exercise for the student.
    The same holds true for the notification receiver (snmptrapd).

  Unfortunately, the SNMPv3 support was added about the same time as
  the thread support and since they occurred in parallel the SNMPv3
  support was never checked for multi-threading correctness.  It is
  most likely that it is not thread-safe at this time.


APPLICATIONS
============

How do I add a MIB?
------------------

  This is actually two separate questions, depending on whether you
  are referring to the tools, or the agent (or both).
    See the next question or the next section respectively.



How do I add a MIB to the tools?
-------------------------------

  Adding a MIB to the client-side tools has two main effects:

    -  it allows you to refer to MIB objects by name
         (rather than having to use the numeric OIDs)
    -  it allows the results to be displayed in a more immediately
       meaningful fashion.  Not just giving the object names, but
       also showing named enumeration values, and interpreting table
       indexes properly (particularly for string and OID index values).
       
  There are two steps required to add a new MIB file to the tools.
  Firstly, copy the MIB file into the appropriate location:

	cp MY-MIB.txt /usr/local/share/snmp/mibs
            (which makes it available to everyone on the system)
    or
        mkdir $HOME/.snmp
        mkdir $HOME/.snmp/mibs
	cp MY-MIB.txt $HOME/.snmp/mibs
            (which makes it available to you only)

  Note that the location of the shared MIB directory may be different
  from that given here - see the FAQ entry "Where should I put my MIB
  files?" for more information.


  Secondly, tell the tools to load this MIB:

        snmpwalk -m +MY-MIB .....
            (load it for this command only)
    or
	export MIBS=+MY-MIB
            (load it for this session only)
    or
        echo "mibs +MY-MIB" >> $HOME/.snmp/snmp.conf
            (load it every time)

  Note that the value for this variable is the name of the MIB
  module, *not* the name of the MIB file.   These are typically the
  same (apart from the .txt suffix), but if in doubt, check the contents
  of the file.  The value to use is the token immediately before the
  word DEFINITIONS at the start of the file.

  Or use the special value "all" to have the tools load all available
  MIBs (which may slow them down, particularly if you have a large
  number of MIB files.

  Note that you need *both* steps.


  Adding a MIB in this way does *not* mean that the agent will
  automatically return values from this MIB.  The agent needs to be
  explicitly extended to support the new MIB objects, which typically
  involves writing new code.
    See the AGENT section for details.

  Most of the tools (apart from 'snmptable') will work quite happily
  without any MIB files at all - although the results won't be displayed
  in quite the same way.  Similarly, the agent doesn't need MIB files
  either (other than to handle MIB object names in the configuration file).



Why can't I see anything from the agent?
---------------------------------------

  Fundamentally, there are two basic reasons why a request may go
  unanswered.  Either the management application does not like the
  request (so never sends it), or the agent does not like the request
  (so never responds).  The simplest way to distinguish between the
  two is to run the command with the command-line option '-d'.

  If this doesn't display a hex dump of the raw outgoing packet, then
  it's the client side which is dropping the request.  Hopefully you
  should also see an error message, to help identify what's wrong.

  If this displays one or more outgoing dumps (but nothing coming back),
  then the request is failing at the agent end.  See the next entry for
  more details.


    There are three further possibilities to consider:

  One is that the agent may return a response to the original query,
  but the management application may not like this response, and refuse
  to display it.  This is relatively unusual, and typically indicates
  a flaw with the remote agent.  (I hope you're not contemplating the
  suggestion that the Net-SNMP command-line tools might contain bugs!)

    The typical symptoms of this would be that the '-d' option would
  display a sequence of sending and received packet dumps, with the
  same contents each time.  Ask on the mailing list for advice.


  Alternatively, the agent may simply not support the MIB objects being
  requested.  This is most commonly seen when using the "snmpwalk" tool
  (particularly with SNMPv1).

  The symptoms here would be that '-d' would show two pairs of raw
  packet dumps - one a GETNEXT request (A1 in the sending packet),
  followed by a GET request (A0).  Repeating the same request with the
  "snmpgetnext" command-line tool should show the information (if any)
  that the agent returned, which was then discarded by snmpwalk as
  irrelevant.

  Note that this is how snmpwalk was designed to work.  It is not an error.


  Finally, it may be that the agent is simply taking too long to respond.
  The easiest way to test for this is to add the command-line options
  "-t 60 -r 0", which will send a single request (with no repetitions)
  and wait for a minute before giving up.  This ought to be long enough
  for all but the most-overloaded agent, or inefficient MIB module!

  If this turns out to be the cause, then ask on the mailing list for
  advice on options for improving the performance.



Why doesn't the agent respond?
-----------------------------

  Assuming that the tests outlined in the previous entry indicate that
  the problem lies with the agent not responding, the obvious question 
  is "why not".

  Again, there are two basic possibilities - either the agent never
  sees the request, or it receives it but is unwilling (or unable) to
  process it.  If the remote system is running the Net-SNMP agent,
  then the easiest way to distinguish between these two cases is to
  shut down the agent, and re-start it manually using the options
              -f -Le -d
  Then send the same query as before.  This should display raw dumps of
  packets seen (or sent) by the agent, just as with the client side in
  the previous entry.


  If the agent does not display anything, then it is simply not receiving
  the requests.  This may be because they are being blocked by network
  or local firewall settings ('iptables -L'),  or the agent may not be
  listening on the expected interfaces ('netstat -a').

  This is most commonly encountered when running queries from a remote
  host, particularly if the same request succeeds when run on the same
  system as the agent itself.


  If the agent displays a dump of the incoming request, but nothing going
  out, then the most likely cause is access control settings.  See the
  relevant entries in the AGENT section for details.  Note that if the agent
  receives an SNMPv1 or SNMPv2c request with a unknown community string,
  then it will not return an error response - the request is simply discarded.

  Another possibility is that the request may be rejected by settings in
  /etc/hosts.{allow,deny}.  Again, '-d' will display an incoming packet
  dump but no corresponding outgoing response.  However in this situation,
  the agent should also log a message that the request is being refused.


  Running the agent with '-d' can also help identify situations where the
  agent *is* responding to the request, but only after a long delay.  This
  would be indicated by a series of incoming packet dumps (showing various
  retries from the client side), followed by several outgoing dumps - possibly
  long after the client tool has given up in disgust.
    See the entry
      The agent worked for a while, then stopped responding.  Why?
  later in this section.



I can see the system group, but nothing else.  Why?
--------------------------------------------------

  This is almost definitely due to the access configuration of the agent.
  Many pre-configured systems (such as most Linux distributions) will only
  allow access to the system group by default, and need to be configured
  to enable more general access.

    The easiest way to test this is to try a GETNEXT request on one of
  the other standard groups
  e.g.
	snmpgetnext  .....  interfaces

  If the agent responds with "hrSystemUptime.0" or "end of MIB", then it
  is clearly configured in this way.  See the entries on access control
  in the AGENT section for more information.



Why can't I see values in the <ENTERPRISE> tree?
-----------------------------------------------

  If you can see most of the standard information (not just the system and
  hrSystem groups), but not in the vendor-specific 'enterprises' tree, then
  once again there are several possible causes.

  Firstly, it's possible that the agent does not implement this particular
  enterprise tree.  Remember that adding a MIB to the client tools does
  *not* automatically add support for these object to the agent.  See the
  AGENT section for more information.


  Alternatively, it may be that the agent does implement some or all of this
  enterprise tree, but the access control settings are configured to block
  access to it.

  The simplest way to checks whether the agent implements a given portion
  of the OID tree is to run

	snmpwalk .... nsModuleName

  and look for index values that fall in the area of interest.
  (Always assuming that you have access to this particular section
  of the Net-SNMP enterprise tree, of course!)
 
  Checking the access control settings can be done by examining the tables
  vacmAccessTable and vacmViewTreeFamilyTable.   Note that these are used
  to configure access control for *all* versions of SNMP - not just SNMPv3.


  The third possibility is that simply isn't any information in the specified
  tree.  For example, several of the tables in the UCDavis enterprise tree
  (such as prTable, extTable, dskTable and fileTable) require explicit
  configuration in the snmpd.conf file.  If you query this particular tables
  without the necessary configuration entries, then they will be empty.


  Finally, if you can't see anything from *any* enterprise-specific tree,
  then this may be down to how you are asking for the information.  By
  default, if "snmpwalk" is run without an explicitly starting OID, then
  it will display the contents of the 'mib-2' tree, containing most of the
  IETF-standard management information supported by the agent.
 
  When the agent reaches the end of this tree, it will return the first
  enterprise-specific value, 'snmpwalk' will recognise that this marks the
  end of the (implicit) requested tree, and stop.  No enterprise-specific
  information will be displayed.

    To walk the whole tree, and see *all* the information that the
  agent supports, specify a starting point of '.iso' or '.1'.
  To walk a specific enterprise subtree, specify the root of this tree
  as the starting point - e.g:

	snmpwalk -v1 -c public localhost UCD-SNMP-MIB::ucdavis
 
  There is more information about particular UCD-specific subtrees in
  the AGENT section.



The agent worked for a while, then stopped responding.  Why?
-----------------------------------------------------------

  There are three basic possibilities:
    - the agent has crashed
    - it is hanging
    - it is temporarily overloaded

  Detecting whether the agent has crashed should be fairly straighforward.
  If you can reliably reproduce this crash (e.g. by sending a particular
  SNMP request), then contact the coders list for advice.
  It's the other two cases that are probably more significant.

  To tell the difference between these two, try leaving the agent
  undisturbed for a while, and then probe it using a single 'snmpget'
  request, specifying a longer timeout (e.g. '-t 120').  If it now
  responds, then something was probably sending requests (including
  duplicate retries) faster than the agent could process them, and it
  was building up a backlog.  Try adjusting the timeout period and retry
  frequency of these client requests, or look at improving the efficiency
  of the implementation of the relevant MIB objects.

  If the agent remains unresponsive (particularly if the load on the
  system is steadily climbing), then it's probably hanging, and all
  you can really do is restart the agent.  If you can identify what
  causes this to happen, then contact the coders list for advice.



Requesting an object fails with "Unknown Object Identifier"  Why?
----------------------------------------------------------------

  If a general snmpwalk shows a particular entry, but asking for it more
  specifically gives a "sub-identifier not found:" or "Unknown Object
  Identifier" error, then that's a problem with the tool, rather than
  the agent.

  Firstly, make sure that you're asking for the object by the right name.
  Object descriptors are case-sensitive, so asking for 'sysuptime' will
  not be recognised, but 'sysUpTime' will.

  Alternatively, the object may be defined in a MIB that hasn't been
  loaded.  Try loading in all the MIB files:

	snmpget -m ALL -v1 -c public localhost sysUpTime.0

  or specify the name of the appropriate MIB explicitly:

	snmpget -v1 -c public myhost SNMPv2-MIB::sysUpTime.0

  Note that this uses the name of the *module*, not the name of the file.
  However, if 'snmpwalk' displays the object by name, this is unlikely to
  be the cause, and you should look closely at the exact object name you
  are using.  In particular, see the next entry.



Why do I get "noSuchName" when asking for "sysUpTime" (or similar)?
------------------------------------------------------------------

  Assuming that you do have access to this object, the most likely cause
  is forgetting the instance subidentifier.

  If you try walking the 'system' group (or any other part of the MIB tree),
  you should notice that all of the results have a number after the object
  name.  This is the "instance subidentifier" of that particular MIB instance.

  For values in tables (such as the sysORTable), this acts as an index into
  the table - a very familiar concept.  But *all* SNMP values will display an
  instance number, whether or not they are part of a table.  For non-table
  objects ("scalars"), this instance subidentifier will always be '0',
  and it *must* be included when making a GET request.

     Compare the following:

	$ snmpget -v1 -c public localhost sysUpTime
	Error in packet
	Reason: (noSuchName) There is no such variable name in this MIB.
	This name doesn't exist: system.sysUpTime

	$ snmpget -v1 -c public localhost sysUpTime.0
	system.sysUpTime.0 = Timeticks: (69189271) 8 days, 0:11:32.71

  This is a little less obscure when using SNMPv2c or v3 requests:

	$ snmpget -v 2c -c public localhost sysUpTime
	system.sysUpTime = No Such Instance currently exists



Why do I sometimes get "End of MIB" when walking a tree, and sometimes not?
--------------------------------------------------------------------------

  This depends on which MIB modules are supported by the agent you are
  querying and exactly what you're asking for.

  Note that a tree is walked by repeatedly asking for "the next entry" until
  all the values under that tree have been retrieved.  However, the agent has
  no idea that this is what's happening - all it sees is a request for "the
  next entry after X".

  If the object X happens to be the last entry in a sub-tree, the agent will
  provide the next object supported (as requested) even though this will be
  in a different subtree.  It's up to the querying tool to recognise that
  this last result lies outside the area of interest, and simply discard it.

  If the object X happens to be the last entry supported by the agent, it
  doesn't have another object to provide, so returns an "end of MIB"
  indication.  The Net-SNMP tools report this with the message above.

  But in either case, the actual information provided will be the same.



How do I use SNMPv3?
-------------------

  The simplest form of SNMPv3 request is unauthenticated and unencrypted
  (noAuthNoPriv).  It simply requires a user name, and would look something
  like:

	snmpget -v 3 -l noAuthNoPriv -u dave localhost sysUpTime.0

  However this approach foregoes the security protection which is the
  main advantage of using SNMPv3 (and the agent must also be explicitly
  configured to allow unauthenticated requests from that user).

  The most common form of SNMPv3 request is authenticated but not encrypted
  (authNoPriv).  This specifies the pass phrase to authenticate with:

	snmpget -v 3 -l authNoPriv -u dave -A "Open the Door"
				localhost sysUpTime.0

  A fully secure (i.e. encrypted) request (authPriv) would also specify
  the privacy pass phrase:

	snmpget -v 3 -l authPriv -u dave -A "Open the Door"
			-X "Bet you can't see me"  localhost sysUpTime.0

  In practise, most of these would probably be set via configuration
  directives in a personal $HOME/.snmp/snmp.conf file (note, *not* the
  agent's snmpd.conf file).
    The equivalent settings for the third example would be:

	defSecurityName		dave
	defSecurityLevel	authPriv
	defAuthPassphrase	"Open the Door"
	defPrivPassphrase	"Bet you can't see me"

  If the AuthPassphrase and the PrivPassphrase are the same, then you
  can use the single setting
		defPassphrase	"Open the Door and see me"
  instead.

  See the AGENT section for how to configure the agent for SNMPv3 access.
 


Why can't I set any variables in the MIB?
----------------------------------------

  There are three possible reasons for this:

  Many MIB objects are defined as "read-only" and inherently cannot be
  changed via SET requests.  Attempts to do so will typically be rejected
  by the 'snmpset' command without ever being sent to the agent.

  Of those objects that can in principle be changed, the agent may not
  include the code necessary to support SET requests.  (GET and GETNEXT
  are much easier to handle - particularly for objects relating to the
  internals of the underlying operating system).

  Even if SET support has been implemented, the agent may not be configured
  to allow write access to this object.

    Ready-installed distributions (such as those shipped with Linux) tend
  to be configured with read-only access to part of the mib tree (typically
  just the system group) and no write access at all.

  To change this, you will need to set up the agent's access control
  configuration.  See the AGENT section for more details.

    Note that neither the community string "public" nor "private" can be
  used to set variables in a typical default configuration.



Variables seem to disappear when I try to set them.  Why?
--------------------------------------------------------

  This is actually the same as the previous question - it just isn't
  particularly obvious, particularly when using SNMPv1.  A typical
  example of this effect would be

	$ snmpget -v1 -c public localhost sysLocation.0
	sysLocation.0 = somewhere nearby

	$ snmpset -v1 -c public localhost sysLocation.0 s "right here"
	Error in packet.
	Reason: (noSuchName) There is no such variable name in this MIB.
	This name doesn't exist: sysLocation.0

  Trying the same request using SNMPv2 or above is somewhat more informative:

	$ snmpset -v 2c -c public localhost sysLocation.0 s "right here"
        Error in packet.
        Reason: notWritable

  The SNMPv1 error 'noSuchName' actually means:

	"You can't do that to this variable"

  rather than "this variable doesn't exist".
  It may be the case that it doesn't exist at all.  It may exist but you
  don't have access to it (although different administrative credentials
  might be accepted).  Or it may exist, but you simply can't perform that
  particular operation (e.g. changing it).
    Similarly, the SNMPv2 error 'notWritable' means "not writable in this
  particular case" rather than "not writable under any circumstances".

  If you are sure that the object is both defined as writable, and has been
  implemented as such, then you probably need to look at the agent access
  control. See the AGENT section for more details.
    But see the next entry first.



Why can't I change sysLocation (or sysContact)?
----------------------------------------------

  There is one final possibility to consider for why a SET request might
  be rejected.

  The values for certain MIB objects (including 'sysLocation' and 'sysContact')
  can be configured via the snmpd.conf file.  If this is done, then these
  particular objects become read-only, and cannot be updated via SET commands,
  even if the access control settings would otherwise allow it.

  This may seem perverse, but there is good reason for it.  If there is a
  configuration setting for one of these objects, then that value will be
  used whenever the agent re-starts.  If the object was allowed to be updated
  using SET, this new value would be forgotten the next time the agent was
  re-started.

  Hence the Net-SNMP agent rejects such requests if there's a value configured
  via the 'snmpd.conf' file.  If there isn't such a config setting, then the
  write request will succeed (assuming suitable access control settings), and
  the new value will be retained the next time the agent restarts.



I get an error when trying to set a negative value - why?
--------------------------------------------------------

    This is a different problem.  What's happening here is that the
  routine that parses the arguments to the 'snmpset' command is seeing
  the '-' of the new value, and treating it as a command-line option.
  This normally generates an error (since digits typically aren't valid
  command line options).

    The easiest way to solve this is include the "end-of-option"
  indicator '--' in the command line, somewhere before the new value
  (but after all of the options, obviously).  For example:

	snmpset -v 2c -c public localhost -- versionRestartAgent.0 i -1

  (This command will still fail, since -1 isn't an acceptable value for
  this particular object, but that's not the point here!)



I get an error when trying to query a string-indexed table value - why?
----------------------------------------------------------------------

  The Net-SNMP library will normally try to interpret string-based
  index values, and display them in a meaningful manner:

      $ snmpgetnext .... vacmGroupName
      vacmGroupName.3."dave" = theWorkers

  The command-line tools will also accept string-valued indexes within
  an OID, and convert them into the appropriate numeric form before
  sending an SNMP request.  However the Unix shell will typically
  swallow the quotes around the string index value, before the SNMP
  tools can get a chance to interpret them.

  The answer is to escape the quotes, to protect them from the shell,
  and allow them to be passed through to the OID parser:

      snmpget ....   vacmGroupName.3.\"dave\"
  or
      snmpget ....  'vacmGroupName.3."dave"'


  Another alternative is to avoid trying to specify the index value as
  a string, and provide the numeric subidentifiers directly:

      snmpget .... vacmGroupName.3.4.100.97.118.101

  (where '3' indicates SNMPv3, '4' is the length of the string index,
  followed by the ASCII values of the individual characters).

  The command-line option '-Ob' will display the results of querying
  a string-indexed table in this format:

      $ snmpgetnext -Ob .... vacmGroupName
      vacmGroupName.3.4.100.97.118.101 = theWorkers



How should I specify string-indexed table values?
------------------------------------------------

  There's one other aspect of string-indexed tables that can cause
  problems - the difference between implicit- and explicit-length
  strings, and how to represent these when making an SNMP query.

  The most common style of string index uses an explicit length,
  followed by the individual ASCII character values:

      "dave"  =  4.'d'.'a'.'v'.'e'

  (as shown in the previous entry).

  However if the string index is defined in the MIB file as IMPLIED
  (or if it has a fixed length, such as a physical ethernet address),
  then the length subidentifier is omitted, and the index simply
  consists of the character values:

      "dave"  =  'd'.'a'.'v'.'e'

  Note that IMPLIED index objects can only appear as the *last* index
  for a table.
 
  The Net-SNMP library uses double quotes (i.e. "dave) to indicate an
  explicit length string index value, and single quotes (i.e. 'dave')
  to indicate an implicit length one.  If you use the wrong style of
  quotes, then the resulting OID will be incorrect, and you'll get
  confusing results to your query.



How do I send traps and notifications?
---------------------------------------

    Traps and notifications can be sent using the command 'snmptrap'.
  The following examples generate the generic trap 'warmStart(1)' and a
  (dummy) enterprise specific trap '99' respectively:

	snmptrap -v 1 -c public localhost "" "" 1 0  ""
	snmptrap -v 1 -c public localhost "" "" 6 99 ""
  
  The empty parameters "" will use suitable defaults for the relevant 
  values (enterprise OID, address of sender and current sysUptime).

    An SNMPv2 or SNMPv3 notification (either trap or inform) takes
  the OID of the trap to send:

	snmptrap -v 2c -c public localhost "" UCD-SNMP-MIB::ucdStart
	snmptrap -v 2c -c public localhost "" .1.3.6.1.4.1.2021.251.1

  (These two are equivalent ways of specifying the same trap).  Again,
  the empty parameter "" will use a suitable default for the relevant
  value (sysUptime).

  Any of these commands can be followed by one or more varbinds,
  using the same (OID/type/value) syntax as for 'snmpset':

	snmptrap -v 2c -c public localhost "" ucdStart sysContact.0 s "Dave"

  Generating traps from within the agent, or other applications, is
  covered in the AGENT and CODING sections.

  You should also read the snmptrap tutorial at
        http://www.net-snmp.org/wiki/index.php/TUT:snmptrap
  which will help you understand everything you need to know about traps.



How do I receive traps and notifications?
----------------------------------------

    Handling incoming traps is the job of a "notification receiver".
  The Net-SNMP suite include the tool 'snmptrapd' to act in this role.
  This can log traps to a file or via the syslog mechanism, forward them
  to another notification receiver and/or invoke a specified command
  whenever a particular notification is received.

  Logging notifications would be done by starting snmptrapd as:
	snmptrapd -Ls 7		(log to syslog using 'LOCAL7')
  or
	snmptrapd -f -Lo        (log to standard output)

  Invoking a command to process a received notification uses one or
  more 'traphandle' directives in the configuration file 'snmptrapd.conf'.
  A typical configuration might look something like:

	traphandle .1.3.6.1.6.3.1.5.1       /path/to/page_me up
	traphandle .1.3.6.1.4.1.2021.251.1  /path/to/page_me up
	traphandle .1.3.6.1.4.1.2021.251.2  /path/to/page_me down
	traphandle default                  /path/to/log_it

  where 'page_me' and 'log_it' are the commands to be run.

  Forwarding notifications to another receiver would be done using
  similar 'snmptrapd.conf' directives:

        forward .1.3.6.1.4.1.8072.4.0.3  10.0.0.1
        forward default                  10.0.0.2

  There's a tutorial with more details on the web site at
        http://www.net-snmp.org/wiki/index.php/TUT:snmptrap



How do I receive SNMPv1 traps?
-----------------------------

  Directives in the 'snmptrapd.conf' file use the (SNMPv2) snmpTrapOID
  value to identify individual notifications.  This applies to *all*
  versions of SNMP - including SNMPv1 traps.  See the co-existence spec
  (RFC 2576) for details of mapping SNMPv1 traps to SNMPv2 OIDs.

  Note that the first traphandle directive in the previous entry uses
  the OID corresponding to the SNMPv1 'coldStart' trap. 



Why don't I receive incoming traps?
----------------------------------

  Starting with net-snmp 5.3, snmptrapd will no longer automatically
  accept all incoming traps. It must be configured with authorized
  SNMPv1/v2c community strings and/or SNMPv3 users. Non-authorized
  traps/informs will be dropped.
    Please refer to the snmptrapd.conf(5) manual page for details.



My traphandler script doesn't work when run like this - why not?
---------------------------------------------------------------

    If a traphandler script works fine when run manually from the
  command line, but fails or generates an error when triggered by
  an incoming notification, then there are two likely causes.

    Firstly, the interactive shell environment may not be precisely
  the same as that for programs executed by the snmptrapd daemon.
  In particular, it's quite possible that the PATH environmental
  variable may not include all the additional directories that are
  commonly set up for a personal login configuration.  To avoid this
  problem (particularly for traphandler shell scripts), it's worth
  giving the full path to all programs used within the script.

    Secondly, the snmptrapd daemon may not always recognise the
  appropriate interpreter to use for a particular trap handler.
  If this is the case, then you can specify this interpreter
  explicitly as part of the trap handle directive:

	traphandle default /usr/bin/perl /usr/local/bin/log_it

    In this case, it's almost certain that you'll also
  need to give the full path to the traphandle script (as shown)



How can the agent receive traps and notifications?
-------------------------------------------------

  It can't.

  The primary purpose of an SNMP agent is to handle requests for
  information from management applications.  In SNMP terminology,
  it acts as a "command responder".

  It may also issue traps to report significant events or conditions
  ("notification generator").  But responding to such notifications
  is a significantly different role, and this is handled by a separate
  application ('snmptrapd').  Note that it is perfectly possible (even
  normal) for both agent and trap receiver to run on the same host.



How big can an SNMP request (or reply) be?
-----------------------------------------

    The protocol definition specifies a "minimum maximum" packet size
  (484 bytes for UDP), which all systems must support, but does not
  attempt to define an upper bound for this maximum size.  This is left
  to each individual implementation.

    The UCD software used a fixed size buffer of 1472 bytes to hold the
  encoded packet, so all requests and responses had to fit within this.
  The Net-SNMP releases handle packet buffers rather differently, and
  are not subject to the same fixed restrictions.



How can I monitor my systems (disk, memory, etc)?
------------------------------------------------

    In general, the Net-SNMP suite consists of relatively low-level
  tools, and there is nothing included that is designed for high-level,
  long-term monitoring of trends in network traffic, disk or memory
  usage, etc.

    There are a number of packages available that are designed for this
  purpose.  Two of the most widely used are MRTG (http://www.mrtg.org/)
  and RRDtool (http://oss.oetiker.ch/rrdtool/).  There are also several
  frontends built on top of RRDtool, including Cacti (http://www.cacti.net/)
  and Cricket (http://cricket.sourceforge.net/).  There are details of
  how to set up Cricket to monitor some of the UCD extensions at
  http://www.afn.org/~jam/software/cricket/

     We have also set up a page that describes in detail how MRTG
  can be set up to monitor disk, memory and cpu activity at
  http://www.net-snmp.org/tutorial-5/mrtg/index.html

    There is also a web-based network configuration system "Net-Policy",
  based upon SNMP.  This is not strictly connected to the Net-SNMP project,
  but a number of the core developers are also involved with that system.
  See http://net-policy.sourceforge.net for more details.



Applications complain about entries in your example 'snmp.conf' file.  Why?
--------------------------------------------------------------------------

  There *is* no example 'snmp.conf' shipped with the standard distribution.
  
  The configuration file 'EXAMPLE.conf' is designed as a config for
  the agent, and should be installed as 'snmpd.conf' (note the 'd').
  The file 'snmp.conf' is intended for general configuration options,
  applicable to all applications (via the SNMP library).
    Rename (or merge) the 'snmp.conf' file to 'snmpd.conf', and this
  should fix the problem.

  See the AGENT section or the 'snmpd.conf(5)' man page for more information
  about what should go in this file.



OK, what should I put in snmp.conf?
----------------------------------

    This is used to set common configuration values for most of the
  applications, to avoid having to specify them every time.  Examples
  are the SNMPv3 settings mentioned above, defaults for which MIBs to
  load and where from (see the second entry in this section),
  and the default SNMP version, port and (if appropriate) community
  string to use.

    Some of these (such as MIB information), might be best put in a
  shared snmp.conf file (typically /usr/local/share/snmp/snmp.conf or
  /etc/snmp/snmp.conf) to apply to all users of the system.  Others
  (particularly the SNMPv3 security settings), are more likely to refer
  to a particular user, and should probably go in a personal snmp.conf
  file (typically $HOME/.snmp/snmp.conf).

    See 'snmpget -H' and/or the snmp.conf(5) man page for more details.

    You can also use the "snmpconf" command to help you generate your
  snmp.conf configuration file (just run it and answer its questions).



How do I specify IPv6 addresses in tools command line arguments?
---------------------------------------------------------------

    IPv6 addresses pose a particular problem for the Net-SNMP command
  line tools, which parse host names into pieces. In particular, normally
  if you specify a simple host name, it assumes you want UDP in IPv4 on
  port 161.   By default, these two commands are actually the same:

            snmpget     127.0.0.1     sysUpTime.0
            snmpget udp:127.0.0.1:161 sysUpTime.0

  However, for IPv6 this causes a problem because IPv6 addresses also use
  a colon to separate addressing parts. Thus you need to enclose the address
  in square brackets ( [ and ] ).
     Because most shells use these brackets too, you also likely need to quote it:

            snmpget 'udp6:[::1]:161' sysUpTime.0



PERL
====

What is the purpose of the Perl SNMP module?
-------------------------------------------

  Short, comprehensive (but ultimately unhelpful) anwer - to provide a
  perl interface for SNMP operations.

  Longer, incomplete (but more useful) answer - there are probably two
  main uses for the Perl SNMP module.  The first is for developing client
  management applications, using perl to send SNMP requests, and manipulating
  or displaying the results.  As such, this is a straight alternative to
  various other SNMP toolkits currently available (for both perl and other
  programming languages).

  The second is as a means for extending the functionality of the Net-SNMP
  agent, by implementing new MIB modules.  This is an alternative to the
  other script-based extension mechanisms, but is more tightly bound to the
  Net-SNMP agent (and hence more efficient), while still avoiding the need
  to write C code.

  It is also possible to use the perl SNMP module in the snmpd.conf file,
  or to process incoming notifications,  but the above are probably the
  two primary uses.



Where can I get the Perl SNMP package?
-------------------------------------

  Joe Marzot's excellent Perl 'SNMP' module, is included in the Net-SNMP
  source releases.  It can be found located in the perl/SNMP subdirectory
  of the source tree.  This is accompanied by a number of Perl modules
  grouped together under the NetSNMP namespace.

  The basic SNMP module (though not the NetSNMP additions), can also
  be found at any Comprehensive Perl Archive Network (CPAN) mirror site,
  under modules/by-module/SNMP.  To find the CPAN site nearest you,
  please see http://www.cpan.org/SITES.html.

  These Perl modules need to be used in conjunction with a compatible
  version of the Net-SNMP library.  Consult the README file in the SNMP
  Perl distribution to find out which version of the library it needs.



How do I install the Perl SNMP modules?
--------------------------------------

  Assuming you have a reasonably new (and properly configured) Perl system,
  this should be simply:

        cd perl
	perl Makefile.PL
	    (press RETURN when prompted for host and community)
	make
	make test
	make install  (probably as root)


  It might be possible to install the basic module using 

	perl -MCPAN -e shell ; "install SNMP"

  but this has not been reliably tested, and very much relies on
  having the correct version of the Net-SNMP library.

  There may also be appropriate pre-compiled versions of the Perl modules
  available from the Net-SNMP project website, or your O/S vendor.



But compiling this fails! Why?
-----------------------------

  The Perl module tends to delve quite deeply into the internals of the
  main Net-SNMP library, and so is quite sensitive to changes within the
  library.  It's important to use the correct version of the module, that
  corresponds to the version of the library you have installed.  If you're
  working with a Net-SNMP source distribution, the appropriate versions of
  the Perl modules are shipped as part of the source code, but you *must*
  have run "make install" on the main Net-SNMP distribution *first*.

  If you're working with a ready-installed version of the library, make
  sure you obtain a compatible version of the Perl module.

    Note that the Perl modules will be compiled using the compiler
  (and compiler settings) used for compiling the original perl binary,
  *not* those used for compiling the Net-SNMP (or UCD) library.
  If these are different (e.g. 'gcc' used for one and 'cc' for the other)
  then this may well cause problems.  It's much safer to use a consistent
  environment for both.  This issue is discussed in greater detail in
  the README.solaris file.

    Also note that the v5 Net-SNMP suite *must* be configured to provide
  shared libraries in order for the Perl modules to work correctly.  This
  is not necessary with the v4 UCD-SNMP libraries.



Compiling the Perl module works OK, but 'make test' fails. Why?
--------------------------------------------------------------

  That's difficult to answer in general.
  Some of the Perl tests are rather picky, so this may simply be
  some minor inconsistency between your precise setup, and the
  expectations of the test environment.

    Check that you are working with the Perl distribution that matches
  the SNMP libraries (use the 'perl/SNMP' in preference to CPAN), and
  that you have installed the main libraries successfully (uninstall
  any old versions if you're having trouble).

    If all this looks OK, and if most of the tests pass, then it's
  probably safe to run 'make install' anyway.   Probably.



Why can't mib2c (or tkmib) locate SNMP.pm?
-----------------------------------------

  That's probably because the SNMP Perl module hasn't been installed.
  It's not part of the standard Perl distribution, nor is it included
  in the default Fedora Linux installation (for example).
  You'll need to install it yourself.

  See the second entry in this section.



Why can't mib2c (or tkmib) load SNMP.so?
---------------------------------------

    This is probably the same problem.  Either the SNMP module
  hasn't been installed, or it's the wrong version.  See the
  previous questions.



Why can't tkmib locate Tk.pm?
----------------------------

  Tk.pm is another Perl package that needs to be installed before tkmib
  will run.  It's also available on Perl CPAN.  We suggest using version
  "Tk800.011" or later.  It can be installed by issuing the command:

		perl -MCPAN -e shell ; "install Tk"



Why does your RPM complain about missing Perl modules?
-----------------------------------------------------

  This has been particularly noted on RedHat 9, complaining about the
  module "perl(Term::ReadKey)" - even if this is actually present (e.g.
  having been installed directly from CPAN).  In fact, this is not
  specific to Perl modules - the same issue can potentially arise with
  other RPM dependencies.

  The problem is that the RPM mechanism keeps a local database of what
  software packages have been installed, and checks this for any other
  features that this RPM requires.  If software is installed "manually"
  rather than via rpm packages, then it will not appear in this database.
  Attempting to install another RPM that rely on this functionality will
  then complain about the "missing" package, because the RPM system doesn't
  know that's it's actually available.

  The ideal solution is to *always* install software using a consistent
  mechanism (which may involve building RPMs locally, or looking for a
  suitable pre-built version).

  Failing this, it's possible to tell the "rpm" command to ignore such
  dependencies, and install the package anyway.  Try:

              rpm -i --nodeps {package}

  In this situation, it's then up to you to make sure that any other
  necessary packages *are* actually present on the system.



I've got a problem with the Net-SNMP module.  Can you help?
----------------------------------------------------------

  Sorry, despite the similar-sounding name, the Net-SNMP (or Net::SNMP)
  module is nothing to do with this package, or the NetSNMP modules.
  Net::SNMP is a "pure-perl" implementation of SNMP support, developed
  by David Town.  The developers of the (C-based) Net-SNMP suite do
  not have any significant experience in using this particular module,
  and you'll probably be better off asking for help via CPAN or some
  other perl-related forum.



MIBS
====

Where can I find a MIB compiler?
-------------------------------

  That depends what you mean by a "MIB compiler".  There are at least two
  types of tool that are commonly referred to by this name.

  The first is a tool to check MIB files for validity.  With the Net-SNMP
  software, this functionality is mostly integrated within the MIB parser,
  and hence included in all the applications.  The tool 'snmptranslate' is
  probably the most appropriate for this purpose.

  Note that the parser is fairly forgiving (see 'What ASN.1 parser is used'
  below), so this should not be regarded as a stamp of approval.  For a
  more rigourous validation, use a tool such as 'smilint', or the on-line
  interface at http://wwwsnmp.cs.utwente.nl/ietf/mibs/validate/

    The second type of "MIB compiler" is one to turn a MIB specification
  into C code, specifically one designed to aid agent implementation.  The
  command 'mib2c' is an example of such a tool for the Net-SNMP agent.  
  See the CODING section for more information.



Why aren't my MIB files being read in?
-------------------------------------

  There are two basic likely causes - either the library isn't attemping to
  load these particular MIB files, or it's trying to load them but can't
  locate them.

  By default, the Net-SNMP library loads a specific subset of MIB files.
  This list is set when the suite is first configured and compiled, and
  basically corresponds to the list of modules that the agent supports.
    (This is a simplification, but is a reasonable first approximation).

  In order to load additional MIB files, it is necessary to add them to this
  default list.  See the FAQ entry "How do I add a MIB to the tools?" for
  more information about how to do this.


  Alternatively, the tools may be looking in the wrong place.  The directory
  where the library looks for MIB files is also set when the software is
  first configured and compiled.  If you put new MIB files in the wrong
  location, then the library won't be able to find them (and will complain).

  This problem may arise when switching from a vendor-supplied distribution
  to one compiled from source (or vice versa).
    See the next entry for more information.



Where should I put my MIB files?
-------------------------------

  If you've compiled the package from source (or are using binaries
  from the project website), then you should probably put new MIB
  files in the directory /usr/local/share/snmp/mibs

  If you are using vendor-supplied binaries, then the MIB files
  may well be located somewhere else (e.g. /usr/share/snmp/mibs,
  /opt/snmp/mibs, or /etc/sma/snmp/mibs).  Have a look for where
  existing MIB files are installed, and try adding your MIBs to
  the same directory.

  If you compiled the source yourself, but specified a different
  --prefix value when running configure, then the location of the
  MIB directory will be {prefix}/share/snmp/mibs.

  If you're still not sure where to put your MIB files, try running
  the command

     snmpget  -Dparse-mibs  2>&1 | grep directory

  This will display the location(s) where the library is looking
  for MIB files.



What does "Cannot find module (XXX-MIB)" mean?
---------------------------------------------

    If this error is only generated for one or two modules, then it's
  likely that the named modules are not being found - perhaps they're
  not installed in the correct location, are not readable, or the
  name being used is incorrect.  See the previous entries and the entry
  "How do I add a MIB to the tools?" for more details.

  Note that the name reported is the name of the MIB *module*, which is
  not necessarily the same as the name of the file.


    If there are a large number of such errors, then it's more likely
  that either the MIB files haven't been installed at all.  If you are
  compiling from source, then it is necessary to run "make install" in
  order to set up the full run-time environment.

  Otherwise, see the previous entry to check whether the MIBs are installed
  in the correct location for the tools to find them.



I'm getting answers, but they're all numbers. Why?
-------------------------------------------------

  This is related to the previous questions.  Remember, the results that
  you receive from an agent do not depend on which MIBs are loaded by the
  client tools - purely on how the agent was compiled and configured.

  Because the tools don't necessarily read in every MIB file they can find
  (and the relevant MIB file may not be available anyway), it is quite
  possible for results from an agent to refer to modules that have not
  been loaded (particularly with GETNEXT requests, or when walking a tree).

  The results will be reported correctly, but won't be translated to use
  named identifiers (or display the values in the most appropriate manner).
  To fix this, add the missing MIB files to the list of MIBs to be loaded.
  See the previous entries and the entry "How do I add a MIB to the tools?"
  for more information.



What does "unlinked OID" mean?
-----------------------------

    This means that the library has been able to find the MIB module,
  and parse the individual objects defined in it, but is having problems
  linking them together into a consistent tree.  In particular, it
  can't find an object corresponding to the name within the braces
  (i.e. the 'xxx' in '{xxx 99}').

    This is probably due either to a typo in this name (remember that
  names are case sensitive, so a reference to 'xxx' will *not* match
  a definition of 'Xxx'), or else the name is defined in another MIB
  file, and this dependency is missing from the IMPORT clause of this
  MIB file.



The parser doesn't handle comments properly. Why not?
----------------------------------------------------

  The way that comments are handled in a MIB file is subtly different
  to the equivalent syntax in most typical programming languages, and
  this difference can catch out the unwary.  In particular, there are
  two common situations which can lead to problems.

  The first scenario is where the MIB designer has attempted to "comment
  out" an unwanted line that already contains a comment:

	--   broken ::= { myMIB 1 }   -- This isn't working yet

  The assumption here is that a comment continues to the end of the line.
  Unfortunately, this is not correct.  A comment will continue either to
  the end of the line, *or* the next occurance of a pair of dashes.

    Thus in this case, the definition of "broken" is commented out (as
  intended) but the following text ("This isn't working yet") is treated
  as an active part of the MIB, and will generate an error.


  The second scenario is where a line of dashes has been used to mark
  out separate parts of a MIB file.  Depending on the exact number of
  dashes used, this may still result in a syntactically valid MIB file,
  but has a 1-in-4 possibility of triggering an error.  This means that
  this particular situation can be particularly difficult to spot!


    Most of the Net-SNMP applications have a command-line option (-Pc) which
  will work around this problem by treating the whole line as a comment.
  But this is not strictly legal, and the offending MIB file should really
  be corrected.



How can I get more information about problems with MIB files?
------------------------------------------------------------

  The command 'snmptranslate' is used to translate between numeric
  and symbolic forms of OIDs.  It uses the same MIB parsing routines
  as the commands that actually communicate with a network management
  agent, but can be used standalone.  As such, it is a useful tool
  for identifying problems with reading in MIB files.

    In particular, the following options may be useful in
  identifying problems:
	-Pw  warns about conflicting symbols
	-PW  prints more verbose warnings about other problems as well
		(in both cases, ignore the 'xmalloc' reports)
	-T   provides sub-options for various views of these entries

  There are other '-P' options to control various aspects of MIB parsing.
  See the 'snmptranslate(1)' and 'snmpcmd(1)' man pages for more details,
  or the tutorial at
	http://www.net-snmp.org/tutorial-5/commands/snmptranslate.html

  For a more rigourous validation, use a tool such as 'smilint', or the
  on-line interface at http://wwwsnmp.cs.utwente.nl/ietf/mibs/validate/



What's this about "too many imported symbols"?
---------------------------------------------

  Any MIB file starts with an (optional) list of identifiers that
  it "imports" from other files.  The parser handles this using
  a fixed size buffer to hold the import information.
    There are two circumstances in which this can result in the
  error message shown above.

    Firstly, if the MIB file refers to an unusually large number
  of external identifiers.  Handling this case requires a (trivial)
  patch to the parsing code.  Contact the coders list for advice.
     (This is extremely rare - the only example that
      we've come across is the Cabletron Trap MIB).

    Much more common is a syntax error in the IMPORTS clause of the
  MIB file in question.  In particular, check that this section ends
  in a semicolon, before going on to the main MIB object definitions.



Do I actually need the MIB files?
--------------------------------

  Probably not.
  The MIB files play two main roles - they are used to translate
  between numeric OIDs and the corresponding textual names, and
  they define the structure and syntax of the relevant MIB objects.

    This second role is perhaps best thought of in terms of a design
  document.  It's vital while developing an application (typically
  the MIB module or handler within the agent), since it defines
  what the application (MIB) must actually do.  But once the code
  has been written, the design document becomes redundent.
  The agent then has the same information hardcoded into it
  (literally!), and no longer needs the MIB file.

    The translation task is not strictly necessary - SNMP will
  operate fine without any MIB files at all, as long as you're
  happy to work with numeric OIDs throughout, and know which MIB
  objects you're interested in.  But it's much easier to work with
  the (hopefully) meaningful names, enumeration tags and the like,
  and to view the description of a particular object.
  This requires having the relevant MIB files installed and loaded.


  Since the agent needs MIBs the least and some systems are memory
  restricted, it is possible to completely disable loading these MIBs
  as well as remove the code that does the parsing by using the
  --disable-mib-loading flag to configure.

  However, note that certain snmpd.conf tokens actually make use
  of mib information so they won't be as easily usable. 



AGENT
=====

What MIBs are supported?
-----------------------

  The following MIBs are supported (at least in part and on some systems):

	- MIB-2  General network statistics
                (RFC 1213 and subsequent revisions)
	- Host Resources (RFC 1514 and 2790)
	- SNMPv3 framework (RFCs 2571-5, 3411-3418)
		(including USM, VACM, Target
		 and Notification MIBs)
	- DisMan Event and Schedule MIBs
	- MTA-MIB (sendmail)
	- private UCD/Net-SNMP agent extensions
		(monitor specified processes and disks,
		 memory, CPU, load average, + extending
		 the agent using shell commands)

  See README.agent-mibs for details.

  Not all MIB modules are included by default on all systems.  Some of
  these may need to be explicitly requested when the software is first
  configured and built, while others may not be available on all
  architectures.

  There are a few other MIB implementations distributed as part of the
  source tarball, but these are basically unsupported and most of the
  core developers have little or no experience with using them.



What protocols are supported?
----------------------------

  The agent supports all three current versions of SNMP (v1, v2c and v3),
  over both UDP and TCP transports, as well as acting as a SMUX (RFC 1227)
  master agent, AgentX (RFC 2741) in both master and subagent roles, and
  SNMP proxying.



How do I configure the agent?
----------------------------

  That's a somewhat ambiguous question, as there are two very different
  stages where it is possible to "configure" the agent.

  Firstly, you can determine what capabilities and defaults are included
  within the library and agent, at the time that the software is first
  built.  This uses suitable flags to the 'configure' script, before
  compiling the source.
    As far as the agent is concerned, the most significant option is
  '--with-mib-modules' (or '--with-out-mib-modules') to control which
  MIBs will be supported by the agent.  See the next few entries for
  details.

    You can also control various aspects of the agent behaviour (and the
  information it returns) at run time, via the 'snmpd.conf' configuration
  file.  Various aspects of this are touched on throughout this FAQ.  Or
  see the snmpd.conf(5) manual page for full details.
    The "snmpconf" script can help in creating this config file.
  Start off with 'snmpconf -g basic_setup' to get you going.



How do I remove a MIB from the agent?
------------------------------------

  Deleting the text file for a MIB does not affect the agent (other than
  to prevent it from recognising MIB object names in the config files).
  It's necessary to tell the agent not to activate the relevant code that
  actually implements these objects.  There are three ways to do this:
                                                                                
    1) re-run 'configure' to exclude the given MIB module(s) from the
       build configuration, then recompile and reinstall:

	  ./configure --with-out-mib-modules=path/to/unwanted   ....
	  make
	  make install

       This specifies the path to the module code file, relative to
       the 'agent/mibgroup' directory.  Clearly, this approach is
       only possible if you are working with a source distribution.
 
    2) disable the MIB at runtime

	  snmpd -I -unwanted

       Note that this relies on knowing which modules are used to
       implement the relevant MIB objects.  If you're not sure,
       you could try walking the 'nsModuleName' MIB object, which
       indicates the module responsible for each particular range
       of OIDs.
       You can also check which MIB modules are loaded by getting
       the agent to report them as they are initialised:

	  snmpd -Dmib_init -H

       From this information, it should then be fairly obvious which
       modules to disable.

    3) use access control to exclude the mib from the view used to
       query the agent:

          view    almostEverything  included   .1
          view    almostEverything  excluded   unwantedMib

          rocommunity  public  default  -V almostEverything

       This approach can also be used with the full com2sec/group/access
       configuration directives (e.g. with versions earlier than 5.3,
       which don't support the above mechanism).



I've installed a new MIB file.  Why can't I query it?
----------------------------------------------------

  Installing a new MIB file will not magically enable the agent to know
  what values to report for the objects defined in that MIB.  It's
  necessary to have some code which can provide the relevant information.
  The next few entries, and the CODING section address this issue in more
  detail.



How do I add a MIB to the agent?
-------------------------------

  Adding a MIB essentially involves writing some code to implement the
  objects defined in the new MIB.  There are three basic approaches that
  can be used to do this:

    -  The agent can invoke an external command or shell script to
       return the necessary information.  There are several possible
       variations on this approach - see the next entry for details.

    -  The agent can pass the request off to another (sub-)agent,
       which already implements the required MIB.  Again, there are
       several ways of doing this - including AgentX, SMUX and
       proxied SNMP.  See the next entry but one for details.

    -  You can write code to implement the new MIB objects, and
       include this within the agent.  This is most commonly C
       (or C++) code, although the agent can also support MIB modules
       implemented in perl.
         See the next section (CODING) for more details.

  Note that there is no visible difference between external commands,
  subagents, and modules implemented within the main agent itself.
  Tools querying the agent will see a single MIB structure.
 


What's the difference between 'exec', 'sh', 'extend' and 'pass'?
---------------------------------------------------------------

  'exec' will run the specified command and return the exit status and
  output.  Any arguments are passed directly to the command, with no
  special interpretation.

  'sh' is similar, but invokes a shell to run the command line given.
  This means that quoted arguments will be recognised as such, and also
  allows redirection, and other similar shell interpretation.  The results
  are returned in exactly the same way.

  'extend' is also similar, but provides a richer and more flexible MIB
  framework - both for configuring the exact command to be run, and for
  displaying the results.

  None of these mechanisms require the command to have any knowledge of
  SNMP, or the fact that they are being used in this manner.  But the
  output is returned in a fixed format, and it is up to the receiving
  application to interpret this appropriately.

  Note that the "relocatable" form of the 'exec' directive ('exec OID ....')
  produces MIB output that is not strictly valid. For this reason, support
  for this has been deprecated in favour of 'extend OID ...', which produces
  well-formed MIB results (as well as providing fuller functionality).
  The most recent releases of the agent don't include support for "relocatable
  exec" by default. This needs to be explicitly included when the agent is
  first compiled, by including the module 'ucd-snmp/extensible' instead of
  'agent/extend'.


  'pass' is a more general mechanism for implementing arbitrary MIB
  objects.  The specified command will be invoked for any request within
  the named MIB subtree, and passed details of the requested OID.  It
  should return the information relevant to the requested OID.

    'pass-persist' is similar, but the command will continue running
  even after the initial request has been answered.  These two mechanisms
  can be used to implement a particular MIB, following the correct MIB
  structure (as opposed to the fixed format of exec/sh/extend).

  All of these mechanisms are described in the 'snmpd.conf(5)' man page,
  in the section entitled "Extending Agent Functionality".

  

What's the difference between AgentX, SMUX and proxied SNMP?
-----------------------------------------------------------

    All three are protocols that can be used to make two or more agents
  appear as one to the querying application.  In each case, one agent
  takes the role of "master", and delegates requests to one of the others
  as and where this is appropriate.  The differences between them mainly
  relate to how data is represented, and the mechanisms for communication
  between master and subagents.

    SMUX and proxy SNMP both essentially use the standard SNMP packet format.
  The main difference is that a proxy SNMP subagent need not be aware that
  it is acting in such a role.  It typically listens on a non-standard port,
  and simply receives requests as usual, forwarded from the master agent
  (rather than directly).  The main issue to be aware of is that such requests
  will appear to come from the local host, and this may affect how the access
  control mechanisms need to be set up.

    SMUX uses a similar packet format, but the subagent "registers" with
  the master agent, providing a suitable password.  The Net-SNMP (and UCD)
  agent includes the possibility of acting as a SMUX master agent, but the
  suite does not include a subagent API.   Note that support for SMUX is not
  included by default, and needs to be explicitly enabled by running:

		--with-mib-modules=smux

  before re-compiling the agent.
    See the file 'agent/mibgroup/README.smux' for details.

    AgentX uses a more compact (and simpler) packet format, with a richer
  range of administrative commands, and provides a more flexible and reliable
  extension mechanism.  The Net-SNMP agent can be used in both master and
  subagent roles, and the agent library can also be used to embed an AgentX
  subagent within another application.
    See the file 'README.agentx' for details.

  AgentX support is included by default, but needs to be explicitly
  activated in the master agent.  Do this by adding the line

		master agentx

  to the snmpd.conf file before starting the agent.



What is the purpose of 'dlmod'?
------------------------------

  Most of the MIB information supplied by the Net-SNMP agent is provided
  by C-coded implementation modules, and the choice of which modules to
  include is usually made when the agent is first built.  Adding new
  MIB modules would therefore require re-compiling the agent.  This is
  not always convenient - particularly when working with a production
  system, and/or pre-installed binaries.
  
  Dynamically loaded modules are a means of including a MIB implementation
  module within the main SNMP agent (or an AgentX subagent) without needing
  to re-compile and re-link the agent binary.  Instead, details of the
  module(s) to load are specified in the configuration file, and the agent
  locates the files listed, and merges them in at run time.

  See http://www.net-snmp.org/tutorial-5/toolkit/dlmod/ for more information.



Which extension mechanism should I use?
--------------------------------------

  That's not easy to answer in general.

  If there's an existing agent that already implements the desired new
  MIB, then it makes sense to re-use that, via whatever extension protocol
  that agent might support.  Note that the SMUX protocol has essentially
  been superceded by AgentX, which provides a fuller and more reliable
  mechanism than either SMUX or proxied SNMP.  So ideally, this would
  be the preferred extension approach.
  But if the target subagent only supports SMUX or basic SNMP, then that
  would dictate the extension protocol to use.

  Implementing the module in C within the main agent (directly or via
  dlmod) is probably the most efficient and reliable, closely followed
  by embedded perl (or python) extensions.  These have the advantage of
  minimal overheads between the code implementing the MIB module, and
  the agent framework, and no inter-process communication issues.  But
  this does assume that there's a suitable mechanism for retrieving the
  necessary information.

  If the new MIB is monitoring or managing some other subsystem, external
  to the agent, then it may be necessary to embed a subagent within the
  subsystem itself - particularly if there's no suitable public API to
  retrieve the necessary information.  In this case, AgentX is probably
  the most appropriate way forward.
    Alternatively, you could implement the missing public management API
  for that subsystem, and develop a module within the main agent instead.



Can I use AgentX when running under Windows?
-------------------------------------------

  Yes, but there are a couple of things to be aware of.

  Firstly, by default the AgentX master listens on the Unix domain
  socket '/var/agentx/master', which doesn't work under Windows.
  You'll need to tell it to listen on a TCP port, either by using
  the command-line option "-x localhost:705",  or by adding the
  directive "agentxSocket localhost:705" to the snmpd.conf file.

  Secondly, be aware that the security of AgentX connectivity is not
  particularly strong.  The examples given here would allow any process
  running on the local machine to register as an AgentX subagent.  The
  more obvious settings "-x 705" or "agentxSocket 705" would allow
  a system *anywhere* on the network (or even from remote networks) to
  register as an AgentX subagent.  This could potentially be used to
  hijack the agent, or provide false information.



How can I run AgentX with a different socket address?
----------------------------------------------------

  There are two sides to an AgentX connection, and they need to
  agree about which socket address to use.  So if you want to use
  a different socket, you need to configure both parties accordingly.

  The socket that the Net-SNMP master agent uses to listen for AgentX
  registrations (and send appropriate requests) can be specified using
  the option '-x'.
    The command
		"snmpd -x tcp:localhost:705 ...."
  would start the agent listening on the TCP port 705 for connections
  from the local system.
    The same effect can also be obtained by adding the line
		agentxsocket localhost:705
  to the file 'snmpd.conf'.

  The same option can be used with the Net-SNMP agent when running in
  This also holds when the Net-SNMP agent is running in
  "subagent" mode, to specify the socket to register with (and receive
  requests from).
    So a subagent might connect to the master agent above (both running
  on the same host), using: 
		"snmpd -X -x tcp:localhost:705 ...."

  A subagent running embedded within some other application will
  typically not understand the same command-line options, so would
  need to set the same configuration programmatically:

     netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
                           NETSNMP_DS_AGENT_X_SOCKET, "tcp:localhost:705");

  With the example subagent code from the Net-SNMP tutorial, this line
  would be added immediately before the 'init_agent' call.

  The same approach can also be used to listen on a different named
  socket, using:
		agentxsocket /tmp/agentx
		agentxperms 770 770 myuser mygroup
  or
		snmpd -x /tmp/agentx ....
  or
     netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
                           NETSNMP_DS_AGENT_X_SOCKET, "/tmp/agentx");
  as appropriate.



How can I turn off SMUX support?
-------------------------------

  Normally, you would use the command-line option '-I -{module}' to
  disable the initialisation of a particular MIB module within the
  agent.  Unfortunately, it's not currently possible to turn off SMUX
  support this way.

  The safest approach is to run
	configure --with-out-mib-modules=smux
  and recompile the agent.

  If this is not possible, an alternative workaround might be to have
  the agent bind the SMUX socket to an invalid IP address, using a
  snmpd.conf line such as:

	smuxsocket  1.0.0.0

  The agent may complain at startup, but it won't accept any incoming
  SMUX requests.

  If the agent complains about not recognising the "smuxsocket"
  token, then you're out of luck.  You'll either have to recompile
  from source, or use local firewall rules to block connections
  to port 199.



How can I combine two copies of the 'mib2' tree from separate subagents?
-----------------------------------------------------------------------

  This is the purpose of the SNMPv3 'context' field.  Register the MIB
  module a second time in a non-default context (see the relevant entry
  in the CODING section for details), and specify this context when
  querying the agent.  The MIB module can use this context information
  to determine which set of information to report.
    Or you could register two completely different handlers for the same
  OID (using different contexts), and the agent will invoke the appropriate
  code.  This holds for both MIB modules implemented within the main agent,
  or AgentX subagents - the same approach will work for both.

  Contexts can also be used with proxied SNMP requests - just specify
  the option '-Cn {context}' as part of the "proxy" entry.  See the
  'snmpd.conf(5)' man page for details.

  It's currently not possible to support parallel MIB trees when using
  SNMPv1 or SNMPv2c.  In principle, it should be possible to use the
  community string in a similar way, but this has not (yet) been implemented.

  This mechanism is only available with the v5 Net-SNMP agent. The v4
  UCD agent does not support contexts at all.  Sorry about that.

    Another way to handle this would be to tweak one of the subagents to
  use a different set of (non-standard) OID assignments - perhaps by
  relocating the whole of the subtree to another (private) OID.  This
  is not ideal, but should work with all configurations.



What traps are sent by the agent?
--------------------------------

  The Net-SNMP agent sends a 'coldStart(0)' trap when it first starts up,
  and an enterprise-specific trap 'nsNotifyShutdown' when it stops.  It
  generates an enterprise-specific trap 'nsNotifyRestart' (rather than
  the standard 'coldStart(0)' or 'warmStart(1)' traps) on receiving a HUP
  signal - typically after being re-configured.  It can also be configured
  to send an 'authenticationFailure(4)' trap when it receives an SNMPv1 
  (or SNMPv2c) request using an unknown community name.

    The agent does not send 'linkUp' or 'linkDown' traps by default. It can
  be configured to do this using the directive 'linkUpDownNotifications'.
  See the 'snmpd.conf(5)' man page (under ACTIVE MONITORING) for details.

    Similarly, it does not generate traps by default when one of the
  monitored characteristics (disk usage, running processes, etc) enters or
  leaves an error state.  This can be configured using the 'defaultMonitors'
  directive (again documented under ACTIVE MONITORING).



Where are these traps sent to?
-----------------------------

  With all these alerts, the agent needs to be told where to send them,
  specifying the type of notification (v1 or v2 trap, or v2 inform) and
  the community name to use.  This uses the snmpd.conf directives 'trapsink',
  'trap2sink' and 'informsink' for the destination type, and 'trapcommunity'
  for the community name.  SNMPv3 destinations can be configured using the
  directive 'trapsess'.   See the 'snmpd.conf(5)' man page for details.

    Note that the type of trap generated is totally determined by these
  directives - irrespective of which API call was used to trigger sending
  the trap.  See the trap-related entries in the CODING section for details.

  Note also that you typically only want *one* of the settings:

        trapsink   localhost
        trap2sink  localhost
        informsink localhost

  Including two (or all three) of these lines in the snmpd.conf file will
  will result in multiple copies of every notifications being sent for
  each call to 'send_easy_trap()' (or 'send_v2trap()').
    This is probably not what was intended!
 


How can I send a particular trap to selected destinations?
----------------------------------------------------------

  This is not currently possible.  All notifications will be sent to
  all configured destinations.  The agent does not (currently) support
  notification filtering.

    There is a preliminary implementation of the snmpNotifyFilterTable
  which is designed to allow this sort of selective trap direction.
  However this is not currently active.  (The tables are present and
  can be manipulated and updated, but the information is not consulted)
  Documentation on how to use this mechanism will appear once the
  functionality is working properly.



When I run the agent it runs and then quits without staying around. Why?
-----------------------------------------------------------------------

  Firstly, are you certain that this is what is happening?

  The normal operation of the agent is to 'fork' itself into the background,
  detaching itself from the controlling terminal so that it will continue
  running even when you log out, and freeing the command line for subsequent
  use.  This looks at first sight as if the agent has died, but using 'ps'
  to show all processes should reveal that the agent is still running.

  To prevent this behaviour (such as when attempting to debug the agent),
  you can start it with the '-f' flag.  This suppresses the fork, and the
  agent will run as a 'normal' command.  It's also often useful to use the
  '-Le' (or '-L') flag, to log messages to stderr.

  On the other hand, if 'ps' shows that the agent is not running, then
  this is an error, and probably show that something went wrong in
  starting the agent up.  Check the agent log file for any error messages,
  or run it with '-f -Le' and see what it reports.

  One possible cause might be an existing agent (or some other process)
  that's already listening on the SNMP port.  Trying to start a second
  agent will fail with an error about "opening the specified endpoint".

  If you're starting the agent as a non-root user, then this may also
  fail with the very same error.  By default, the agent (and trap handler)
  will attempt to listen on the standard SNMP port 161 (or 162 for the
  trap handler).  These are defined as "privileged ports", and processes
  will need to be running as root in order to open them.

  One way to tackle this is to start the agent as root, but use the -u
  option to switch to run as another user once the port has been opened.
  Alternatively, you can specify a different port to use instead.
  Anything greater than 1024 is available to non-root users.  In this case,
  you'll also need to specify the same port when issuing client commands.



After a while the agent stops responding, and starts eating CPU time.  Why?
--------------------------------------------------------------------------

  This is basically the same problem described in the APPLICATIONS
  section, in the entry
   The agent worked for a while, then stopped responding.  Why?

  See that entry for details.



How can I stop other people getting at my agent?
-----------------------------------------------

  Firstly, are you concerned with read access or write access?

  As far as changing things on the agent is concerned, there is relatively
  little that can actually be altered (see the entry "Why can't I set
  any variables in the MIB?" above).

    If you are using the example config file, this is set up to allow
  read access from your local network, and write access only from the
  system itself (accessed as 'localhost'), both using the community name
  specified.  You will need to set appropriate values for both NETWORK
  and COMMUNITY in this file before using it.
    This mechanism can also be used to control access much more precisely.
  (see the next few questions for details)

  Other options include:
	- Blocking access to port 161 from outside your organisation
		(using filters on network routers)
	- Using kernel-level network filtering on the system itself
		(such as IPTables)
	- Configuring TCP wrapper support ("--with-libwrap")
		This uses the TCP 'libwrap' library (available separately)
		to allow/deny access via /etc/hosts.{allow,deny}

  For strict security you should use only SNMPv3, which is the secure
  form of the protocol.  However, note that the agent access control
  mechanisms does not restrict SNMPv3 traffic by location - an SNMPv3
  request will be accepted or rejected based purely on the user
  authentication, irrespective of where it originated.  Source-based
  restrictions on SNMPv3 requests would need to use one of the "external"
  mechanisms listed above.



How can I listen on just one particular interface?
-------------------------------------------------

    Normally, the agent will bind to the specified port on all interfaces
  on the system, and accept requests received from any of them.  However,
  if a particular port (or ports) is specified when the agent is first
  started, then it will only listen for requests on these particular
  ports.
     For example:
			snmpd 127.0.0.1:161

  would listen (on the standard port) on the loopback interface only, and:

			snmpd 10.0.0.1:6161

  would listen on port 6161, on the (internal network) interface with
  address 10.0.0.1.   To listen on both of these interfaces (and no others)
  provide a list of all the desired addresses:

			snmpd 127.0.0.1:161 127.0.0.1:6161

  The AgentX port option ('-x') works in much the same way.



The agent is complaining about 'snmpd.conf'.  Where is this?
-----------------------------------------------------------

  It doesn't exist in the distribution as shipped.  You need to
  create it to reflect your local requirement.
    To get started, you can either just create this file manually,
  or run snmpconf to help you create one.  At the very least, you
  will need some form of access control configuration, if the agent
  is to be of any use whatsoever.  This can be as simple as:

       rocommunity public

    See the snmpd.conf(5) manual page or relevant entries in this
  FAQ for further details.



Why does the agent complain about 'no access control information'?
-----------------------------------------------------------------

  Although an SNMP agent may support a wide range of management
  information, it is not necessarily appropriate to report the whole
  of this to every SNMP management station who asks for it.  Some
  information may be sensitive, and should restricted to authorized
  administrators only.   SNMP therefore includes mechanisms for
  controlling who has access to what information - both in terms of
  what can be seen, and (even more importantly) what can be changed.

  By default, the Net-SNMP agent starts up with a completely empty
  access control configuration.  This means that *no* SNMP request
  would be successful.  It is necessary to explicitly configure
  suitable access control settings, based on who should be granted
  access in that particular environment.

  If there are no access control entries configured (perhaps because
  no snmpd.conf configuration file has been loaded, or it contains no
  access control settings), then the agent will not respond to any
  SNMP requests whatsoever.  This is almost certainly not what was
  intended, so the agent reports this situation.

  See the next entry for how to configure access control settings.



How do I configure access control?
---------------------------------

    The simplest way is to use the configure directives:

		rocommunity public	(for SNMPv1/2c)
		rwcommunity private
  or
		rouser user1		(for SNMPv3)
		rwuser user2

  These specify the community names or security names to accept for
  read-only and read-write access to the whole of the supported MIB tree.
  (Obviously you should change these names to match your requirements -
  which is a particularly good idea in the case of 'rwcommunity'!)

  Note that you should *not* specify the same community name for both
  rocommunity and rwcommunity directives.  The rwcommunity setting
  automatically provides read access, and having both lines (with the
  same community name) may result in unexpected behaviour.
  Only use both settings when specifying *different* community names.
    The same holds true for rouser and rwuser.

  The two community directives can be restricted to only allow requests
  from particular sources, and all four can be restricted to a particular
  subtrees or (from v5.3) a named view.  See 'snmpd.conf(5)' for details.



How do I configure SNMPv3 users?
-------------------------------

  There are three ways to configure SNMPv3 users:

  1) Stop the agent, and add the line

	createUser {myUser} MD5 {myPassword} DES

    to the file /var/net-snmp/snmpd.conf (where {myUser} and
    {myPassword} are the appropriate values for username and password,
    _without_ the braces!).  Then re-start the snmpd agent.

  2) Stop the agent, run the command

        net-snmp-config --create-snmpv3-user

     and follow the prompts given.  This will create an entry
     in the /var/net-snmp/snmpd.conf file similar to the above.
     Then re-start the snmpd agent.

  3) Make sure the agent is running, and will respond to an SNMPv3
     request (using an existing user with the desired authentication
     and privacy protocols).  Then use the 'snmpusm' command to clone
     this template user, and change the password.


  See the access control entries above and the file 'README.snmpv3'
  for more details about how to use SNMPv3 users,

  Note that simply having a 'rouser' or 'rwuser' line does *not*
  automatically create the corresponding SNMPv3 user.  You will need
  the above 'createUser' line (or an equivalent 'usmUser') as well.



The 'createUser' line disappears when I start the agent.  Why?
-------------------------------------------------------------

  This is deliberate.

  The agent removes the (human-readable) 'createUser' directive, and
  replaces it with an equivalent 'usmUser' entry.  This contains the
  same information, but in a form that's only meaningful internally.
  Not only is the passphrase no longer visible in the config file, it
  has actually been converted to a key that is only valid on this
  particular system.  If someone stole the configuration file, they
  could not use the information from the usmUser entry to access any
  of your other agents (even if the usernames and passwords were the same).



What's the difference between /var/net-snmp and /usr/local/share/snmp?
---------------------------------------------------------------------

    The /var/net-snmp location is primarily used for information set
  during the running of the agent, which needs to be persistent between
  one run of the agent and the next.   Apart from "createUser" (see
  the previous entry), you shouldn't need to touch this file.

  All other user-provided configuration should go in the traditional
  location (typically /usr/local/share/snmp/snmpd.conf or /etc/snmp).



My new agent is ignoring the old snmpd.conf file. Why?
-----------------------------------------------------

    The most likely explanation is that the new version of the agent is
  looking in a different location than the previous one.  This is commonly
  experienced when replacing a ready-installed version (e.g. from a vendor
  distribution), with the current release installed from the source.

  Try moving the old config file to the new location, and restart the agent.
  If you're not sure where this should go, see the next entry.



Where should the snmpd.conf file go?
-----------------------------------

    The default location for this file with the basic distribution is
  /usr/local/share/snmp/snmpd.conf (or PREFIX/share/snmp/snmpd.conf).
  Ready-installed versions often look for the file as /etc/snmpd.conf,
  or /etc/snmp/snmpd.conf.

  If you are still not sure, try running the command

      snmpd -f -Le -Dread_config 2>&1 | grep "config path"

  The first line of output will display the list of locations where
  the agent is looking for configuration information.



Why am I getting "Connection refused"?
-------------------------------------

    This is actually nothing to do with the access control mechanism
  (though that's an understandable mistake).  This is the result of
  the TCP wrapper mechanism using the files 'hosts.allow' and 'hosts.deny'
  to control access to the service.  Some distributions may come with
  this enabled automatically - otherwise you need to explicitly activate
  this by running
         configure --with-libwrap
  and recompiling the agent.

  If TCP wrappers are enabled, and both hosts.allow and hosts.deny are
  empty, then all requests will be rejected (with "Connection refused").
  The simplest way to avoid this problem and allow incoming requests is
  to add the line

		snmpd: ALL

  to the file /etc/hosts.allow.  Be aware that doing this removes one
  level of protection and allows anyone to try and query your agent.
  The agent's own access control mechanisms can still be used to restrict
  what - if anything - they can see.

  If you do wish to use the TCP wrappers to restrict access, it's sensible
  to have an explicit entry:

		snmpd: ALL

  in the file /etc/hosts.deny, which makes it crystal clear that access
  to the SNMP agent has been denied.  This mechanism can also be used to
  restrict access to specific management hosts, using a hosts.deny entry
  such as:

		snmpd: ALL EXCEPT 127.

  which will allow connections from localhost, and nothing else.

  Note that personal firewalls, such as the Linux iptables mechanism,
  may have a similar effect (though typically this won't be logged).
  See the earlier entry
    Requests always seem to timeout, and don't give me anything back.  Why?


 
Why can't I see values in the UCDavis 'proc' or 'disk' trees?
------------------------------------------------------------------

  Both these trees are designed to report precisely those things that
  have been explicitly configured for monitoring.  If there are no
  relevant configuration entries in the snmpd.conf file, then these
  tables will be empty.  See the snmpd.conf manual page and the
  EXAMPLE.conf file for details on configuring the agent.

  Optionally, run snmpconf -g monitoring to help you set up this
  section of the snmpd.conf file.



Why can't I see values in the UCDavis 'memory' or 'vmstat' trees?
----------------------------------------------------------------

  These trees do not need any explicit configuration, and should
  be present automatically.

  However the C code necessary to implement these particular MIB
  modules are not supported on all operating systems.  These trees
  will be omitted on any system for which there is no underlying
  code.   Currently, they are only supported on Linux, HP-UX (memory
  only), Solaris, BSDi (vmstat on BSDi4 only), Dynix, FreeBSD, NetBSD
  and OpenBSD.
    If you want to help port it to other systems, let us know.

  Note that these subtrees only report the current usage when
  explicitly queried.  They do *not* automatically generate traps
  when the usage strays outside the configured bounds.
  See the earlier FAQ entry
    What traps are sent by the agent?
  or the snmpd.conf section on active monitoring, for more information.



What do the CPU statistics mean - is this the load average?
----------------------------------------------------------

  No.  Unfortunately, the original definition of the various CPU
  statistics was a little vague.  It referred to a "percentage",
  without specifying what period this should be calculated over.
  It was therefore implemented slightly differently on different
  architectures.

  The 5.4 release has clarified the situation, and standardised on
  calculating these percentages over a minute.  The relevant MIB
  descriptions have been updated to make the desired behaviour
  more explicit.

  The Net-SNMP agent also includes "raw counters", which can be used
  to calculate the percentage usage over any desired period.  This is
  the "right" way to handle things in the SNMP model.  The original
  percentage objects have been deprecated, and may possibly be removed
  in a future release of the agent.

    Note that this is different from the Unix load average, which is
  available via the loadTable, and is supported on all architectures.



How do I get percentage CPU utilization using ssCpuRawIdle?
-----------------------------------------------------------

  This one of the "raw counters" mentioned in the previous entry.
  You need to take two readings of this object and look at the
  difference between them.  That difference divided by the total
  number of 'ticks' between the two readings (where one tick is
  probably 0.01 seconds) will give you the percentage utilization
  over that period.



What about multi-processor systems?
----------------------------------

  The CPU objects (both percentages and raw counters) were designed to
  monitor the overall CPU activity of a system, and typically reflect
  whatever the underlying operating system reports for the (single)
  CPU statistics information.  How these are handled for a multi-CPU
  system will differ from one O/S to another, and will need
  to be investigated for each system individually.

  The htProcessorTable was designed to handle monitoring multi-CPU
  machines, but the Net-SNMP implementation has up to now treated
  most systems (with the honourable exception of Solaris, and more
  recently Linux) as implicitly single-CPU.

  With the 5.4 release, there is now a cleaner framework for reporting
  on multi-CPU equipment, and it is hoped that an increasing number
  of systems will be able to report suitable processor information.
  Also with the 5.4 release, for the first time the agent will report
  the hrProcessorLoad value properly, which should provide some simple
  per-CPU statistics.



The speed/type of my network interfaces is wrong - how can I fix it?
-------------------------------------------------------------------

    Some operating systems will provide a mechanism for determining
  the speed and type of network interfaces, but many do not.  In such
  cases, the agent attempts to guess the most appropriate values,
  usually based on the name of the interface.

  The snmpd.conf directive "interface" allows you to override these
  guessed values, and provide alternative values for the name, type
  and speed of a particular interface.  This is particularly useful
  for fast-ethernet, or dial-up interfaces, where the speed cannot be
  guessed from the name.

    See the snmpd.conf(5) man page for details.
  


The interface statistics for my subinterfaces are all zero - why?
----------------------------------------------------------------

    Unfortunately, most kernels that support multiple logical
  interfaces on a single physical interface, don't keep separate
  statistics for each of these.  They simply report the overall
  statistics for the physical interface itself.

    There's no easy way around this problem - the agent can only
  report such information as is available.  If the kernel doesn't
  keep track of these figures, the agent can't report them.

    Sorry!



Does the agent support the RMON-MIB?
-----------------------------------

    Not really.

    There is an "Rmon" code module included within the agent source
  code tree, but this is best thought of as a template for the
  RMON-MIB statistics groups, rather than a full implementation.

    With most MIBs, the hardest part of implementing the MIB is often
  getting hold of the data to report.  This is definitely true of the
  RMON-MIB, which relies on gathering (and analysing) a potentially
  large quantity of network traffic.   The Rmon code distributed with
  the Net-SNMP agent code avoids this problem, by using random data.

    Some of the functionality of the RMON-MIB, such as the alarm and
  event groups, has since been superseded by the work of the DisMan
  IETF working group.  The Net-SNMP agent does implement these (more
  general) MIB modules.  But the statistics gathering aspects of
  the RMON-MIB are not readily available.

    Note too that none of the core developers have any significant
  experience with this code, and the person who originally wrote it
  is no longer active on the mailing lists.  So there's no point in
  asking on the lists whether these modules work or not.  You've got
  the source - how badly do you need this functionality?



What does "klread:  bad address" mean?
-------------------------------------

  This means that the agent was unable to extract some of the
  necessary information from the kernel structures.  This is
  possibly due to:
	- either looking in the wrong place for kernel information
		(check the value of KERNEL_LOC)
	- an error in the implementation of part of the MIB tree
		for that architecture.  Try and identify which
		OID is generating the error, and contact the
		list 'net-snmp-coders@lists.sourceforge.net'
		Remember to tell us what architecture you have!



What does "nlist err:  wombat not found" (or similar) mean?
----------------------------------------------------------

  This means that the agent wasn't able to locate one of the
  kernel structures it was looking for.  This may or may not
  be important - some systems provide alternative mechanisms
  for obtaining the necessary information - Solaris, for example,
  can produce a whole slew of such messages, but still provide
  the correct information.
    This error only occurs if you have used the flag
  '--enable-debugging' as part of the initial configuration.
  Reconfigure the agent with '--disable-debugging' and these
  messages will disappear.  (It won't fix the underlying problem,
  but at least you won't be nagged about it).



What does "Can't open /dev/kmem" mean?
-------------------------------------

  This device is normally restricted to just being accessible by root
  (or possibly by a special group such as 'kmem' or 'sys').  The agent
  must be able to read this device to obtain the necessary information
  about the running system.
    Check that the agent was started by root, and is running with UID 0
  (or suitable GID if appropriate).  The agent will normally continue
  to run without this level of access permission, but won't be able to
  report values for many of the variables (particularly those relating
  to network statistics).

 

The system uptime (sysUpTime) returned is wrong!
-----------------------------------------------

  Oh no it's not.
  The defined meaning of 'sysUpTime' is
	"the time ... since the *network management*
	 portion of the system was re-initialized."

  In other words, when the snmp agent was started, not when the
  system itself last booted.  This latter information is available
  in the Host Resources MIB as "hrSystemUpTime.0"
  Note that even if the full Host Resources is not supported on
  your system, it's worth configuring in the system portion using

		'--with-mib-modules=host/hr_system'

  and recompiling.  This particular group is reasonably likely to work,
  even if some of the other more architecture-specific groups don't.



Can the agent run multi-threaded?
--------------------------------

  Short answer - no.
  Longer answer - not easily.

  Net-SNMP within a single thread of an threaded application is fine,
  as long as *all* snmp code is kept within the same thread. This lets
  you add SNMP support to an existing threaded application.

  If you are concerned with the time taken for to process requests for
  a particular agent, object or subtree, and you want the agent to
  continue to respond to other requests in the meantime, there are
  two options.

  The first method is using AgentX sub-agents. If you have several
  tables, each implemented by a separate subagent, then a single
  request for entries from each of the tables will be processed
  in parallel (and the agent will continue to respond to other
  requests while it waits for the subagents to return the necessary
  information).  But a request for several objects from the same
  table will be passed off to the relevant subagent, where it will
  (normally) be processed serially.

  The second method is to use delegated requests + IPC to another
  process.  If takes a long time to retrieve a value for a given object,
  then the object handler could do whatever necessary to start or
  communicate with another (non-SNMP) process/thread to actually
  retrieve the value, and mark the request as delegated.
    The main agent (or subagent) can then receive and process other
  requests while waiting for the delegated request to finish.
  Dealing with resource contention is all up to you.

  All of this only applies to the GET family of requests.  A SET
  request will block until all pending GET requests have finished,
  and then will not accept new requests until the SET is complete.

  Adding full multi-thread support directly to the agent would be
  nice.  We just need someone with time/money to do/sponsor the work.



Can I use AgentX (or an embedded SNMP agent) in a threaded application?
-----------------------------------------------------------------------

  With care.

  As mentioned in the earlier "thread-safe" FAQ entry, the Net-SNMP
  agent (including the AgentX subagent) has not been designed for
  threaded operation.  In particular, it makes use of various global
  variables without attempting to protect them against simultaneous
  use.  This means that it is *NOT* safe to have SNMP or AgentX
  related processing in two separate threads.  This also applies to
  handling GET (and SET) processing in one thread, and generating traps
  in another.  This is still vulnerable to the usual threading problems.

    However, as long as *all* of the SNMP-related activity is limited
  to the one thread, then there should be no reason why this cannot
  safely communicate with other threads within the same application,
  using private (thread-safe) mechanisms.

    But in terms of the Net-SNMP-provided code, the agent (and AgentX
  subagent) should *not* be regarded as thread-safe.



COMPILING
=========

How do I control the environment used to compile the software?
-------------------------------------------------------------

  The basic mechanism for compiling the Net-SNMP project software is to
  run "configure", followed by "make" (to compile it), "make test" (to
  check that it's working properly) and then "make install" (to install
  the files into the correct locations - which typicalyl needs to be done
  as root.

  The primary role of "configure" is to determines various aspects about
  the system that the software is being compiled on.  However there are
  also a number of options to configure which can be used to control
  various aspects of the compilation environment.

  The most common options are "--with-mib-modules" and "--with-out-mib-modules"
  which control the set of MIB module code files that are included within
  the agent binary.  Adding or removing these modules will affect what MIB
  information the agent can return.
     See the entry "How do I add a MIB to the agent?" for more details.

  
  The configure script can also specify the compiler to use for compiling
  the source code  (e.g. "configure --with-cc=cc"), the flags passed to
  this compiler (e.g. "configure --with-cflags=-g"), or to the linker
  (e.g. "configure --with-ldflags=-Bstatic"), and various other aspects of
  the build environment.
     Run "configure --help" for a full list.
 


How do I control the environment used to compile the software under Windows?
---------------------------------------------------------------------------

  If you are compiling the project within the MinGW or Cygwin environments,
  then these use the same "configure" mechanism as Unix-based systems.  See
  the previous entry for more information.

  If you are compiling the project from within Visual Studio, then this does
  not use the standard configure mechanism.  Instead, there is a separate
  "Configure" script within the 'win32' directory.  This can be used enable
  or disable various aspects of the build environment, such as support for
  encryption or IPv6.
    Run "Configure --help" for more information

  Note that this script does not include an equivalent of "--with-mib-modules"
  for extending the MIB information supported by the agent.  Instead, this
  needs to be done by tweaking the build environment manually.  See the file
  README.win32 for more details of this, and various other aspects of building
  the project on Windows systems.



Why does the compilation complain about missing libraries?
---------------------------------------------------------

  This has been seen in a number of guises over the years - most commonly
  on Linux systems (although the problem may also occur elsewhere).  The
  underlying problem is that typical installation may not always include
  the full set of library links required for building the Net-SNMP software.

  This problem can usually be fixed by installing the missing packages
  (typically the development version of a package that is already there).

  Examples of this that we have come across include:

     -lelf       elfutils-devel      (later renamed to elfutils-libelf-devel)
     -lbz2       bzip2-devel
     -lselinux   libselinux-devel
     -lcrypto    openssl/openssl-devel
     -lbeecrypt  libbeecrypt/beecrypt/beecrypt-devel.

  These are the names of the RedHat/Fedora RPMs.  Other distributions
  or O/S's may use different names, but the basic idea should be the
  same.

  If the compilation is complaining about a missing .so file, then an
  alternative quick fix is to add the missing symbolic link, using
  something like:
          ln -s libelf.so.1 /usr/lib/libelf.so

  giving the appropriate generic library name from the error message,
  and the correct number for whichever version of this library you
  have installed.

  If the compilation is complaining about a .la file, then you should
  install the relevant development package, as listed above.



How can I reduce the memory footprint?
--------------------------------------

  In order to reduce the memory footprint (for instance, to
  embed the snmpd into a device), the following configure options
  could be used.

  '--disable-debugging'
     This turns off the compilation of all debugging statements.

  '--enable-mini-agent' '--with-out-mib-modules=examples/ucdDemoPublic'
     This creates an agent with just the essential MIB modules included.
     NOTE: If you need additional MIB modules, then simply add them
     using the option '--with-mib-modules=...' but this will of course
     increase the memory footprint.

  '--with-transports=UDP'
     This option specifies the transport domains to include.
     For a simple standalone agent, just UDP should be sufficient.
     (Although the 'disman' and 'agentx' modules may require the
      Callback, TCP and/or Unix transport domains as well).

   '--without-kmem-usage'
     This can be used in order to omit the code that operates on the
     /dev/kmem interface. Clearly, this option cannot be used when
     one of the configured MIB modules depends on it.

   '--with-mibdirs=' and '--with-mibs='
     These options tell the agent not to load any MIB modules. 
     This doesn't affect the size of libraries or application
     binaries, but will reduce the memory footprint during runtime.

   '--disable-mib-loading'
     This can be used in order to omit the code that loads and
     parses the MIB files altogether.  This will reduce both the
     runtime memory footprint, and the binary sizes.

  Once the agent (snmpd) has been linked, you might also try running
  'strip snmpd' to remove un-necessary debug/symbol information.



How can I reduce the installation footprint or speed up compilation?
-------------------------------------------------------------------

  The following configure options may also be useful:
                                                                                
  --disable-agent                 Do not build the agent (snmpd).
  --disable-applications          Do not build the apps (snmpget, ...).
  --disable-manuals               Do not install the manuals.
  --disable-scripts               Do not install the scripts (mib2c, ...).
  --disable-mibs                  Do not install the mib files.
  --disable-mib-loading           Do not include code that parses and
                                  manipulates the mib files.



How can I compile the project for use on an embedded system?
-----------------------------------------------------------

  Although this is definitely a Frequently Asked Question on the project
  mailing lists, it hasn't really been a Frequently _Answered_ Question.
  The basic problem is that none of the core development team have much
  involvement or experience with embedded systems.  And although we have
  repeatedly put out a plea for implementation reports and advice, this
  has not so far been particularly successful.  So the first thing to say
  is that the following suggestions should be treated with a greater than
  usual level of suspicion.

  The second thing to say is that compiling the Net-SNMP project for use
  on an embedded system typically means compiling the *agent* (rather than
  the trap receiver, or command-line tools).  So that is what this entry
  will concentrate on.

  There are three main aspects to consider:
     - how to compile the code,
     - *what* code to compile, and
     - how to install the resulting agent binary.

  The Net-SNMP project uses the standard "configure" mechanism, so the
  usual cross-compilation options are available - in particular "--host"
  and "--target".  It is also possible to specify the compiler and linker
  to use ("--with-cc" and "--with-ld"), and any special flags to pass
  to them ("--with-cflags" and "--with-ldflags").   There shouldn't be
  anything particularly special about compiling the Net-SNMP code, so
  see the documentation for your target environment for more information.
  (And please let us know if there *is* anything special that should be
  mentioned here!)

  If the aim is simply to generate an SNMP agent to run on the target
  system, it's probably not necessary to compile the command-line tools
  or trap receiver.  The configure option "--disable-applications" will
  omit these elements.  See the previous entry for other potentially
  relevant useful options.

  Unfortunately, the SNMP agent (and in particular, the code for individual
  MIB modules) is the most system-specific part of the Net-SNMP software.
  It may prove necessary to disable particular MIB modules if they do not
  compile successfully, or attempt to use the wrong system-specific APIs.
  This can be done using the configure option "--with-out-mib-modules".
  Alternatively, the option "--enable-mini-agent" will omit all but the
  core MIB module code.  Additional modules can then be added individually
  using "--with-mib-modules".

  Further information about how to deal with problems with individual MIB
  modules is reliant on suitable reports being forthcoming from the wider
  Net-SNMP community.  The ball is in your court!

  Finally, installing the agent binary is _not_ simply a matter of copying
  the "snmpd" file onto the target system.  The agent typically relies on
  a number of additional libraries (and possibly the presence of assorted
  MIB files, unless this has been explicitly omitted).  It is normally
  necessary to run "make install", before copying the installed framework
  to the target system.

  If the install destination needs to be different to the eventual location
  on the target system, this can be handled using the configure options
  "--prefix" (for the target location) and "--with-install-prefix" (for the
  temporary install location).  Alternatively, this can be handled as part
  of the install command:
       make install prefix={target location} INSTALL_PREFIX={temp location}

  Alternatively, if the agent is compiled with static linking (and no MIB
  files), then it may be possible to simply copy the agent binary across to
  the target system.  See the next entry for details.


  
How can I compile the project to use static linking?
---------------------------------------------------

  For totally static net-snmp executables, use
	configure --with-ldflags=-Bstatic

  To compile your application with static libraries (eg for easier
  debugging), and to link to a non-installed build directory, try the
  following Makefile fragment:
                                                                                
     NETSNMPDIR=/usr/local/build/snmp/full-clean-cvs-V5-1-patches
     NETSNMPCONFIG=$(NETSNMPDIR)/net-snmp-config

     NETSNMPBASECFLAGS := $(shell $(NETSNMPCONFIG) --base-cflags)
     NETSNMPINCLUDES := $(shell $(NETSNMPCONFIG) --build-includes $(NETSNMPDIR))
     # base flags after build/src include, in case it has /usr/local/include
     NETSNMPCFLAGS=$(NETSNMPINCLUDES) $(NETSNMPBASECFLAGS)

     NETSNMPBASELIBS := $(shell $(NETSNMPCONFIG) --base-agent-libs)
     NETSNMPEXTLIBS := $(shell $(NETSNMPCONFIG) --external-agent-libs)
     NETSNMPLIBDIRS := $(shell $(NETSNMPCONFIG) --build-lib-dirs $(NETSNMPDIR))
     NETSNMPLIBDEPS := $(shell $(NETSNMPCONFIG) --build-lib-deps $(NETSNMPDIR))
     LIB_DEPS=$(NETSNMPLIBDEPS)
     LIBS=$(NETSNMPLIBDIRS) -Wl,-Bstatic $(NETSNMPBASELIBS) -Wl,-Bdynamic $(NETSNMPEXTLIBS)

     STRICT_FLAGS = -Wall -Wstrict-prototypes
     CFLAGS=-I. $(NETSNMPCFLAGS) $(STRICT_FLAGS)
                                                                                
  This replaces the standard Makefile section, which will used installed
  libraries:
                                                                                
     NETSNMPCONFIG=net-snmp-config
                                                                                
     # uncomment this if you have GNU make
     #NETSNMPCFLAGS := $(shell $(NETSNMPCONFIG) --base-cflags)
     #NETSNMPLIBS := $(shell $(NETSNMPCONFIG) --agent-libs)
     NETSNMPCFLAGS=`$(NETSNMPCONFIG) --base-cflags`
     NETSNMPLIBS=`$(NETSNMPCONFIG) --agent-libs`

     LIBS=$(NETSNMPLIBS)



Why does 'make test' skip various tests?
---------------------------------------

  Some of the tests are only relevant to particular operating systems,
  or rely on specific areas of functionality.  The test framework will
  check whether the relevant elements are available before running the
  relevant tests, and will skip them if these modules have been omitted
  from the build environment (or do not apply to the current system).

  One example of this are the tests T053agentv1trap, T054agentv2ctrap,
  T055agentv1mintrap, T056agentv2cmintrap and T113agentxtrap,  which
  rely upon functionality from the NET-SNMP-EXAMPLES-MIB implementation.
  This module is not included in the default agent configuration, so the
  test framework will skip these tests.
    To include them, run
        "configure --with-mib-modules=examples/example"
  and re-compile.



Why does 'make test' complain about a pid file?
-----------------------------------------------

    Typically it says something like:

    cat:  cannot open /tmp/snmp-test-1-8694/*pid*

    It's trying to tell you the port is blocked - typically because
  another copy of the agent is still running, left over from from a
  previous testing run.

  If you type 'ps -ef' you should notice an orphaned process like:

  snmpd -d -r -U -P /tmp/snmp-test-5-27295/snmpd.pid...

  Kill this process.

  This could be happening for several reasons including:

    1.  You are trying to do concurrent runs of 'make test'.

    2.  On a slow machine, the agent might be taking too long to
      start up. Try changing the value of the variable SNMP_SLEEP
      in testing/RUNTESTS from 1 to something higher - say 3 or 5.



CODING
======

How do I write C code to integrate with the agent?
-------------------------------------------------

  There are three main methods for integrating external C code
  within the agent.  The code can be compiled directly into the
  agent itself, it can be loaded dynamically while the agent is
  running, or it can be compiled into a separate application
  (a "subagent") which communicates with the main master agent.
  All three approaches have been touched on elsewhere within this FAQ.

    As far as the module code is concerned, all three mechanisms
  use exactly the same module API.  So a module developed for use
  directly within the agent, could also be included within a subagent,
  or loaded dynamically with no (or minimal) code changes needed.

    Most of this section is concerned with more detailed aspects
  of developing such code - including the 'mib2c' tool, which can
  handle generating a basic code framework for implementing a
  given set of MIB objects.



How does the agent fetch the value of a MIB variable from the system?
--------------------------------------------------------------------

  That's typically the hardest bit of implementing a new MIB module,
  and is the one thing that 'mib2c' can't help with.  It very much
  depends on the MIB variable concerned (and often the underlying
  operating system as well).

  Relatively few MIB modules are completely self-contained, with all
  the information held internally within the agent, and all updates
  being done via SNMP requests.  Such MIB modules can be implemented
  fairly easily.

  More commonly, the agent needs to provide an SNMP-based interface to
  information held elsewhere, perhaps in the operating system kernel or
  some other application.  Handling this is much more complex - since
  a lot depends on what mechanisms are provided for retrieving (and
  possibly updating) this information.  The mib2c tool can generate code
  for processing SNMP requests, based on some internal cache of management
  information, but it cannot help with populating this cache with the
  underlying data.  That is up to the MIB implementer.

  See the existing MIB modules in the Net-SNMP source tree for various
  examples of assorted approaches to this task.



Mib2c complains about a missing "mib reference" - what does this mean?
---------------------------------------------------------------------

    This basically means that it hasn't loaded the MIB file containing
  the definition of the MIB subtree you're trying to implement.  This
  might be because it hasn't been installed, the name is wrong, or
  (most likely), because it isn't in the default list.  See the MIBS
  section for more details, or the next entry for suitable invocations
  of 'mib2c'.



Mib2c complains about not having a "valid OID" - what does this mean?
---------------------------------------------------------------------

    This probably means that you gave it the name of a MIB file (or
  module), rather than the name of an object defined in that file.
  Mib2c expects the name of a 'root' object, and will generate a
  template for the sub-tree starting from there.

    If you've got a file 'MY-MIB.txt', defining the MIB module
  'MY-MIB' which contains a subtree based on the object 'myMib',
  then you should invoke mib2c as
            "mib2c .... myMib"
  rather than
            "mib2c .... MY-MIB.txt"
  or        "mib2c .... MY-MIB"

    Note that you'll probably also have to add your MIB to the list of
  MIBs that are loaded automatically, in order for mib2c to recognise
  the name of this object.  So the command would typically be
            "MIBS=+MY-MIB mib2c .... myMib"
  or        "MIBS=ALL     mib2c .... myMib"



Why doesn't mib2c like the MIB file I'm giving it?
-------------------------------------------------

  This is most likely the same problem as the previous entry.  Mib2c
  takes the name of a MIB _object_, not the name of a file (or MIB
  module).  Try using the name of the MODULE-IDENTITY definition.

    Another possibility is that the MIB may contain syntax errors.
  Try running it through 'snmptranslate' or a dedicated SMI
  validation tool (such as 'smilint' or the on-line interface at
  http://wwwsnmp.cs.utwente.nl/ietf/mibs/validate/)



Mib2c ignores my MIB and generates a pair of 'mib-2' code files.  Why?
---------------------------------------------------------------------

    This is usually a sign of the same problem as the previous entries,
  giving mib2c the name of the file containing the MIB (or of the MIB
  itself), rather than an object within it.

  Earlier versions of mib2c didn't detect this situation, and merrily
  constructed a template for a default starting point of the mib-2 node.

  More recent versions complain about not having a valid OID instead.



What's the difference between the various mib2c configuration files?
-------------------------------------------------------------------

    Most of the mib2c config files are concerned with implementing
  MIB tables, and generate various alternative code templates.
  These basically fall into four distinct categories.

    'mib2c.raw-table.conf' is the lightest of the templates, and
  just provides a fairly basic table framework.  Most of the work
  of implementing the table - detecting which row is required for a
  given request, retrieving or updating the relevant column values,
  and interacting with the underlying subsystem - are all left to
  the MIB programmer.

    The second group of templates - 'table_data', 'container' and
  'tdata' - all share the same basic model (although the internal
  details are rather different).  The MIB implementer should define a
  data structure to represent a row of the table, and the helper then
  takes care of holding the table internally, as a collection of such
  per-row data structures.  This includes identifying which row is
  required for a given request.  Retrieving or updating the appropriate
  column value is left to the MIB programmer, although the generated
  framework includes most of the necessary code.
    Allied to this is a fourth "internal data" mib2c configuration 
  file ('create-dataset') which handles the individual columns as
  well.  This is the closest to a Plug-and-Play configuration, and
  the MIB implementer only needs to be concerned with any special
  processing, such as linking the table with the underlying subsystem.

    The third style of mib2c config assumes that the table data is
  held externally to the helper - either within the MIB module code
  itself, or in the external subsystem.  The generated code framework
  includes routines to "iterate" through the rows of the table, with
  the iterator helper simply deciding which row is required for a
  particular request.  Once again, the MIB programmer must handle
  retrieving or updating the appropriate column value, although the
  generated framework includes most of the necessary code.
    There is a variant of this config ('iterate_access') which works
  in basically the same way. However this tries to separate out the
  standard processing, from the code that needs to be amended by the
  programmer for retrieving and updating the individual column values.

    This is also the idea behind the final table-oriented mib2c config
  template - 'mib2c.mfd.conf' (or "MIBs for Dummies").  This is a much
  more flexible framework, which can be used with either internally
  held data, or iterating through an external representation.  The
  distinguishing feature of this framework is that it separates out
  standard and table-specific processing, at a much finer level of
  detail than the others.


    The other mib2c config templates are concerned with implementing
  scalar objects ('scalar', 'int_watch'), code to generating traps
  ('notify'), and various specialised requirements.  There is also a
  template ('old-api') to generate code suitable for the previous v4
  UCD agent - though this is not particularly complete or reliable.
  It's probably better to use a pure v4 mib2c environment (or switch
  wholeheartedly to the v5 style).



Which mib2c configuration file should I use?
-------------------------------------------

    The answer to that heavily depends on the characteristics of the
  MIB objects being implemented.  Of the handler-based table frameworks,
  'tdata' is more appropriate for tables that can be stored (or a copy
  cached) within the agent itself, while 'iterate' is more relevant to
  reporting data from outside the agent.
    The raw interface is only suitable in very specific circumstances,
  so it's probably sensible to start with one of the other frameworks
  first, and only look at this if none of the alternatives seem to work.

    The decision between the handler-based configs and MfD is more a
  matter of the style of programming to use.  Most of the frameworks
  define a single handler routine to process an incoming request, so
  all of the code is listed together, with the MIB programmer inserting
  table-specific processing into this single block of code.
    The MfD provides a series of individual object-specific routines,
  each concerned with one very specific task, and hides as much as
  possible from the programmer.

    If you like to understand the broad thrust of what's happening,
  then one of the handler-based approaches would be the best choice.
  If you prefer to concentrate on the nitty-gritty of a given table,
  and are happy to trust that the rest of the processing will work
  correctly, then the MfD framework would be more appropriate.

    For implementing a group of scalar objects, then the choice is
  simple - use 'mib2c.scalar.conf'.  Similarly, for generating traps
  or informs, use 'mib2c.notify.conf'.  But note that this only assists
  with the code to actually generate the trap.  It does not address the
  issue of _when_ to send the trap.  See the FAQ entry "How can I get
  the agent to generate a trap?" for more information.



How can I have mib2c generate code for both scalars and tables?
--------------------------------------------------------------

    This uses a very powerful tool called a "text editor" :-)

    The mib2c tool uses separate configuration files to generate code
  for scalar objects, and for tables.  This means that it's not possible
  to automatically generate a single code file that supports both scalars
  and tables.

    Instead, the two code files need to be generated separately, and
  then combined manually.  This will typically mean copying the handler
  routines for the scalar object(s) into the table file, and adding the
  code to register these handler(s) to the table initialisation routine.



Are there any examples, or documentation for developing MIB modules?
-------------------------------------------------------------------

    Many of the MIB modules shipped with the Net-SNMP agent still
  use the v4 "traditional" MIB module API, but an increasing number
  use one of the newer v5 helper-based handlers.  All of these can
  be found under 'agent/mibgroup'

    The 'tdata' helper is used in the new DisMan Event, Expression
  and Schedule MIB modules (see 'disman/{event,expr,schedule}/*').
  The similar 'dataset' helper is used in the older DisMan Event
  MIB implementation (see 'disman/mteEvent*') and the Notification
  Log MIB (see 'notification-log-mib/*'), used by 'snmptrapd' to
  log incoming traps.
 
    The basic iterator handler is used in the TCP and UDP table
  implementations (mibII/tcpTable & mibII/udpTable), VACM context
  handling (mibII/vacm_context) and various tables relating to agent
  internals (agent/*).  These show a number of different approaches
  to using the iterator helper, so it's worth comparing them.

    The two examples/netSnmpHostsTable* modules provide a contrast
  between the iterator and iterator_access helpers.

    There are several examples based on the MfD framework (see
  '{if,ip,tcp,udp}-mib/').  Much of this code is not intended to
  be viewed directly, but individual files are clearly commented
  to distinguish between internal implementation and public code.

    The Net-SNMP agent does not currently include any MIB modules
  using the array-user container-based helper.  The best examples
  of this are to be found in the net-policy project.
  See http://net-policy.sourceforge.net/



Where should I put the files produced by 'mib2c'?
------------------------------------------------

  If you're using the main source tree to compile your new module, then
  put these two files (mymib.[ch]) in the directory 'agent/mibgroup'.
  You should then re-run configure to add in your new module
        configure --with-mib-modules=mymib
  and recompile.

    If you've got a number of new modules to add, it might be
  sensible to put them all into a single subdirectory of 'mibgroup'.
  Then create a header file, listing the individual components.
  This might look something like:

		config_require(mymib/myObjects)
		config_require(mymib/myTable)
		config_require(mymib/myOtherTable)

  If this was saved as the file 'mymib.h', then the same configure
  line given above, would pull in all three modules.  See the current
  contents of 'agent/mibgroup' for examples of this.  Note that the
  MfD framework will generate a similar grouping automatically.



Why doesn't my new MIB module report anything?
---------------------------------------------

    There are probably four main reasons why a new MIB module isn't working.
  Either it hasn't been included in the running agent,  the code is present
  but hasn't been initialised,  the module has been initialised but the
  handler isn't being called, or there's a problem with the module code itself.

  To check whether the code files are being compiled, the easiest approach is
  simply to look at the directory where the code is located.  When the agent is
  compiled, this should produce .o files (and probably .lo files) corresponding
  to the C code files for this module.  Alternatively, run 'nm' (or 'strings')
  on the MIB module library (libnetsnmpmibs), and look for the names of the
  initialisation routines or handlers (or the text of any messages displayed by
  the module code).

  One other thing to check is whether you have multiple copies of the software
  installed on the system.  This is a particular problem when compiling from
  source (to include your new module), without first removing any vendor-supplied
  version of the agent (which won't include this new code).


  Assuming that you have confirmed that the module code is present in the agent,
  the next step is to check whether the initialisation routine is being called
  to register the MIB objects.  The simplest way to do this is to include a
  suitable debugging statement within the initialisation routine, and start
  the agent with the corresponding '-Dtoken'.  Alternatively, try walking the
  nsModuleName column object, and look for mention of the new MIB module.


  Assuming the module has been registered, the next step is to check whether
  the handler is being called, when the agent receives a suitable SNMP request.
  Again, the simplest way to do this is to include debugging statements within
  the handler routine, and start the agent with the corresponding '-Dtoken'.
  Then issue an "snmpget" request for an instance within the new MIB module.
  (This command is preferable to the usual "snmpwalk" command, as it is more
  closely focused on the MIB module in question).

  If this indicates that the handler routine isn't being called, then there are
  two main likely causes.  Firstly, check the access control settings.  If these
  are configured to block access to this portion of the OID tree, then the MIB
  handler will never be called.  Secondly, several of the table helpers are
  designed to know which rows of the table are valid, and will call the main
  MIB handler with information about the relevant row.  If the requested row is
  not valid (or the table is empty), then the handler will not be called.


  Finally, if the handler _is_ being called, but is still not returning any
  information, then the cause probably lies with your MIB module code.  In which
  case, it's really up to you to find the problem and fix it!  Either activate
  any debugging code that you have included within the handler routine, or run
  the agent under a source code debugger, and step through the handler processing.
  In either case, it's much easier to debug these problems when processing an
  "snmpget" request, rather than "snmpgetnext" or "snmpwalk".

  Remember that 'mib2c' simply generates template code for your MIB module.
  It's up to you to fill in the details, to report the actual information from
  whatever underlying subsystem is being monitored.   Mib2c cannot help with
  the semantics of the MIB module - it's purely there to provide an initial
  code framework, based on the _syntax_ of the MIB module objects.



Why does the iterator call my get_{first,next} routines so often?
-----------------------------------------------------------------------

    The first thing to realise is that the 'get_first' and 'get_next'
  hook routines are concerned with processing a single SNMP request, not
  with walking the whole table.  A full "snmpwalk" command will typically
  involve a series of individual 'GetNext' requests, and every one of
  these will trigger a separate 'get_first/get_next/get_next/....' cycle.

    It's usually more efficient to use 'snmptable' which will walk
  each column in parallel (as well as displaying the results in a
  more natural manner).

    Secondly, the iterator helper was originally designed to handle
  unsorted data, so will look at every row of the internal table for
  each request.  If the data is actually held in the correct order,
  then it's worth setting the NETSNMP_ITERATOR_FLAG_SORTED flag:
      iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
      iinfo->flags |= NETSNMP_ITERATOR_FLAG_SORTED;
  This will help the situation somewhat.

    But the iterator helper is inherently a relatively inefficient
  mechanism, and it may be worth looking at one of the other helpers,
  particularly if the data will be held within the agent itself.



How can I get the agent to generate a trap (or inform)?
------------------------------------------------------

    There are two aspects to having the agent generate a trap -
  knowing *how* to do this, and knowing *when* to do so.

    Actually generating a trap is reasonably simple - just call one
  of the trap API routines ('send_easy_trap()' or 'send_v2trap()')
  with the relevant information (generic and specific trap values,
  or a varbind list respectively).

    The 'mib2c.notify.conf' configuration file can be used to
  construct a suitable template routine for generating a trap,
  including building the variable list from the MIB trap
  definition.  These variables can then be given suitable values,
  before invoking the 'send_v2trap()' call to actually send the trap.
  See the 'snmp_trap_api(3)' man page for further details.

    Note that these APIs are only available within the agent (or
  subagents), and are not available to stand-alone applications.
  The code for 'snmptrap' shows an approach to use in such a case.


    Determining *when* to generate the trap (either directly or
  via the mib2c-generated routine) is often harder.  If the trap
  is generated in response to some action within the agent, (e.g.
  as the result of a SET), then this isn't too much of a problem.

    But if the trap is intended to report on a change of status
  (e.g. a network interface going up or down, or a disk filling up),
  then actually detecting this is non-trivial.   Unless the underlying
  system can signal this situation to the agent, then it's typically
  necessary to poll the value(s) on a regular basis, save the results
  and compare them with the new values the next time round.

    The simplest way to handle this is via the DisMan Event MIB,
  which is designed for exactly this purpose.  As long as you can
  specify a MIB object to monitor, and the value or thresholds
  that should trigger a notification, then this module can check
  these values regularly, and automatically send a suitable trap
  when appropriate.  See the 'snmpd.conf(5)' man page (under
  ACTIVE MONITORING) for details.
  
    Otherwise, you'd need to use the routines documented in
  'snmp_alarm(3)' to regularly invoke a monitoring routine. This
  would check the necessary conditions (which need not be MIB
  objects), and call the 'send_xxx_trap()' routine (as generated
  by 'mib2c.notify.conf') when appropriate.



How can I get an AgentX sub-agent to generate a trap (or inform)?
----------------------------------------------------------------

  This is done in exactly the same manner as with the main SNMP agent.
  Calling one of the routines described in 'snmp_trap_api(3)' will cause
  the AgentX sub-agent to send a notification to the master agent, which
  will then pass this on to the configured trap destination(s).
  
  One of the original design aims of the Net-SNMP AgentX support was that
  the agent (or subagent) framework should be transparent to a MIB module
  implementer. The interface between the agent framework and a MIB module
  should be independent of the protocol used to receive the original request.
  So the exact same MIB module code could be used within a traditional
  SNMP-only agent, or an AgentX subagent, with no changes needed.

    This also holds for sending traps.



How can I get the agent to send an SNMPv1 (or SNMPv2c) trap?
-----------------------------------------------------------

    It doesn't make any difference whether you use the v1-style
  API call 'send_easy_trap()' or the v2-style 'send_v2trap()'.
  What matters is the directive(s) in the snmpd.conf file.

    If this file contains 'trapsink', then the agent will send
  an SNMPv1 trap.  If this file contains 'trap2sink', then the
  agent will send an SNMPv2c trap.  And if this file contains
  both, then the agent will send *two* copies of this trap.

  See the entry
     Where are these traps sent to?
  in the AGENT section for details.



How can I get the agent to include varbinds with an SNMPv1 trap?
---------------------------------------------------------------

    There are two ways to do this.  You can either use the
  'send_v2trap()' call and give a varbind list, starting with
  the v2-equivalent of the SNMPv1 trap, followed by the
  additional varbinds.

    Alternatively, you can use the API call 'send_trap_vars()'
  which takes the same generic/specific trap values as
  'send_easy_trap()', plus the list of additional varbinds.

    In either case, you also need to have 'trapsink' in the
  snmpd.conf file.  The resulting trap will be identical,
  whichever approach is used.



How can I get the agent to send an SNMPv1 enterprise-specific trap?
------------------------------------------------------------------

    There are two ways to do this.  You can either use the
  'send_v2trap()' call and give a varbind list, starting
  with the v2-equivalent of the SNMPv1 trap, followed by the
  additional varbinds.

    Alternatively, you can use the (undocumented) API call
  'send_enterprise_trap_vars()' which takes the same parameters
  as 'send_trap_vars()', plus the enterprise OID to use (in the
  usual name/length form).  See the code file 'agent_trap.c'

    In either case, you also need to have 'trapsink' in the
  snmpd.conf file.  The resulting trap will be identical,
  whichever approach is used.



How can I get the agent to send an SNMPv3 trap (or inform)?
----------------------------------------------------------

    It doesn't matter which API call you use to specify the
  trap - 'send_easy_trap()', 'send_v2trap()' or one of the other
  calls mentioned above.  Generating an SNMPv3 notification
  (rather than a community-based one) is controlled by the
  snmpd.conf file.
  
    To send an SNMPv3 trap, this file should contain a
  'snmpsess' directive, specifying the version, security
  level, user name and passphrases (if applicable), as
  well as the destination address.  This is basically
  the same as the command line required for sending the
  trap manually, using 'snmptrap'.

    Note that (unlike 'snmptrap') this directive does *not*
  read default settings from an 'snmp.conf' file, so these
  must be specified explicitly in the 'snmpsess' line.



Why does calling 'send_v2trap' generate an SNMPv1 trap (or vice versa)?
----------------------------------------------------------------------

    The two versions of the trap API calls are concerned with how
  the trap is represented when it is passed *in* to the API, not
  the version of the trap PDU that will actually be generated by
  the agent.  That is determined by the configuration token used
  to set up the trap destination.

    Remember that in general, all traps are sent to all destinations.
  This means that a trap specified using the SNMPv1 trap syntax
  needs to be converted to the SNMPv2 format before it can be sent
  to an SNMPv2 (or SNMPv3) destination.  Similarly, a trap specified
  using the SNMPv2 syntax needs to be converted to the SNMPv1 format
  before it can be sent to an SNMPv1 sink.

    Essentially, the API call to use depends on what you asking for,
  which is not necessarily what the recipients will actually get!
  See 'snmp_trap_api(3)' for a fuller explanation.



How can I register a MIB module in a different (SNMPv3) context?
---------------------------------------------------------------

    Contexts are a mechanism within SNMPv3 (and AgentX) whereby
  an agent can support parallel versions of the same MIB objects,
  referring to different underlying data sets.  By default, a MIB
  module registrations will use the default empty context of "".
  But it's also possible to provide MIB information using a different
  (non-default) context.

    There are three aspects involved in doing this.  Firsly, it's necessary
  to register the MIB module in this non-default context.  With the v4 API,
  this uses the call 'register_mib_context()' rather than the REGISTER_MIB
  macro.  This is significantly more detailed, but most of the additional
  parameters can take fixed values, if all that's needed is to change the
  registration context.

  Instead of the macro call:
        REGISTER_MIB("my_token", my_variables, variable1, my_variables_oid);
  use the function call:
        register_mib_context( "my_token",
                               my_variables, sizeof(variable1),
                               sizeof(my_variables)/sizeof(variable1),
                               my_variables_oid,
                               sizeof(my_variables_oid)/sizeof(oid),
                               DEFAULT_MIB_PRIORITY, 0, 0, NULL,
                               "my_context", -1, 0);

    Things are much easier with the v5 helper-based API.  Having
  created the registration structure, this just requires setting the
  'contextName' field before actually registering the MIB module:
        netsnmp_handler_registration *reg;
        reg = netsnmp_create_handler_registration(.....);
        reg->contextName = strdup("my_context");
        netsnmp_register_handler(reg);


  Secondly, it is necessary to configure the access control settings to allow
  access to information in the new context.  This is handled automatically
  when using the simple "rouser" or "rwuser" directives.  But if access control
  is configured using the fuller com2sec/group/view/access mechanism, then the
  "access" line must specify the appropriate context(s), either explicitly:

	access {group} "my_context" any noauth exact  ......

  or using a single entry to cover all possible contexts:

	access {group} ""           any noauth prefix ......


  Finally, the SNMP request used to retrieve (or update) the information
  must also specify the required context.  With SNMPv3 requests, the context
  is part of the protocol, so this can be done using a command-line option:

      snmpwalk -v 3 -n my_context .....

  With community-based requests (SNMPv1 and SNMPv2c), things aren't so simple.
  Although the "rocommunity" and "rwcommunity" settings also configure access
  for all possible contexts, there's no way to specify a non-default context
  as part of the request.

  The only way to handle non-default contexts with community-based SNMP requests
  is to set up a mapping from the community string to the desired context.  This
  uses the "com2sec" directive, with an additional "-Cn" parameter.   Note that
  this also means that the access control must be configured using the full
  com2sec/group/view/access mechanism.  The short-form access control directives
  do not handle the mapping of community strings to non-default contexts.



MISC
======

What ASN.1 parser is used?
-------------------------

  The parser used by both the agent and client programs is coded by hand.
  This parser has recently been re-vamped to allow control of which of 
  the available MIBs should be included, and to handle duplicate object
  subidentifiers.
    The source code can be found in the snmplib directory (in 'parse.c'),
  and the parser is usually bundled into the library 'libnetsnmp.a'

    Note that the parser attempts to be fairly forgiving of some common
  errors and incompatibilities in MIB files.  The Net-SNMP tools accepting
  a MIB file without complaint does *not* imply that the MIB is strictly
  correct.
    Certain MIBs may need some amendments to allow them to be read
  correctly by the parser.  Contact the coders' list for advice.



What is the Official Slogan of the net-snmp-coders list?
-------------------------------------------------------

  "The current implementation is non-obvious and may need to be improved."
	(with thanks to Rohit Dube)

  And an alternate, added 26-Apr-2000:
  
  "In theory, it shouldn't be that hard, but it just needs to be done."



