net-snmp agent related processing(3)

NAME
net-snmp agent related processing -

  Data Structures
struct addrCache
struct _agent_nsap
struct agent_set_cache_s

  Defines
#define SNMP_NEED_REQUEST_LIST
#define SNMP_ADDRCACHE_SIZE 10
#define SNMP_ADDRCACHE_MAXAGE 300

  Typedefs
typedef _agent_nsap agent_nsap
typedef agent_set_cache_s agent_set_cache

  Enumerations
enum { SNMP_ADDRCACHE_UNUSED = 0, SNMP_ADDRCACHE_USED = 1 }

  Functions
int netsnmp_agent_check_packet (netsnmp_session *, struct netsnmp_transport_s *, void *, int)
int netsnmp_agent_check_parse (netsnmp_session *, netsnmp_pdu *, int)
void delete_subnetsnmp_tree_cache (netsnmp_agent_session *asp)
int handle_pdu (netsnmp_agent_session *asp)
This function calls into netsnmp_set_mode_request_error, sets error_value given a reqinfo->mode value.
int netsnmp_handle_request (netsnmp_agent_session *asp, int status)
int netsnmp_wrap_up_request (netsnmp_agent_session *asp, int status)
int check_delayed_request (netsnmp_agent_session *asp)
int handle_getnext_loop (netsnmp_agent_session *asp)
repeatedly calls getnext handlers looking for an answer till all requests are satisified.
int handle_set_loop (netsnmp_agent_session *asp)
int netsnmp_check_queued_chain_for (netsnmp_agent_session *asp)
int netsnmp_add_queued (netsnmp_agent_session *asp)
int netsnmp_remove_from_delegated (netsnmp_agent_session *asp)
int netsnmp_allocate_globalcacheid (void)
int netsnmp_get_local_cachid (netsnmp_cachemap *cache_store, int globalid)
netsnmp_cachemap * netsnmp_get_or_add_local_cachid (netsnmp_cachemap **cache_store, int globalid, int localid)
void netsnmp_free_cachemap (netsnmp_cachemap *cache_store)
agent_set_cache * save_set_cache (netsnmp_agent_session *asp)
int get_set_cache (netsnmp_agent_session *asp)
NETSNMP_STATIC_INLINE void _reorder_getbulk (netsnmp_agent_session *asp)
int getNextSessID ()
int agent_check_and_process (int block)
This function checks for packets arriving on the SNMP port and processes them(snmp_read) if some are found, using the select().
void netsnmp_addrcache_initialise (void)
int netsnmp_addrcache_add (const char *addr)
void netsnmp_addrcache_age (void)
int netsnmp_register_agent_nsap (netsnmp_transport *t)
void netsnmp_deregister_agent_nsap (int handle)
int init_master_agent (void)
void clear_nsap_list (void)
void shutdown_master_agent (void)
netsnmp_agent_session * init_agent_snmp_session (netsnmp_session *session, netsnmp_pdu *pdu)
void free_agent_snmp_session (netsnmp_agent_session *asp)
int netsnmp_check_for_delegated (netsnmp_agent_session *asp)
int netsnmp_check_delegated_chain_for (netsnmp_agent_session *asp)
int netsnmp_check_for_delegated_and_add (netsnmp_agent_session *asp)
int netsnmp_remove_delegated_requests_for_session (netsnmp_session *sess)
void dump_sess_list (void)
void netsnmp_remove_and_free_agent_snmp_session (netsnmp_agent_session *asp)
void netsnmp_free_agent_snmp_session_by_session (netsnmp_session *sess, void(*free_request)(netsnmp_request_list *))
int handle_snmp_packet (int op, netsnmp_session *session, int reqid, netsnmp_pdu *pdu, void *magic)
handles an incoming SNMP packet into the agent
netsnmp_request_info * netsnmp_add_varbind_to_cache (netsnmp_agent_session *asp, int vbcount, netsnmp_variable_list *varbind_ptr, netsnmp_subtree *tp)
int check_acm (netsnmp_agent_session *asp, u_char type)
int netsnmp_create_subtree_cache (netsnmp_agent_session *asp)
int netsnmp_reassign_requests (netsnmp_agent_session *asp)
void netsnmp_delete_request_infos (netsnmp_request_info *reqlist)
void netsnmp_delete_subtree_cache (netsnmp_agent_session *asp)
int netsnmp_check_requests_error (netsnmp_request_info *requests)
int netsnmp_check_requests_status (netsnmp_agent_session *asp, netsnmp_request_info *requests, int look_for_specific)
int netsnmp_check_all_requests_status (netsnmp_agent_session *asp, int look_for_specific)
int handle_var_requests (netsnmp_agent_session *asp)
void netsnmp_check_outstanding_agent_requests (void)
int netsnmp_check_transaction_id (int transaction_id)
Decide if the requested transaction_id is still being processed within the agent.
int check_getnext_results (netsnmp_agent_session *asp)
returns 1 if there are valid GETNEXT requests left.
int handle_set (netsnmp_agent_session *asp)
NETSNMP_STATIC_INLINE int _request_set_error (netsnmp_request_info *request, int mode, int error_value)
set error for a request
int netsnmp_request_set_error (netsnmp_request_info *request, int error_value)
set error for a request
NETSNMP_INLINE int netsnmp_request_set_error_all (netsnmp_request_info *requests, int error)
set error for all requests
u_long netsnmp_marker_uptime (marker_t pm)
u_long netsnmp_timeval_uptime (struct timeval *tv)
u_long netsnmp_get_agent_uptime (void)
NETSNMP_INLINE void netsnmp_agent_add_list_data (netsnmp_agent_request_info *ari, netsnmp_data_list *node)
NETSNMP_INLINE int netsnmp_agent_remove_list_data (netsnmp_agent_request_info *ari, const char *name)
NETSNMP_INLINE void * netsnmp_agent_get_list_data (netsnmp_agent_request_info *ari, const char *name)
NETSNMP_INLINE void netsnmp_free_agent_data_set (netsnmp_agent_request_info *ari)
NETSNMP_INLINE void netsnmp_free_agent_data_sets (netsnmp_agent_request_info *ari)
NETSNMP_INLINE void netsnmp_free_agent_request_info (netsnmp_agent_request_info *ari)
int netsnmp_set_request_error (netsnmp_agent_request_info *reqinfo, netsnmp_request_info *request, int error_value)
deprecated, use netsnmp_request_set_error instead
int netsnmp_set_mode_request_error (int mode, netsnmp_request_info *request, int error_value)
deprecated, use netsnmp_request_set_error instead
int netsnmp_set_all_requests_error (netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests, int error_value)
set error for all request

  Variables
oid version_sysoid [] = { SYSTEM_MIB }
int version_sysoid_len = OID_LENGTH(version_sysoid)
int log_addresses = 0
int netsnmp_running = 1
netsnmp_agent_session * agent_delegated_list = NULL
netsnmp_agent_session * netsnmp_agent_queued_list = NULL
netsnmp_session * main_session = NULL
timeval starttime

Function Documentation

  NETSNMP_STATIC_INLINE int _request_set_error (netsnmp_request_info * request, int mode, int error_value)

set error for a request

Definition at line 3276 of file snmp_agent.c.

References netsnmp_request_info_s::delegated, netsnmp_request_info_s::processed, REQUEST_IS_NOT_DELEGATED, netsnmp_request_info_s::requestvb, snmp_log(), netsnmp_request_info_s::status, and variable_list::type.

Referenced by netsnmp_request_set_error(), netsnmp_request_set_error_all(), netsnmp_set_mode_request_error(), and netsnmp_set_request_error().

  int agent_check_and_process (int block)

This function checks for packets arriving on the SNMP port and processes them(snmp_read) if some are found, using the select().

If block is non zero, the function call blocks until a packet arrives

Parameters:
    block used to control blocking in the select() function, 1 = block forever, and 0 = don't block

Returns:
    Returns a positive integer if packets were processed, and -1 if an error was found.

Definition at line 562 of file snmp_agent.c.

References FD_ZERO, netsnmp_check_outstanding_agent_requests(), NULL, run_alarms(), snmp_log(), snmp_log_perror(), snmp_read(), snmp_select_info(), and snmp_timeout().

  int check_getnext_results (netsnmp_agent_session * asp)

returns 1 if there are valid GETNEXT requests left.

Returns 0 if not.

Definition at line 2692 of file snmp_agent.c.

References netsnmp_request_info_s::inclusive, netsnmp_request_info_s::index, netsnmp_agent_session_s::mode, netsnmp_request_info_s::next, NULL, netsnmp_agent_session_s::oldmode, netsnmp_request_info_s::requestvb, snmp_set_var_typed_value(), netsnmp_agent_session_s::treecache, and netsnmp_agent_session_s::treecache_num.

Referenced by handle_getnext_loop().

  int handle_getnext_loop (netsnmp_agent_session * asp)

repeatedly calls getnext handlers looking for an answer till all requests are satisified.

It's expected that one pass has been made before entering this function

Definition at line 2797 of file snmp_agent.c.

References check_acm(), check_getnext_results(), handle_var_requests(), netsnmp_check_for_delegated(), netsnmp_reassign_requests(), netsnmp_running, and variable_list::next_variable.

Referenced by check_delayed_request(), and handle_pdu().

  int handle_pdu (netsnmp_agent_session * asp)

This function calls into netsnmp_set_mode_request_error, sets error_value given a reqinfo->mode value.

It's used to send specific errors back to the agent to process accordingly.

If error_value is set to SNMP_NOSUCHOBJECT, SNMP_NOSUCHINSTANCE, or SNMP_ENDOFMIBVIEW the following is applicable: Sets the error_value to request->requestvb->type if reqinfo->mode value is set to MODE_GET. If the reqinfo->mode value is set to MODE_GETNEXT or MODE_GETBULK the code calls snmp_log logging an error message.

Otherwise, the request->status value is checked, if it's < 0 snmp_log is called with an error message and SNMP_ERR_GENERR is assigned to request->status. If the request->status value is >= 0 the error_value is set to request->status.

Parameters:
    reqinfo is a pointer to the netsnmp_agent_request_info struct. It contains the reqinfo->mode which is required to set error_value or log error messages.
    request is a pointer to the netsnmp_request_info struct. The error_value is set to request->requestvb->type
    error_value is the exception value you want to set, below are possible values.

    •   SNMP_NOSUCHOBJECT

    •   SNMP_NOSUCHINSTANCE

    •   SNMP_ENDOFMIBVIEW

    •   SNMP_ERR_NOERROR

    •   SNMP_ERR_TOOBIG

    •   SNMP_ERR_NOSUCHNAME

    •   SNMP_ERR_BADVALUE

    •   SNMP_ERR_READONLY

    •   SNMP_ERR_GENERR

    •   SNMP_ERR_NOACCESS

    •   SNMP_ERR_WRONGTYPE

    •   SNMP_ERR_WRONGLENGTH

    •   SNMP_ERR_WRONGENCODING

    •   SNMP_ERR_WRONGVALUE

    •   SNMP_ERR_NOCREATION

    •   SNMP_ERR_INCONSISTENTVALUE

    •   SNMP_ERR_RESOURCEUNAVAILABLE

    •   SNMP_ERR_COMMITFAILED

    •   SNMP_ERR_UNDOFAILED

    •   SNMP_ERR_AUTHORIZATIONERROR

    •   SNMP_ERR_NOTWRITABLE

    •   SNMP_ERR_INCONSISTENTNAME

Returns:
    Returns error_value under all conditions.

Definition at line 3091 of file snmp_agent.c.

References check_acm(), snmp_pdu::command, count_varbinds(), snmp_pdu::flags, get_set_cache(), handle_getnext_loop(), handle_set_loop(), handle_var_requests(), netsnmp_agent_session_s::mode, netsnmp_create_subtree_cache(), variable_list::next_variable, NULL, netsnmp_agent_session_s::oldmode, netsnmp_agent_session_s::pdu, netsnmp_agent_session_s::requests, snmp_increment_statistic(), snmp_replace_var_types(), snmp_set_var_typed_value(), netsnmp_agent_session_s::status, variable_list::type, snmp_pdu::variables, and netsnmp_agent_session_s::vbcount.

Referenced by netsnmp_handle_request().

  int handle_snmp_packet (int op, netsnmp_session * session, int reqid, netsnmp_pdu * pdu, void * magic)

handles an incoming SNMP packet into the agent

Definition at line 1731 of file snmp_agent.c.

References check_access(), snmp_pdu::command, snmp_pdu::errstat, init_agent_snmp_session(), netsnmp_handle_request(), netsnmp_remove_and_free_agent_snmp_session(), NULL, netsnmp_agent_session_s::pdu, snmp_session::s_snmp_errno, send_easy_trap(), netsnmp_agent_session_s::session, snmp_free_pdu(), snmp_increment_statistic(), snmp_send(), netsnmp_agent_session_s::status, and snmp_pdu::version.

Referenced by netsnmp_register_agent_nsap().

  netsnmp_request_info* netsnmp_add_varbind_to_cache (netsnmp_agent_session * asp, int vbcount, netsnmp_variable_list * varbind_ptr, netsnmp_subtree * tp)

Todo
    make this be more intelligent about ranges. Right now we merely take the highest level commonality of a registration range and use that. At times we might be able to be smarter about checking the range itself as opposed to the node above where the range exists, but I doubt this will come up all that frequently.

Definition at line 1832 of file snmp_agent.c.

References netsnmp_request_info_s::agent_req_info, netsnmp_agent_session_s::cache_store, netsnmp_subtree_s::cacheid, snmp_pdu::command, netsnmp_request_info_s::delegated, netsnmp_subtree_s::end_a, netsnmp_subtree_s::end_len, netsnmp_subtree_s::global_cacheid, netsnmp_request_info_s::inclusive, netsnmp_request_info_s::index, variable_list::name, variable_list::name_length, netsnmp_acm_check_subtree(), netsnmp_free_request_data_sets(), netsnmp_get_local_cachid(), netsnmp_get_or_add_local_cachid(), netsnmp_oid_find_prefix(), netsnmp_request_info_s::next, netsnmp_subtree_s::next, NULL, netsnmp_request_info_s::parent_data, netsnmp_agent_session_s::pdu, netsnmp_request_info_s::prev, netsnmp_request_info_s::processed, netsnmp_request_info_s::range_end, netsnmp_request_info_s::range_end_len, netsnmp_agent_session_s::reqinfo, netsnmp_agent_session_s::requests, netsnmp_tree_cache_s::requests_begin, netsnmp_tree_cache_s::requests_end, netsnmp_request_info_s::requestvb, netsnmp_request_info_s::requestvb_start, netsnmp_subtree_s::start_a, netsnmp_subtree_s::start_len, netsnmp_request_info_s::status, netsnmp_tree_cache_s::subtree, netsnmp_request_info_s::subtree, netsnmp_agent_session_s::treecache, netsnmp_agent_session_s::treecache_len, netsnmp_agent_session_s::treecache_num, and variable_list::type.

  int netsnmp_check_transaction_id (int transaction_id)

Decide if the requested transaction_id is still being processed within the agent.

This is used to validate whether a delayed cache (containing possibly freed pointers) is still usable.

returns SNMPERR_SUCCESS if it's still valid, or SNMPERR_GENERR if not.

Definition at line 2602 of file snmp_agent.c.

References agent_delegated_list, netsnmp_agent_session_s::next, and NULL.

Referenced by check_delayed_request(), and netsnmp_handler_check_cache().

  int netsnmp_request_set_error (netsnmp_request_info * request, int error_value)

set error for a request

Parameters:
    request request which has error
    error_value error value for request

Definition at line 3344 of file snmp_agent.c.

References _request_set_error(), netsnmp_request_info_s::agent_req_info, and netsnmp_agent_request_info_s::mode.

Referenced by netsnmp_remove_delegated_requests_for_session().

  NETSNMP_INLINE int netsnmp_request_set_error_all (netsnmp_request_info * requests, int error)

set error for all requests

Parameters:
    requests request list
    error error value for requests

Returns:
    SNMPERR_SUCCESS, or an error code

paranoid sanity checks

Definition at line 3359 of file snmp_agent.c.

References _request_set_error(), netsnmp_request_info_s::agent_req_info, netsnmp_agent_request_info_s::mode, netsnmp_request_info_s::next, NULL, and snmp_log().

Referenced by netsnmp_set_all_requests_error().

  int netsnmp_set_all_requests_error (netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests, int error_value)

set error for all request

Deprecated
    use netsnmp_request_set_error_all

Parameters:
    reqinfo agent_request_info pointer for requests
    requests request list
    error_value error value for requests

Returns:
    error_value

Definition at line 3533 of file snmp_agent.c.

References netsnmp_request_set_error_all().

Referenced by netsnmp_cache_helper_handler(), netsnmp_multiplexer_helper_handler(), and netsnmp_read_only_helper().

  int netsnmp_set_mode_request_error (int mode, netsnmp_request_info * request, int error_value)

deprecated, use netsnmp_request_set_error instead

Deprecated
    , use netsnmp_request_set_error instead

Parameters:
    mode Net-SNMP agent processing mode
    request request_info pointer
    error_value error value for requests

Returns:
    error_value

Definition at line 3517 of file snmp_agent.c.

References _request_set_error().

  int netsnmp_set_request_error (netsnmp_agent_request_info * reqinfo, netsnmp_request_info * request, int error_value)

deprecated, use netsnmp_request_set_error instead

Deprecated
    , use netsnmp_request_set_error instead

Parameters:
    reqinfo agent_request_info pointer for request
    request request_info pointer
    error_value error value for requests

Returns:
    error_value

Examples:
delayed_instance.c.

Definition at line 3498 of file snmp_agent.c.

References _request_set_error(), and netsnmp_agent_request_info_s::mode.

Referenced by netsnmp_call_handlers(), netsnmp_instance_counter32_handler(), netsnmp_instance_helper_handler(), netsnmp_instance_int_handler(), netsnmp_instance_long_handler(), netsnmp_instance_ulong_handler(), netsnmp_scalar_group_helper_handler(), netsnmp_scalar_helper_handler(), netsnmp_table_data_set_helper_handler(), netsnmp_watched_timestamp_handler(), netsnmp_watcher_helper_handler(), and table_helper_handler().

  int netsnmp_wrap_up_request (netsnmp_agent_session * asp, int status)

if asp->pdu

Definition at line 1482 of file snmp_agent.c.

References _reorder_getbulk(), snmp_pdu::command, count_varbinds(), snmp_pdu::errindex, snmp_pdu::errstat, netsnmp_agent_session_s::index, variable_list::name, variable_list::name_length, netsnmp_remove_and_free_agent_snmp_session(), variable_list::next_variable, NULL, netsnmp_agent_session_s::orig_pdu, netsnmp_agent_session_s::pdu, save_set_cache(), netsnmp_agent_session_s::session, SNMP_FREE, snmp_free_pdu(), snmp_increment_statistic(), snmp_increment_statistic_by(), snmp_log(), snmp_perror(), snmp_send(), sprint_realloc_objid(), netsnmp_agent_session_s::status, variable_list::type, snmp_pdu::variables, and snmp_pdu::version.

Referenced by check_delayed_request(), and netsnmp_handle_request().