Library layering

From Net-SNMP Wiki
Revision as of 11:29, 22 May 2007 by Tanders (Talk | contribs) (bring discussion up-to-date)

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

There doesn't seem to be a way around merging the agent and helpers libraries into one libagent library again, so this is what we're going to do for 5.5 and beyond.

We haven't found any clever way would be to sensibly restructure both libraries to get rid of circular interdependencies while maintaining backward-compatibility and not causing too much overhead for agent developers.

All other library layering issues will likely be solved properly without such drastic changes.

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

Linking a shared library against libperl turns out to be tricky since existing PERLLDOPTS reference the static DynaLoader.a which isn't portable.

TODO
libnetsnmphelpers.so - -lnetsnmpagent -lnetsnmp coming soon
libnetsnmpmibs.so - -lnetsnmphelpers -lnetsnmpagent -lnetsnmp coming soon
-ldl -lrpm -lrpmio -lpopt -lz ... r16399
libnetsnmptrapd.so - -lnetsnmpmibs -lnetsnmp coming soon
Perl SNMP/SNMP.so -lnetsnmp -lcrypto (net-snmp-config --libs) remove "-crypto" in "net-snmp-config --libs" coming soon
Perl NetSNMP/ASN/ASN.so see SNMP.so see SNMP.so coming soon
Perl NetSNMP/OID/OID.so see SNMP.so see SNMP.so coming soon
Perl NetSNMP/agent/default_store/default_store.so see SNMP.so see SNMP.so coming soon
Perl NetSNMP/default_store/default_store.so see SNMP.so see SNMP.so coming soon
Perl NetSNMP/TrapReceiver/TrapReceiver.so - -lnetsnmptrapd -lnetsnmpagent -lnetsnmp coming soon
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

But configure determines the required external libraries and makes the list available through variable substitutions that could also be used in the Perl Makefile, couldn't they? -- Thomas

TODO
Python netsnmp/client_intf.so see SNMP.so see SNMP.so coming soon
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