README.mib2c
This README describes the ./local/mib2c script. Author: Derek Simkowiak dereks@kd-dev.com http://www.kd-dev.com (please mail questions to net-snmp-coders@lists.sourceforge.net, 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 net-snmp and SNMP could be discussed on the net-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 net-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 default 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 refrigerator, 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 (net-snmp-users@lists.sourceforge.net). 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