agent/snmpd.c
[main]
|
|--> [netsnmp_sd_listen_fds] check if systemd has sockets ready for us
|
|--> register signal handlers
|
|--> configure self flags
|
|--> parse arguments
|
|--> [init_agent] register all kinds of handlers and callbacks
|
|--> [init_mib_modules] register callback for mib modules
|
+--> [init_snmp] (abort tracing)
agent/snmp_vars.c
[init_agent] : register all kinds of handlers and callbacks
|
|--> [init_kmem] return 1 in our case
|
|--> [setup_tree] (???)
|
|--> [init_agent_read_config] register config handlers
|
|--> [_init_agent_callback_transport] setup transport/session, open transport, copy session and add to list
|
|--> [snmp_register_callback] callback = _warn_if_all_disabled()
|
|--> [netsnmp_init_helpers] register helpers
|
|--> [init_traps] (empty)
|
|--> [netsnmp_container_init_list] register container handlers
|
|--> [init_agent_sysORTable] register callbacks for sysORTable
|
|--> [agentx_config_init] register agentx handlers
|
|--> if application role = sub_agent
| -
| +--> [subagent_init] init callback session, register callback for sub_agent
|
|--> [netsnmp_udp_agent_config_tokens_register] register config handler for token 'com2sec'
|
|--> [netsnmp_udp6_agent_config_tokens_register] register config handler for token 'com2sec6'
|
|--> [netsnmp_unix_agent_config_tokens_register] register config handler for token 'com2secunix'
|
|--> [netsnmp_certs_agent_init]
|
+--> [netsnmp_certs_agent_init] register config handlers for certificate
agent/agent_read_config.c
[init_agent_read_config] : register config handlers
|
|--> [register_app_config_handler] token = 'authtrapenable'
| parser = snmpd_parse_config_authtrap()
|
|--> [register_app_config_handler] token = 'pauthtrapenable'
| parser = snmpd_parse_config_authtrap()
|
|--> if role is master_agent
| |
| |--> [register_app_config_handler] token = 'trapsink'
| | parser = snmpd_parse_config_trapsink()
| |
| |--> [register_app_config_handler] token = 'trap2sink'
| | parser = snmpd_parse_config_trap2sink()
| |
| |--> [register_app_config_handler] token = 'informsink'
| | parser = snmpd_parse_config_informsink()
| |
| +--> [register_app_config_handler] token = 'trapsess'
| parser = snmpd_parse_config_trapsess()
|
|--> [register_app_config_handler] token = 'trapcommunity'
| parser = snmpd_parse_config_trapcommunity()
|
|--> [register_app_config_handler] token = 'agentuser'
| parser = netsnmp_parse_agent_user()
|
|--> [register_app_config_handler] token = 'agentgroup'
| parser = netsnmp_parse_agent_group()
|
|--> [register_app_config_handler] token = 'agentaddress'
| parser = snmpd_set_agent_address()
|
|--> [netsnmp_ds_register_config] * n
|
+--> [netsnmp_init_handler_conf] register parsers, add a bunch of pairs
agent/agent_handler.c
[netsnmp_init_handler_conf] : register parsers, add a bunch of pairs
|
|--> [snmpd_register_config_handler] token = 'injectHandler'
| parser = parse_injectHandler_conf()
|
|--> [snmp_register_callback] parser = handler_mark_inject_handler_done
|
+--> [se_add_pair_to_slist] * n
agent/snmp_vars.c
[_init_agent_callback_transport] : setup transport/session, open transport, copy session and add to list
-
+--> [netsnmp_callback_open] setup transport/session, open transport, copy session and add to list
snmplib/transports/snmpCallbackDomain.c
[netsnmp_callback_open] : setup transport/session, open transport, copy session and add to list
|
|--> [netsnmp_callback_transport] alloc and setup 'transport', add to list
|
|--> [snmp_sess_init] init snmp, setup session
|
|--> further setup session
|
+--> [snmp_add_full] open transport, copy session and add to list
snmplib/transports/snmpCallbackDomain.c
[netsnmp_callback_transport] : alloc and setup 'transport', add to list
|
|--> alloc 'transport'
|
|--> alloc 'callback info'
|
|--> setup 'callback info', save in 'transport'
|
|--> [pipe]
|
|--> install ops to 'transport'
|
+--> [netsnmp_transport_add_to_list] register 'transport' to list
snmplib/snmp_api.c
[snmp_sess_init] : init snmp, setup session
|
|--> [_init_snmp] generate random req_id/msg_id, regisiter protocol/port for snmp and snmptrap
|
+--> setup session
snmplib/snmp_api.c
[_init_snmp] : generate random req_id/msg_id, regisiter protocol/port for snmp and snmptrap
|
|--> [snmp_res_init] do nothing bc of disabled config
|
|--> [netsnmp_tdomain_init] print info
|
|--> get random req_id and msg_id
|
+--> regisiter protocol/port for snmp and snmptrap
snmplib/snmp_api.c
[snmp_add_full] : open transport, copy session and add to list
|
|--> [snmp_sess_add_ex] init snmp, open transport, copy session and install hooks
|
+--> add copied session to list
snmplib/snmp_api.c
[snmp_sess_add_ex] : init snmp, open transport, copy session and install hooks
|
|--> [_init_snmp] generate random req_id/msg_id, regisiter protocol/port for snmp and snmptrap
|
|--> [netsnmp_sess_config_and_open_transport] save config in 'transport', open (as client or server)
|
|--> if ->f_setup_session exists
| -
| +--> call ->f_setup_session(), e.g.,
| [netsnmp_tlsbase_session_init] setup security fields of session
|
|--> [snmp_sess_copy] copy session
|
+--> install arg hooks to internal of duplicated session
snmplib/snmp_api.c
[netsnmp_sess_config_and_open_transport] : save config in 'transport', open (as client or server)
|
|--> [netsnmp_sess_config_transport] duplicate config data and save in 'transport'
|
|--> if ->f_open exists
| -
| +--> call ->f_open(), e.g.,
| [netsnmp_tlstcp_open] connect (as client) or accept (as server)
|
+--> label 'opened' in transport
snmplib/snmp_api.c
[netsnmp_sess_config_transport] : duplicate config data and save in 'transport'
-
+--> if configuration is provided
-
+--> if transport has config
|
|--> get iterator from configuration
|
+--> for each config_data
-
+--> call ->f_config()
e.g., [netsnmp_tlsbase_config] given token, duplicate value and save in 'transport' accordingly
snmplib/transports/snmpTLSTCPDomain.c
[netsnmp_tlstcp_open] : connect (as client) or accept (as server)
|
|--> if flag has specified 'client'
| -
| +--> [netsnmp_tlstcp_open_client] setup ctx/bio/ssl_layer, connect and verify server cert
|
+--> else
-
+--> [netsnmp_tlstcp_open_server] alloc bio and do accept, setup ssl_ctx
snmplib/transports/snmpTLSTCPDomain.c
[netsnmp_tlstcp_open_client] : setup ctx/bio/ssl_layer, connect and verify server cert
|
|--> [sslctx_client_setup] alloc ssl_ctx, verify and save cert
|
|--> [BIO_new_connect] alloc bio
|
|--> [BIO_do_connect] ask bio to connect
|
|--> [SSL_new] create ssl_layer (on top of bio)
|
|--> [SSL_set_bio] bios ssl_layer and bio
|
|--> [SSL_connect] ask ssl_layer to connect (over bio)
|
|--> [netsnmp_tlsbase_verify_server_cert]
|
+--> save fd of bio in 'transport'
snmplib/transports/snmpTLSBaseDomain.c
[sslctx_client_setup] : alloc ssl_ctx, verify and save cert
|
|--> alloc and setup ssl_ctx
|
|--> [netsnmp_cert_find] find id cert
|
|--> [SSL_CTX_use_certificate] save cert in ssl_ctx
|
|--> [SSL_CTX_use_PrivateKey] save priv_key in ssl_ctx
|
|--> [SSL_CTX_check_private_key] check if pub/priv keys are compatible
|
|--> while cert exists
| -
| +--> [SSL_CTX_add_extra_chain_cert] save chained cert in ssl_ctx
|
|--> [netsnmp_cert_find] find peer cert
|
|--> if found
| -
| +--> [netsnmp_cert_trust] verify peer cert
|
|--> if tls_base has cert
| -
| +--> [_trust_this_cert]
|
+--> [_sslctx_common_setup]
snmplib/transports/snmpTLSTCPDomain.c
[netsnmp_tlstcp_open_server] : alloc bio and do accept, setup ssl_ctx
|
|--> [BIO_new_accept] alloc bio for later acception
|
|--> [BIO_new_accept]
|
|--> [sslctx_server_setup] alloc ssl_ctx, verify and save cert
|
+--> save fd of bio in 'transport'
agent/helpers/all_helpers.c
[netsnmp_init_helpers] : register helpers
|
|--> [netsnmp_init_debug_helper] create and register 'debug' handler
|
|--> [netsnmp_init_serialize] create and register 'serialize' handler
|
|--> [netsnmp_init_read_only_helper] create and register 'read_only' handler
|
|--> [netsnmp_init_bulk_to_next_helper] create and register 'bulk_to_next' handler
|
|--> [netsnmp_init_table_dataset] register table parsers
|
|--> [netsnmp_init_row_merge] register 'row_merge' handler
|
+--> [netsnmp_register_handler_by_name] register 'stash_cache' handler
snmplib/container.c
[netsnmp_container_init_list] : register container handlers
|
|--> [netsnmp_container_get_binary_array] alloc container and setup
|
|--> [netsnmp_container_binary_array_init] register container handler
|
|--> [netsnmp_container_ssll_init] register container_ssll handler
|
|--> [netsnmp_container_null_init] register container_null handler
|
|--> [netsnmp_container_register] register 'table_container' handler
|
|--> [netsnmp_container_register] register 'linked_list' handler
|
|--> [netsnmp_container_register] register 'ssll_container' handler
|
|--> [netsnmp_container_register_with_compare] register 'cstring' handler
|
|--> [netsnmp_container_register_with_compare] register 'string' handler
|
+--> [netsnmp_container_register_with_compare] register 'string_binary_array' handler
snmplib/snmp_api.c
[init_snmp]
|
|--> [_init_snmp] (do nothing bc of re-entry)
|
|--> [snmp_debug_init]
|
|--> [snmp_debug_init] register mib handlers for debug
|
|--> [netsnmp_container_init_list] (do nothing bc of re-entry)
|
|--> [init_callbacks]
|
|--> [init_snmp_logging] register mib handler for logging
|
|--> [snmp_init_statistics] (do nothing bc of disabled config)
|
|--> [register_mib_handlers] register mib handlers for types
|
|--> [register_default_handlers] register config/premib handlers
|
|--> [init_snmp_transport] register config handlers for transport
|
|--> [init_snmpv3] register callbacks for snmp_v3
|
|--> [init_snmp_alarm] register callback for alarm
|
|--> [init_snmp_enum] setup enum list and register config handler
|
|--> [init_vacm] add vacm pairs to list
|
|--> [netsnmp_certs_init] add cert pairs to list
|
|--> [read_premib_configs]
|
+--> [netsnmp_init_mib] (abort tracing)