Library layering

From Net-SNMP Wiki
Revision as of 17:21, 31 January 2007 by Tanders (Talk | contribs) (Problem)

Jump to: navigation, search

Problem

The three libraries libnetsnmpmibs, libnetsnmphelpers and libnetsnmpagent have circular dependencies instead of what should be a clean mibs -> helpers -> agent -> main library dependency chain:

  • libnetsnmpmibs depends on libnetsnmphelpers
  • both of these depend on libnetsnmpagent
  • all 3 of these depend on libnetsnmp

There are only a few problematic calls/functions that violate this dependency chain:

Critical dependency Symbol/function implementation in ... (under agent/) caller(s) (under agent/) Comment
agent -> mibs make_tempfile mibgroup/util_funcs.c mibgroup/utilities/execute.c:run_shell_command() fixed in 5.4+ by introducing netsnmp_mktemp
agent -> helpers netsnmp_init_helpers helpers/all_helpers.c snmp_vars.c:init_agent() fix by merging agent and helpers libs
agent -> helpers netsnmp_register_null helpers/null.c agent_registry.c:setup_tree() ditto
agent -> helpers netsnmp_register_null_context helpers/null.c agent_registry.c:netsnmp_subtree_load() ditto
agent -> helpers netsnmp_register_old_api helpers/old_api.c agent_registry.c:register_mib_context() ditto
agent -> helpers netsnmp_bulk_to_next_fix_requests helpers/bulk_to_next.c mibgroup/agentx/master.c:agentx_got_response() ditto
agent -> helpers netsnmp_get_bulk_to_next_handler helpers/bulk_to_next.c agent_handler.c:netsnmp_register_handler() ditto
other strange dependencies
libnetsnmptrapd -> snmptrapd extern int dropauth apps/snmptrapd.c apps/snmptrapd_handlers.c:print_handler() Move 'dropauth' from snmptrapd.c to snmptrapd_handlers.c. Done for MAIN.
libnetsnmptrapd -> snmptrapd extern int SyslogTrap apps/snmptrapd.c apps/snmptrapd_handlers.c:syslog_handler() Move 'SyslogTrap' from snmptrapd.c to snmptrapd_handlers.c. Done for MAIN.
libnetsnmptrapd -> snmptrapd event_input apps/snmptrapd.c apps/snmptrapd_handlers.c:event_handler() Drop "-e"/printEventNumbers support altogether. Done for MAIN.

Discussion

The brute-force approach is to move all three mibs/helpers/agent libraries into one huge libagent library again. Downside: even a minimal subagent needs to link in all the mib code which it shouldn't need. That's like it effectively already is today, but it lowers the chance to ever sort it out.

The clever way would be to sensibly restructure the library while maintaining backward-compatibility and not causing too much overhead for agent developers. This needs to be investigated and discussed. Not sure if it's possible at all, though.

See the references below for the full discussion and details to date.

Proposal

what? who? status?
rework Makefiles to build libnetsnmp, libnetsnmpagent, libnetsnmphelpers and libnetsnmpmibs in that order tanders done for 5.4+
duplicate libnetsnmpmibs' make_tempfile as netsnmp_mktemp in libnetsnmp tanders done for 5.4+
merge agent and helpers libs!  ? TODO
fix libnetsnmptrapd->snmptrapd dependencies by moving integer variables to the library and dropping the event_input code dts12, tanders done for MAIN
rework Makefiles/configure to fullfil internal and external library dependencies correctly (see below) tanders TODO

Library linking

Here are the details of what library linking dependencies need to be cleaned up.

shared object/library/binary currently linked against dependencies to be added/removed Comment
libnetsnmp.so -lcrypto - ok
libnetsnmpagent.so - -lnetsnmp -lperl TODO
libnetsnmphelpers.so - -lnetsnmpagent -lnetsnmp TODO
libnetsnmpmibs.so - -lnetsnmphelpers -lnetsnmpagent -lnetsnmp -ldl -lrpm -lrpmio -lpopt -lz ... TODO
libnetsnmptrapd.so - -lnetsnmpmibs -lnetsnmp TODO
Perl SNMP/SNMP.so -lnetsnmp -lcrypto - ok
Perl NetSNMP/ASN/ASN.so -lnetsnmp -lcrypto - ok
Perl NetSNMP/OID/OID.so TODO
Perl NetSNMP/agent/agent.so almost everything remove: most external references ? (dependencies are in libnetsnmpmibs instead)

You can't do this unfortunately... perl doesn't use libtool, and only libtool is protecting you against having to know dependencies on every platform. --Wes

TODO
Perl NetSNMP/agent/default_store/default_store.so -lnetsnmp -lcrypto remove: both ? TODO
Perl NetSNMP/TrapReceiver/TrapReceiver.so - -lnetsnmptrapd -lnetsnmpagent -lnetsnmp TODO
Perl NetSNMP/default_store/default_store.so -lnetsnmp -lcrypto remove: both ? TODO
Python netsnmp/client_intf.so -lnetsnmp -lcrypto - ok
agent/snmpd almost everything remove: most external references ? (dependencies are in libnetsnmpmibs instead) TODO
apps/snmptrapd almost everything remove: most external references ? (dependencies are in libnetsnmpmibs instead) TODO
apps/snmp{get,set,walk,...} almost everything remove: most external references ? (not needed at all) TODO

References