/* * check a session validity for connectivity to the master agent. If * not functioning, close and start attempts to reopen the session */ void agentx_check_session(unsigned int clientreg, void *clientarg) { netsnmp_session *ss = (netsnmp_session *) clientarg; if (!ss) { if (clientreg) snmp_alarm_unregister(clientreg); return; } DEBUGMSGTL(("agentx/subagent", "checking status of session %p\n", ss)); if (!agentx_send_ping(ss)) { snmp_log(LOG_WARNING, "AgentX master agent failed to respond to ping. Attempting to re-register.\n"); /* * master agent disappeared? Try and re-register. * close first, just to be sure . */ agentx_unregister_callbacks(ss); agentx_close_session(ss, AGENTX_CLOSE_TIMEOUT); snmp_alarm_unregister(clientreg); /* delete ping alarm timer */ snmp_call_callbacks(SNMP_CALLBACK_APPLICATION, SNMPD_CALLBACK_INDEX_STOP, (void *) ss); snmp_close(main_session); main_session = NULL; agentx_reopen_session(0, NULL); } else { DEBUGMSGTL(("agentx/subagent", "session %p responded to ping\n", ss)); } }
/* * check a session validity for connectivity to the master agent. If * not functioning, close and start attempts to reopen the session */ void agentx_check_session (unsigned int clientreg, void *clientarg) { netsnmp_session *ss = (netsnmp_session *) clientarg; if (!ss) { if (clientreg) snmp_alarm_unregister (clientreg); return; } DEBUGMSGTL (("agentx/subagent", "checking status of session %p\n", ss)); if (!agentx_send_ping (ss)) { snmp_log (LOG_WARNING, "AgentX master agent failed to respond to ping. Attempting to re-register.\n"); /* * master agent disappeared? Try and re-register. * close first, just to be sure . */ agentx_unregister_callbacks (ss); agentx_close_session (ss, AGENTX_CLOSE_TIMEOUT); snmp_alarm_unregister (clientreg); /* delete ping alarm timer */ snmp_call_callbacks (SNMP_CALLBACK_APPLICATION, SNMPD_CALLBACK_INDEX_STOP, (void *) ss); register_mib_detach (); if (main_session != NULL) { remove_trap_session (ss); snmp_close (main_session); /* * We need to remove the callbacks attached to the callback * session because they have a magic callback data structure * which includes a pointer to the main session * (which is no longer valid). * * Given that the main session is not responsive anyway. * it shoudn't matter if we lose some outstanding requests. */ if (agentx_callback_sess != NULL) { snmp_close (agentx_callback_sess); agentx_callback_sess = NULL; subagent_init_callback_session (); } main_session = NULL; agentx_reopen_session (0, NULL); } else { snmp_close (main_session); main_session = NULL; } } else { DEBUGMSGTL (("agentx/subagent", "session %p responded to ping\n", ss)); } }
static int subagent_shutdown(int majorID, int minorID, void *serverarg, void *clientarg) { netsnmp_session *thesession = (netsnmp_session *)clientarg; DEBUGMSGTL(("agentx/subagent", "shutting down session....\n")); if (thesession == NULL) { DEBUGMSGTL(("agentx/subagent", "Empty session to shutdown\n")); main_session = NULL; return 0; } agentx_close_session(thesession, AGENTX_CLOSE_SHUTDOWN); snmp_close(thesession); main_session = NULL; DEBUGMSGTL(("agentx/subagent", "shut down finished.\n")); return 1; }