This README describes the ./local/mib2c script.

Author:  Derek Simkowiak
         dereks@kd-dev.com
         http://www.kd-dev.com
         (please mail questions to ucd-snmp-coders@ucd-snmp.ucdavis.edu,
         not to the author directly.  Thanks!)

Date:    Wed Jan 20 02:51:06 PST 1999
-----------------------------------------------------------------------
mib2c

OVERVIEW

	mib2c is a Perl script that takes a MIB (such as those files found
in ./mibs/ ) and converts it into C code.  That C code can then be used as a
"template" to implement your MIB.  Then, when you are done editing the C
code and recompiling, the UCD-SNMP agent (snmpd) will support your MIB.
mib2c takes the place of "MIB Compilers" that come with commercial SNMP
agents.


REQUIREMENTS/INSTALLATION

	mib2c requires the SNMP.pm Perl module.  As of this writing the
latest version of the SNMP.pm module is 1.8.

	The SNMP.pm module can be downloaded from CPAN at 

http://www.cpan.org/modules/by-module/SNMP/

	...the file that you want is probably SNMP-1.8b5.tar.gz .
If you didn't know that already, most every Perl module can be downloaded
from CPAN (www.cpan.org).  Follow the installation instructions for the
module.

	NOTE: If you are running Redhat Linux 5.2 (and perhaps other
versions), you might get the following errors during the "make test" phase
of the installation of the SNMP.pm module:

[root@olly SNMP-1.8b5]# make test             # This is the command...
PERL_DL_NONLAZY=1 /usr/bin/perl -I./blib/arch -I./blib/lib
-I/usr/lib/perl5/i386-linux/5.00404 -I/usr/lib/perl5 -e 'use Test::Harness
qw(&runtests $verbose); $verbose=0; runtests @ARGV;' t/*.t
t/mib...............ok
t/session...........FAILED tests 7-8
        Failed 2/14 tests, 85.71% okay
t/translate.........ok
Failed Test  Status Wstat Total Fail  Failed  List of failed
-------------------------------------------------------------------------------
t/session.t                  14    2  14.29%  7-8
Failed 1/3 test scripts, 66.67% okay. 2/24 subtests failed, 91.67% okay.
make: *** [test_dynamic] Error 9


	If the "make" went okay, then you can ignore these test failures.
These indicate you don't have write access to the portions of the mib
tree that the test script is trying to use.  Please don't email the
UCD-SNMP list with other errors regarding the SNMP.pm module.
comp.lang.perl.modules is probably the most appropriate spot to
discuss problems with the SNMP.pm perl module itself. Interelated
problems between ucd-snmp and SNMP could be discussed on the ucd-snmp
mailing lists though.


USAGE

	mib2c takes one argument: an OID.  It then traces down that OID
and generates the template C code.  Here is the documentation, from the
top of the script:

# This program, given an OID reference as an argument, creates some
# template mib module files to be used with the ucd-snmp agent.  It is
# far from perfect and will not generate working modules, but it
# significantly shortens development time by outlining the basic
# structure.
#
# Its up to you to verify what it does and change the default values
# it returns.
#
# You *must* correct the beginning of the var_XXX() function to
# correctly determine mib ownership of the incoming request.


FINDING YOUR MIB

	Before you can specify the OID for your enterprise/MIB on the
command line, the script needs to be able to find your MIB so that it can
read it in and generate template code.  Joe Marzot (gmarzot@nortelnetworks.com)
tells us:
--------------------------------------
you should read (man mib_api). The defaultm behaviour for mib loading
from within the perl interface uses the environment variables described
there. You can also override these and explicitly define mibdirs and
load modules through the perl/SNMP api.

the easiest thing to do is toss the mibs in /usr/local/share/snmp/mibs
and set the env. var., MIBS, to 'ALL'.
--------------------------------------

	I recommend following the last two lines of advice.  I simply did

# cp /home/dereks/MY-MIB-FILE.txt /usr/local/share/snmp/mibs/
# export MIBS=ALL

	...on my Redhat system (with a BASH shell) and it was able to find
my MIB just fine.


EXAMPLES

	Here are some examples from Wes Hardaker (wjhardaker@ucdavis.edu).
He's using a C shell.  Wes writes:
--------------------------------------
Ok, in order to run the thing, you actually need to do something like
this:

setenv MIBS MY-ITEM-MIB          # assumes csh
mib2c itemNode

Where, "itemNode" should be a node in the mib tree that you want to
generate C code for.  Note, pick small pieces not large ones.  Yes, it 
will generate code for the entire mibII tree if you ask it to, in one
very large mib file.

Examples:

% mib2c interfaces
outputing to interfaces.c and interfaces.h ...
  depth: 3
  Number of Lines Created:
178 interfaces.c
84 interfaces.h
262 total
Done.

% mib2c mib-2                             # Don't ever do this.
outputing to mib-2.c and mib-2.h ...
  depth: 5
  Number of Lines Created:
2783 mib-2.c
617 mib-2.h
3400 total
Done.

It may have some sorting problems with multiple level mib tree
branches being generated into one piece of code (reorder the .h file
structure to be in OID lexical order if needed).
--------------------------------------

WHAT TO DO WITH THE CODE THAT GETS GENERATED

	You will need to edit your generated code to work with your
hardware.  For instance, if your MIB is for a refridgerator, you will need
to write the code that talks to the refridgerator (through the serial
port, maybe?) in Fridge Protocol.

	See the files in ./agent/mibgroup/examples/ and
./agent/mibgroup/dummy/ for heavily-commented example code.  Don't ask me
questions about this stuff--I'm just now figuring it out myself...

	[NOTE: If anyone out there has tips about necessary options to
./configure, or re-compiling snmpd with custom MIB support, please add
them here...]

WARNING

	As of this writing, the mib2c compiler is a bit outdated and needs
some work.  Wes writes:
--------------------------------------
It already needs changing, because the architecture has changed in the 
3.6 line (though its backwards compatible, I'd prefer to generate
code from newer models than older ones).
--------------------------------------
	When I asked him to elaborate on the new 3.6 archictecture, all I
got was:
--------------------------------------
It hopefully will be in the new documentation about mib module api
that Dave Shield is putting together (which is also currently wrong,
for that matter)...
--------------------------------------
	...so I don't know what the hell he's talking about.


SOME ERRORS AND THEIR MEANING

	If you get a large number of errors that look like:

[...]
unknown type:  INTEGER for prIndex
unknown type:  OCTETSTR for prNames
unknown type:  INTEGER for prMin
[...]

	...then you are trying to use an old version of the mib2c script
that does not support the SNMP.pm module version 1.8.  Get the latest
version of the script.

	If you get the error 

Couldn't find mib reference: myEnterpriseOID

	...when you know that it should be finding your MIB file(s), then
you forgot to put the word "END" at the very end of your MIB.  (Uh...I'm
not speaking from experience here.  Really.)

ACKNOWLEGMENTS

	Many thanks to the people on the UCD-SNMP mailing list
(ucd-snmp@ucd-snmp.ucdavis.edu).  In particular, many thanks to

Wes Hardaker <wjhardaker@ucdavis.edu>
Ken McNamara <conmara@tcon.net>
Joe Marzot <gmarzot@nortelnetworks.com>

	...since about half this document is just cut'n'pasted from emails
they sent me.

	Good luck with your project.

Derek Simkowiak
dereks@kd-dev.com
http://www.kd-dev.com

