# rstory's NET-SNMP Developers Frequently Asked Questions Page

[Official FAQ] | [Debug tokens] | [AgentX] | [Install] | [Disable] | [Errors] | [Bits] | [embedded perl] | [SMUX] | [Enterprise OID] | [Automatic dependencies] | [Cross compiling] | [Static linking] | [readfds] | [Sharing data] | [mib2c.array-user.conf] | [Baby Steps flow] |

This is just a quick page to answer some common questions that aren't covered in the official FAQ.

## AgentX

     To have the sub-agent communicate on a different socket, or with
    different permissions, add these line to your snmpd.conf

    	# socket path
    	agentxsocket /tmp/agentx

    	# perms socket directory userid groupid
    	agentxperms 777 777 rstory rstory

    and add this line to your subagent:

    	netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_X_SOCKET, "/tmp/agentx");

    *before* you call init_agent().

## install

     INSTALL_PREFIX goes before everything.. so, with the defaults, just
    setting INSTALL_PREFIX=/tmp would result in /tmp/usr/local..
    so INSTALL_PREFIX=/tmp prefix=/usr exec_prefix=/usr would go into /tmp/usr

## disable

     If you are using net-snmp Version >= 5.1, then the following configure
    options may be useful to you:

      --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.

## errors

     from RFC 3416:

                       noError(0),
                       tooBig(1),
                       noSuchName(2),      -- for proxy compatibility
                       badValue(3),        -- for proxy compatibility
                       readOnly(4),        -- for proxy compatibility
                       genErr(5),
                       noAccess(6),
                       wrongType(7),
                       wrongLength(8),
                       wrongEncoding(9),
                       wrongValue(10),
                       noCreation(11),
                       inconsistentValue(12),
                       resourceUnavailable(13),
                       commitFailed(14),
                       undoFailed(15),
                       authorizationError(16),
                       notWritable(17),
                       inconsistentName(18)

## bits

     SNMPv1 use BIT STRINGs (RFC 1212, 5.1.1):

              (3)  An object with BIT STRING syntax containing no more than
                   32 bits becomes an INTEGER defined as a sum; otherwise if
                   more than 32 bits are present, the object becomes an
                   OCTET STRING, with the bits numbered from left-to-right,
                   in which the least significant bits of the last octet may
                   be "reserved for future use".

    SNMPv2 and beyond uses BITS (RFC 3417, 8.1):

       (3)   When encoding an object whose syntax is described using the
             BITS construct, the value is encoded as an OCTET STRING, in
             which all the named bits in (the definition of) the bitstring,
             commencing with the first bit and proceeding to the last bit,
             are placed in bits 8 (high order bit) to 1 (low order bit) of
             the first octet, followed by bits 8 to 1 of each subsequent
             octet in turn, followed by as many bits as are needed of the
             final subsequent octet, commencing with bit 8.  Remaining bits,
             if any, of the final octet are set to zero on generation and
             ignored on receipt.

## embedded perl

     Add the following line to snmpd.conf:

       perl do "/path/to/perl_module.pl"

    To test:

    1) Try staring up snmpd, like so: 'snmpd -Dperl'. Check your log files for:

      perl: initializing perl (/tmp/snmp_perl.pl)
      starting perl_module.pl
      perl_module.pl loaded ok
      registering at netSnmp.999

    If you get:

      perl: initializing perl (/usr/local/share/snmp/snmp_perl.pl)
      Can't open perl script "/usr/local/share/snmp/snmp_perl.pl": No such file or directory
      embedded perl support failed to initalize

    Then you need to locate snmp_perl.pl, and put it in the correct path, OR put
    the path in your snmpd.conf:

    	perlInitFile /tmp/snmp_perl.pl

    2) Once it's loaded ok, try a walk:

    	snmpwalk -v2c -c public localhost netSnmp.999

    You should see something like this in your logs:

     refs: NetSNMP::agent::netsnmp_mib_handler, NetSNMP::agent::reginfo, NetSNMP::agent::netsnmp_agent_request_info, NetSNMP::agent::netsnmp_request_infoPtr
    processing a request of type 161
       processing request of nsTransactionEntry.3
        .1.3.6.1.4.1.8072.999.1.2.1 -> hello world
       finished processing

    3) If not, maybe check /path/to/perl_module.pl and make sure it is executable.

    Hope that helps.

## SMUX

     To turn off SMUX when you don't have the options of recompiling from source
    to disable SMUX support, you have to give it an invalid IP address to bind
    to. This may be OS specific. On Linux, if I put this in my snmpd.conf:

    	smuxsocket 1.0.0.0

    I get an error at startup, and lsof or netstat show that snmpd is no longer
    listenting on port 199. If you get and error message about the smuxsocket
    token not being recongnized, then you're out of luck. You'll have to recompile
    from source (or just use local firewall rules to block connections to port
    199).

## Enterprise OID

     From: Dave Shield, RObert Story

    Recent Versions (5.x)
    ---------------------
    If you want to *just* change the sysObjectID numbering,
    (and leave the notifications using the Net-SNMP enterprise OID)
    then use  --with-enterprise-sysoid
    Or you could just use the snmpd.conf directive 'sysobjectid'
    to set this at run time.

    If you want to *just* change enterprise-specific notification OID
    (and leave the sysObjectID using the Net-SNMP values)
    then use  --with-enterprise-notification-oid

    If you want to change *both* of these,
    then use --with-enterprise-oid

    Older Versions (4.2.x)
    ----------------------
    In older version, you have to manuall update the version_id in
    agent/agent_trap.c:80

       oid version_id[]    = { EXTENSIBLEMIB, AGENTID, OSTYPE };

## Automatic dependencies

     For auto-dependencies, add the following to your Makefile:

    #
    # Build rules
    #
    %.d : %.c
    	@echo "Generating makefile $@ ..."
    	@set -e; $(CC) -M $(COPTS) $(CFLAGS) $(CPPFLAGS) $< \
    	| sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; \
    	[ -s $@ ] || $(RM) $(RMFLAGS) $@

    include $(SOURCES:.c=.d)

## Cross compiling

     From the net-snmp INSTALL file:

     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Specifying the System Type
    ==========================

       There may be some features `configure' can not figure out
    automatically, but needs to determine by the type of host the package
    will run on.  Usually `configure' can figure that out, but if it prints
    a message saying it can not guess the host type, give it the
    `--host=TYPE' option.  TYPE can either be a short name for the system
    type, such as `sun4', or a canonical name with three fields:
         CPU-COMPANY-SYSTEM

    See the file `config.sub' for the possible values of each field.  If
    `config.sub' isn't included in this package, then this package doesn't
    need to know the host type.

       If you are building compiler tools for cross-compiling, you can also
    use the `--target=TYPE' option to select the type of system they will
    produce code for and the `--build=TYPE' option to select the type of
    system on which you are compiling the package.

     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The most important configure options are:

    	--with-cc=[cross-compiler]
    	--with-ld=[cross-linker]
    	--target=[target-environment]
    	--with-endianness=[big|little]

    Other potentially useful options:

    	--with-cflags="..."
    	--with-ldlags="..."
    	--with-ar=/path/ar

    	--enable-mini-agent
    	--enable-shared="no"
    	--without-pic

    Two simple examples of cross-compiling:

    ./configure --target=ppc-linux --with-cc=ppc_405-gcc --with-endianness=big

    ./configure --target=powerpc-snmc-linux-gnu --build=i386-redhat-linux \
            --with-endianness=big

    A more complex example involves setting environment variables for all
    the flags for the tools needed for the cross compile:

       export TOOLPATH=/opt/hardhat/devkit/ppc/405
       export PATH=$TOOLPATH/bin:$PATH
       export CFLAGS=' -g -fPIC -msoft-float -D_SOFT_FLOAT -Dlinux -mcpu=403'
       export CPPFLAGS='-I$TOOLPATH/include -I$TOOLPATH/target/usr/include'
       export ASFLAGS='-g -gstabs'
       export LDFLAGS='-Wl,-soname,-Bdynamic -lc'
       export LIB='ar rcu'

       ./configure --build=i686-pc-linux-gnu  --host=powerpc \
               --target=powerpc-hardhat-linux-gnu --with-endianness=big

     - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The mibgroup section is the most OS specific part of the agent. It's likely
    that you will have to remove some of them. You just need to figure out which
    ones to remove.

    For example, agent/mibgroup/mibII/tcpTable.c is a common module that doesn't
    work on new platforms. So if it isn't working, omit it during configure, like
    so:

    	./configure --with-out-mib-modules=mibII/tcpTable

    Alternatively, you could work the other way. Start with a minimal
    configuration:

    	./configure --enable-mini-agent

    and then start adding MIB modules one-by-one:

    	./configure --enable-mini-agent
                        --with-mib-modules=mibII/system_mib,mibII/sysORTable

## Static linking

     mXaureliu: I want to compile the 5.1 snmptrapd binary with statically linked libraries.. Can anyone help me with this? Is it just a simple configure switch
    rstory: mXaureliu: you want static snmp libraries, or totally static (system libraries too)?
    mXaureliu: totally static.. everything in one executable
    mXaureliu: actually, how do i do both ways?
    rstory: for snmp libs, try 'configure --enable-shared=no'.. that won't build the shared libraries
    rstory: (though if you have previous versions of net-snmp libraries installed, the linker might pick those up and try and use them)
    rstory: for totally static, you'll have to tweak the Makefile
    rstory: add -Bstatic to LDFLAGS

    [note: actually, for totally static, 'configure --with-ldflags=-Bstatic']

## readfds

     > can you please tell me the meaning of the third argument. obviously the
    > first parameter to register_readfd is a file descriptor and second is the
    > callback function.

    Correct.
    The third parameter is arbitrary data that you can specify when you
    register the file descriptor, and will then be passed to the callback
    function when it's invoked.

    So if you were listening on two separate sockets, for very similar
    types of data, then you could use the same callback for both and
    use this third parameter to distinguish between them:

    	fd1 = open( "/proc/tweedledum" );
    	fd2 = open( "/proc/tweedledee" );

    	register_readfd( fd1, who_broke_the_rattle(), "tweedledee" );
    	register_readfd( fd2, who_broke_the_rattle(), "tweedledum" );

    void
    who_broke_the_rattle( int fd, void *data )
    {
        char *he_did = (char *)data;

        printf("%s broke the rattle!\n", he_did );
    }

## sharing data

     If two modules are compiled into the same agent/subagent, then just use a
    normal C global var. No need to involve net-snmp in the process.

    if they are different sub-agents, you are better off using tradition IPC
    mechanisms. there is no net-snmp api for sharing data between subagents.

    That said, *IF* you only need the data during processing of GET requests, or
    when you aren't processing a request at all, you send a snmp request to the
    master, which will query the other subagent. If you are processing a GET
    request and are compiled into the master, you will have to delegate the
    current request).

    It's a little inefficient, compared to direct communication w/the other
    subagent and it *will not* work during set processing.

## Debug Tokens

     Some of the more common ones are:

       Agent: agent, agentx, dlmod, handler, helper, snmpd, trap, table
       MIBs: init_mib, mib_init, parse-file, parse-mibs
       Apps: read_config

    Add them to your snmp.conf like so:

       # optionally turn on time stamps
       logTimestamp true
       doDebugging 1
       debugTokens agentx/config

    If you put them in a different conf file, like snmpd.conf or myapp.conf,
    prefix each with '[snmp]', like so:

       [snmp] doDebugging 1

    This list was generated by running the following command in the main CVS branch:

    find . -name \"*.c\" -print | xargs grep DEBUGMSGT | grep \" | cut -f 2 -d\" | sort -u

    add
    agent_handler
    agent_registry
    agent_set
    agentx
    agentx_build
    agentx_build_varbind
    agentx/config
    agentx/config/retries
    agentx/config/timeout
    agentx/master
    agentx/subagent
    agentx/subgaent
    asn_realloc
    auto_nlist
    build_oid_noalloc
    build_oid_segment
    callback
    callback_clear
    check_getnext_results
    clear_nsap_list
    compare:index
    comparex
    container
    container_iterator
    container_iterator:results
    container:null:
    container:null:find
    container:null:find_next
    container:null:for_each
    container:null:free
    container:null:get_null
    container:null:get_null_factory
    container:null:get_null_noalloc
    container:null:insert
    container:null:remove
    container:null:size
    container_registry
    daemonize
    deinit_usm_post_config
    delayed_instance
    dlmod
    dump_etimelist
    encode_keychange
    example
    example_data_set
    example_notification
    example_scalar_int
    fixup_mib_directory
    generate_Ku
    generate_kul
    get_mib_directory
    handler:calling
    handler:inject
    handler::register
    handler_registry
    handler:returned
    header_complex
    header_complex_add_data
    header_complex_dump
    header_complex_extract_entry
    header_complex_generate_oid
    header_complex_generate_varoid
    header_complex_parse_oid
    header_complex_test
    helper:baby_steps
    helper:cache_handler
    helper:debug
    helper:instance
    helper:mfd
    helper:null
    helper:read_only
    helper:row_merge
    helper:scalar
    helper:scalar_group
    helper:serialize
    helper:stash_cache
    helper:table
    helper:watcher
    helper:watcher:spinlock
    helper:watcher:timestamp
    host/hr_device
    host/hr_disk
    host/hr_filesys
    host/hr_inst
    host/hr_network
    host/hr_partition
    host/hr_print
    host/hr_proc
    host/hr_storage
    host/hr_swinst
    host/hr_swrun
    host/hr_swrun::GetNextHR_SWRun
    host/hr_system
    hr_proc
    initialize_table_ipCidrRouteTable
    initialize_table_mteEventNotificationTable
    initialize_table_mteEventTable
    initialize_table_netSnmpHostsTable
    initialize_table_nlmLogTable
    initialize_table_nlmLogVariableTable
    initialize_table_nsModuleTable
    initialize_table_nsTransactionTable
    init_mib
    init_usm
    injectHandler
    kernel_sunos5
    ksm
    lcd_get_enginetime
    lcd_get_enginetime_ex
    lcd_set_enginetime
    log_notification
    md5
    mfd
    mibII/at
    mibII/icmp
    mibII/interfaces
    mibII/ip
    mibII/ipv6
    mibII/mta_sendmail.c:mta_sendmail_parse_config
    mibII/mta_sendmail.c:open_sendmailst
    mibII/mta_sendmail.c:read_sendmailcf
    mibII/snmp_mib
    mibII/sysORTable
    mibII/tcpScalar
    mibII/tcpTable
    mibII/udpScalar
    mibII/udpTable
    mibII/vacm_vars
    mibII/var_route
    mib_init
    mte_disco
    mteEventTable:send_events
    mteObjectsTable
    mteTriggerBooleanTable
    mteTriggerDeltaTable
    mteTriggerExistenceTable
    mteTriggertable
    mteTriggerTable
    mteTriggerTest
    mteTriggerTest:send_mte_trap
    mteTriggerThresholdTable
    netsnmp_aal5pvc
    netsnmp_agent_check_packet
    netsnmp_deregister_agent_nsap
    netsnmp_ds_handle_config
    netsnmp_ds_set_boolean
    netsnmp_ds_set_int
    netsnmp_ds_set_string
    netsnmp_ds_set_void
    netsnmp_ds_toggle_boolean
    netsnmp_instance_counter32_handler
    netsnmp_instance_int_handler
    netsnmp_instance_long_handler
    netsnmp_instance_ulong_handler
    netsnmp_ipx
    netsnmp_register_agent_nsap
    netsnmp_register_mib_table_row
    netsnmp_sockaddr_in
    netsnmp_sockaddr_in6
    netsnmp_sockaddr_ipx
    netsnmp_table_data_set
    netsnmp_tcp
    netsnmp_tcp6
    netsnmp_udp
    netsnmp_udp6
    netsnmp_udp6_getSecName
    netsnmp_udp6_parse_security
    netsnmp_udp_getSecName
    netsnmp_udp_parse_security
    netsnmp_unix
    netsnmp_unix_getSecName
    netsnmp_unix_parse_security
    netsnmp_unix_transport
    netstat:if
    notification_log
    nsCacheScalars
    nsDebugScalars
    object_monitor
    old_api
    output
    override
    parse-file
    parse-mibs
    parse_oid
    parse_oid_indexes
    perl
    proc
    proxy
    proxy_args
    proxy_config
    proxy_init
    read_config
    read_config_copy_word
    read_config_files
    read_config:forward
    read_config:initmib
    read_config_read_data
    read_config_read_memory
    read_config_read_objid
    read_config_read_octet_string
    read_config_store_data_prefix
    read_config:traphandle
    register_exceptfd
    register_index
    register_mib
    register_readfd
    register_signal
    register_writefd
    report
    results
    scalar_int
    scapi
    scopedPDU_parse
    send_notifications
    sess_async_send
    _sess_open
    sess_process_packet
    sess_read
    sess_resend
    sess_select
    setting auth type: \
    signal
    smux
    smux_conf
    smux_init
    smux/snmp_bgp
    smux/snmp_ospf
    smux/snmp_rip2
    snmp_agent
    snmp_alarm
    snmp_api
    snmp_build
    snmp_clean_persistent
    snmp_config
    snmpd
    snmpd/main
    snmpd_ports
    snmpd_register_app_config_handler
    snmpd/select
    snmpEngine
    snmpNotifyFilterProfileTable
    snmpNotifyFilterTable
    snmpNotifyTable
    snmp_parse
    snmp_parse_args
    snmp_parse_oid
    snmp_pdu_realloc_rbuild
    snmp_save_persistent
    snmp_send
    snmp_sess_add
    snmp_sess_close
    snmp_sess_open
    snmpSetSerialNo
    snmp_store
    snmpTargetAddrEntry
    snmpTargetParamsEntry
    snmptrapd
    snmpv3
    snmpv3_parse
    sprint_by_type
    stash_cache
    subtree
    table_array
    table_array:get
    table_array:group
    table_data_add_data
    table_iterator
    table_set_add_row
    take_snapshot
    target_counters
    target_sessions
    tdomain
    testhandler
    testhandler_table
    transport_callback
    trap
    trapsess
    tunnel
    ucdDemoPublic
    ucd-snmp/disk
    ucd-snmp/disk:
    ucd-snmp/memory
    ucd-snmp/pass
    ucd-snmp/pass_persist
    ucd-snmp/proc
    ucd-snmp/versioninfo
    ucd-snmp/vmstat_aix4.c:update_stats
    ucd-snmp/vmstat_dynix.c:update_stats
    ucd-snmp/vmstat_hpux.c:update_stats
    ucd-snmp/vmstat_solaris2.c:update_stats
    unlink_tree
    unload-mib
    unregister_exceptfd
    unregister_readfd
    unregister_signal
    unregister_writefd
    usm
    usmUser
    util_funcs
    vacm:checkSubtree
    vacm:getView
    versioninfo
    vmstat
    yyyinjectHandler

## Baby Steps Flow

         /**
         * Baby Steps Flow diagram (rev 2003.09.29.1330)
         *
         * Legend: (test) [optional] <required>
         *
         * OLD              NEW
         * ========  ============================================
         * +++           [pre_request]
         *                    |
         *               (row exists?) N ->(row_creation) N >-->+
         *                    |                   | Y           |
         *                    |<------------------+             |
         *                   \|/                               \|/
         * RESERVE1  <object_syntax_checks>                     |
         *                    |                                 |
         *                  (err?)  Y >------------------------>+
         *                    |                                 |
         *                   \|/                               \|/
         * +++          (row existed?) N --->[row_creation]     |
         *                    |                   |             |
         *                    |<--------------N (err?)          |
         *                    |                   | Y           |
         *                    |                   |             |
         *                    |       [row_creation_cleanup]--->+
         *                   \|/                                |
         * RESERVER2     [undo_setup]                           |
         *                    |                                 |
         *                  (err?)  Y --->-------->--------->+  |
         *                    |                              | \|/
         * ACTION        <set_values>                        |  |
         *                    |                              |  |
         *                  (err?)  Y >---------+           \|/ |
         *                    |                 |            |  |
         * +++        [consistency_checks]      |            |  |
         *                    |                \|/           |  |
         * UNDO             (err?)  Y >-------[undo]-------->+  |
         *                    |                              |  |
         *            [reversible_commit]                    |  |
         * +++                |                              | \|/
         *                  (err?)  Y >--[reverse_commit]    |  |
         *                    |              |               |  |
         * COMMIT        <final_commit>      |               |  |
         *                    |              |               |  |
         *                  (err?)  Y >--[log msg]           |  |
         *                    |              |               |  |
         *                    |             \|/             \|/ |
         *                    | <-----------<+---<-----------+  |
         *                   \|/                                |
         * FREE          [undo_cleanup]                         |
         *                    |                                \|/
         *                    |<--------------<-----------------+
         *                   \|/
         *               [post_request]
         */

Page Last modified: Wed Mar 12 13:49:32 PST 2003 | Powered by: