Logo
Home page Net-SNMP

Archive Search:

Require all words?

Site Search:
Google
snmp_agent.h File Reference
Main Page   Data Structures   File List   Data Fields   Globals  

snmp_agent.h File Reference

#include "snmp_impl.h"
#include "tools.h"
#include "data_list.h"

Go to the source code of this file.


Data Structures

struct  _set_info
struct  agent_request_info_s
struct  agent_snmp_session
struct  request_info_s
struct  tree_cache_s

Defines

#define SNMP_MAX_PDU_SIZE   64000
#define AUTO_FREE_STATEREF   0x01
#define AUTO_FREE_OLDDATA   0x02
#define AUTO_UNDO   0x03
#define MODE_GET   SNMP_MSG_GET
#define MODE_GETNEXT   SNMP_MSG_GETNEXT
#define MODE_GETBULK   SNMP_MSG_GETBULK
#define MODE_IS_GET(x)   (x == SNMP_MSG_GET || x == SNMP_MSG_GETNEXT || x == SNMP_MSG_GETBULK)
#define MODE_SET_BEGIN   SNMP_MSG_INTERNAL_SET_BEGIN
#define MODE_SET_RESERVE1   SNMP_MSG_INTERNAL_SET_RESERVE1
#define MODE_SET_RESERVE2   SNMP_MSG_INTERNAL_SET_RESERVE2
#define MODE_SET_ACTION   SNMP_MSG_INTERNAL_SET_ACTION
#define MODE_SET_COMMIT   SNMP_MSG_INTERNAL_SET_COMMIT
#define MODE_SET_FREE   SNMP_MSG_INTERNAL_SET_FREE
#define MODE_SET_UNDO   SNMP_MSG_INTERNAL_SET_UNDO
#define MODE_IS_SET(x)   (!MODE_IS_GET(x))

Typedefs

typedef request_info_s request_info
typedef _set_info set_info
typedef tree_cache_s tree_cache
typedef agent_request_info_s agent_request_info

Functions

void snmp_addrcache_initialise (void)
void snmp_addrcache_age (void)
int handle_snmp_packet (int, struct snmp_session *, int, struct snmp_pdu *, void *)
 handles an incoming SNMP packet into the agent. More...

int handle_next_pass (struct agent_snmp_session *)
int handle_var_list (struct agent_snmp_session *)
int handle_one_var (struct agent_snmp_session *, struct variable_list *varbind_ptr)
void snmp_agent_parse_config (char *, char *)
agent_snmp_sessioninit_agent_snmp_session (struct snmp_session *, struct snmp_pdu *)
void free_agent_snmp_session (struct agent_snmp_session *)
void remove_and_free_agent_snmp_session (struct agent_snmp_session *asp)
int getNextSessID (void)
void dump_sess_list (void)
int init_master_agent (void)
int agent_check_and_process (int block)
agent_snmp_sessionget_current_agent_session (void)
void check_outstanding_agent_requests (int status)
int set_mode_request_error (int mode, request_info *request, int error_value)
int set_request_error (agent_request_info *reqinfo, request_info *request, int error_value)
int set_all_requests_error (agent_request_info *reqinfo, request_info *requests, int error_value)
int marker_uptime (marker_t pm)
int timeval_uptime (struct timeval *tv)
int get_agent_uptime (void)
int check_transaction_id (int transaction_id)
 Decide if the requested transaction_id is still being processed within the agent. More...

int snmp_check_packet (struct snmp_session *, struct _snmp_transport *, void *, int)
int snmp_check_parse (struct snmp_session *, struct snmp_pdu *, int)
int register_agent_nsap (struct _snmp_transport *t)
void deregister_agent_nsap (int handle)
void agent_add_list_data (agent_request_info *agent, data_list *node)
void * agent_get_list_data (agent_request_info *agent, const char *name)
void free_agent_data_set (agent_request_info *agent)
void free_agent_data_sets (agent_request_info *agent)
void free_agent_request_info (agent_request_info *ari)

Variables

int log_addresses
int lastAddrAge

Define Documentation

#define AUTO_FREE_OLDDATA   0x02
 

Definition at line 55 of file snmp_agent.h.

#define AUTO_FREE_STATEREF   0x01
 

Definition at line 54 of file snmp_agent.h.

#define AUTO_UNDO   0x03
 

Definition at line 56 of file snmp_agent.h.

#define MODE_GET   SNMP_MSG_GET
 

Definition at line 66 of file snmp_agent.h.

#define MODE_GETBULK   SNMP_MSG_GETBULK
 

Definition at line 68 of file snmp_agent.h.

#define MODE_GETNEXT   SNMP_MSG_GETNEXT
 

Definition at line 67 of file snmp_agent.h.

#define MODE_IS_GET      (x == SNMP_MSG_GET || x == SNMP_MSG_GETNEXT || x == SNMP_MSG_GETBULK)
 

Definition at line 69 of file snmp_agent.h.

#define MODE_IS_SET      (!MODE_IS_GET(x))
 

Definition at line 78 of file snmp_agent.h.

Referenced by add_varbind_to_cache(), create_subtree_cache(), table_array_helper_handler(), table_data_set_helper_handler(), and table_helper_handler().

#define MODE_SET_ACTION   SNMP_MSG_INTERNAL_SET_ACTION
 

Definition at line 74 of file snmp_agent.h.

#define MODE_SET_BEGIN   SNMP_MSG_INTERNAL_SET_BEGIN
 

Definition at line 71 of file snmp_agent.h.

#define MODE_SET_COMMIT   SNMP_MSG_INTERNAL_SET_COMMIT
 

Definition at line 75 of file snmp_agent.h.

#define MODE_SET_FREE   SNMP_MSG_INTERNAL_SET_FREE
 

Definition at line 76 of file snmp_agent.h.

#define MODE_SET_RESERVE1   SNMP_MSG_INTERNAL_SET_RESERVE1
 

Definition at line 72 of file snmp_agent.h.

#define MODE_SET_RESERVE2   SNMP_MSG_INTERNAL_SET_RESERVE2
 

Definition at line 73 of file snmp_agent.h.

#define MODE_SET_UNDO   SNMP_MSG_INTERNAL_SET_UNDO
 

Definition at line 77 of file snmp_agent.h.

#define SNMP_MAX_PDU_SIZE   64000
 

Definition at line 18 of file snmp_agent.h.


Typedef Documentation

typedef struct agent_request_info_s agent_request_info
 

typedef struct request_info_s request_info
 

typedef struct _set_info set_info
 

typedef struct tree_cache_s tree_cache
 


Function Documentation

void agent_add_list_data agent_request_info   agent,
data_list *    node
[inline]
 

Definition at line 1939 of file snmp_agent.c.

Referenced by process_set_requests().

01940 {
01941   if (ari) {
01942     if (ari->agent_data)
01943       add_list_data(&ari->agent_data, node);
01944     else
01945       ari->agent_data = node;
01946   }
01947 }

int agent_check_and_process int    block
 

Definition at line 256 of file snmp_agent.c.

00256                                    {
00257   int numfds;
00258   fd_set fdset;
00259   struct timeval timeout = { LONG_MAX, 0 }, *tvp = &timeout;
00260   int count;
00261   int fakeblock=0;
00262   
00263   numfds = 0;
00264   FD_ZERO(&fdset);
00265   snmp_select_info(&numfds, &fdset, tvp, &fakeblock);
00266   if (block != 0 && fakeblock != 0) {
00267     /*  There are no alarms registered, and the caller asked for blocking, so
00268         let select() block forever.  */
00269 
00270     tvp = NULL;
00271   } else if (block != 0 && fakeblock == 0) {
00272     /*  The caller asked for blocking, but there is an alarm due sooner than
00273         LONG_MAX seconds from now, so use the modified timeout returned by
00274         snmp_select_info as the timeout for select().  */
00275 
00276   } else if (block == 0) {
00277     /*  The caller does not want us to block at all.  */
00278 
00279     tvp->tv_sec  = 0;
00280     tvp->tv_usec = 0;
00281   }
00282 
00283   count = select(numfds, &fdset, 0, 0, tvp);
00284 
00285   if (count > 0) {
00286     /* packets found, process them */
00287     snmp_read(&fdset);
00288   } else switch(count) {
00289     case 0:
00290       snmp_timeout();
00291       break;
00292     case -1:
00293       if (errno != EINTR) {
00294         snmp_log_perror("select");
00295       }
00296       return -1;
00297     default:
00298       snmp_log(LOG_ERR, "select returned %d\n", count);
00299       return -1;
00300   }  /* endif -- count>0 */
00301 
00302   /*  Run requested alarms.  */
00303   run_alarms();
00304 
00305   return count;
00306 }

void* agent_get_list_data agent_request_info   agent,
const char *    name
[inline]
 

Definition at line 1950 of file snmp_agent.c.

Referenced by table_helper_handler().

01951 {
01952   if (ari)
01953     return get_list_data(ari->agent_data,name);
01954   return NULL;
01955 }

void check_outstanding_agent_requests int    status
 

Definition at line 1455 of file snmp_agent.c.

Referenced by main().

01455                                              {
01456     struct agent_snmp_session *asp, *prev_asp = NULL, *next_asp = NULL;
01457 
01458     for(asp = agent_delegated_list; asp; prev_asp = asp, asp = next_asp) {
01459         next_asp = asp->next; /* save in case we clean up asp */
01460         if (!check_for_delegated(asp)) {
01461 
01462             /* we're done with this one, remove from queue */
01463             if (prev_asp != NULL)
01464                 prev_asp->next = asp->next;
01465             else
01466                 agent_delegated_list = asp->next;
01467 
01468             /* continue processing or finish up */
01469             check_delayed_request(asp);
01470         }
01471     }
01472 }

int 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 1480 of file snmp_agent.c.

Referenced by handler_check_cache().

01481 {
01482     struct agent_snmp_session *asp, *prev_asp = NULL;
01483 
01484     for(asp = agent_delegated_list; asp; prev_asp = asp, asp = asp->next) {
01485         if (asp->pdu->transid == transaction_id)
01486             return SNMPERR_SUCCESS;
01487     }
01488     return SNMPERR_GENERR;
01489 }

void deregister_agent_nsap int    handle
 

Definition at line 580 of file snmp_agent.c.

00581 {
00582   agent_nsap *a = NULL, **prevNext = &agent_nsap_list;
00583   int main_session_deregistered = 0;
00584 
00585   DEBUGMSGTL(("deregister_agent_nsap", "handle %d\n", handle));
00586 
00587   for (a = agent_nsap_list; a != NULL && a->handle < handle; a = a->next) {
00588     prevNext = &(a->next);
00589   }
00590 
00591   if (a != NULL && a->handle == handle) {
00592     *prevNext = a->next;
00593     if (main_session == snmp_sess_session(a->s)) {
00594       main_session_deregistered = 1;
00595     }
00596     snmp_close(snmp_sess_session(a->s));
00597     /*  The above free()s the transport and session pointers.  */
00598     free(a);
00599   }
00600 
00601   /*  If we've deregistered the session that main_session used to point to,
00602       then make it point to another one, or in the last resort, make it equal
00603       to NULL.  Basically this shouldn't ever happen in normal operation
00604       because main_session starts off pointing at the first session added by
00605       init_master_agent(), which then discards the handle.  */
00606 
00607   if (main_session_deregistered) {
00608     if (agent_nsap_list != NULL) {
00609       DEBUGMSGTL(("snmp_agent",
00610                   "WARNING: main_session pointer changed from %p to %p\n",
00611                   main_session, snmp_sess_session(agent_nsap_list->s)));
00612       main_session = snmp_sess_session(agent_nsap_list->s);
00613     } else {
00614       DEBUGMSGTL(("snmp_agent",
00615                   "WARNING: main_session pointer changed from %p to NULL\n",
00616                   main_session));
00617       main_session = NULL;
00618     }
00619   }
00620 }

void dump_sess_list void   
 

Definition at line 972 of file snmp_agent.c.

00973 {
00974     struct agent_snmp_session *a;
00975     
00976     DEBUGMSGTL(("snmp_agent", "DUMP agent_sess_list -> "));
00977     for (a = agent_session_list; a != NULL; a = a->next) {
00978         DEBUGMSG(("snmp_agent", "%08p[session %08p] -> ", a, a->session));
00979     }
00980     DEBUGMSG(("snmp_agent", "[NIL]\n"));
00981 }

void free_agent_data_set agent_request_info   agent [inline]
 

Definition at line 1958 of file snmp_agent.c.

01959 {
01960   if (ari)
01961     free_list_data(ari->agent_data);
01962 }

void free_agent_data_sets agent_request_info   agent [inline]
 

Definition at line 1965 of file snmp_agent.c.

Referenced by table_helper_handler().

01966 {
01967   if (ari)
01968     free_all_list_data(ari->agent_data);
01969 }

void free_agent_request_info agent_request_info   ari [inline]
 

Definition at line 1972 of file snmp_agent.c.

Referenced by free_agent_snmp_session().

01973 {
01974     if (ari) {
01975         if (ari->agent_data)
01976             free_all_list_data(ari->agent_data);
01977         free(ari);
01978     }
01979 }

void free_agent_snmp_session struct agent_snmp_session   asp
 

Definition at line 840 of file snmp_agent.c.

Referenced by free_agent_snmp_session_by_session(), and remove_and_free_agent_snmp_session().

00841 {
00842     if (!asp)
00843         return;
00844     if (asp->orig_pdu)
00845         snmp_free_pdu(asp->orig_pdu);
00846     if (asp->pdu)
00847         snmp_free_pdu(asp->pdu);
00848     if (asp->reqinfo)
00849         free_agent_request_info(asp->reqinfo);
00850     if (asp->treecache) {
00851         delete_subtree_cache(asp);
00852         free(asp->treecache);
00853     }
00854     free(asp);
00855 }

int getNextSessID void   
 

Definition at line 248 of file snmp_agent.c.

00249 {
00250     static int SessionID = 0;
00251 
00252     return ++SessionID;
00253 }

int get_agent_uptime void   
 

Definition at line 1928 of file snmp_agent.c.

01928                          {
01929 
01930         struct timeval now;
01931         gettimeofday(&now, NULL);
01932 
01933         return timeval_uptime( &now );
01934 }

struct agent_snmp_session* get_current_agent_session void   
 

Definition at line 22 of file old_api.c.

Referenced by old_api_helper().

00022                             {
00023     return current_agent_session;
00024 }

int handle_next_pass struct agent_snmp_session  
 

int handle_one_var struct agent_snmp_session  ,
struct variable_list *    varbind_ptr
 

int handle_snmp_packet int    op,
struct snmp_session *    session,
int    reqid,
struct snmp_pdu *    pdu,
void *    magic
 

handles an incoming SNMP packet into the agent.

Definition at line 1030 of file snmp_agent.c.

01032 {
01033     struct agent_snmp_session  *asp;
01034     int status, access_ret;
01035     struct variable_list *var_ptr;
01036 
01037     /* we only support receiving here */
01038     if (op != SNMP_CALLBACK_OP_RECEIVED_MESSAGE) {
01039       return 1;
01040     }
01041 
01042     /* new request */
01043     asp = init_agent_snmp_session( session, pdu );
01044     status = SNMP_ERR_NOERROR;
01045 
01046     /* initial access check.  Is request user/community allowed to do
01047        anything at all? If not, abondon all hope here. */
01048     if ((access_ret = check_access(pdu)) != 0) {
01049         if (access_ret == VACM_NOSUCHCONTEXT) {
01050             /* rfc2573 section 3.2, step 5 says that we increment the
01051                counter but don't return a response of any kind */
01052                
01053             /* we currently don't support unavailable contexts, as
01054                there is no reason to that I currently know of */
01055             snmp_increment_statistic(STAT_SNMPUNKNOWNCONTEXTS);
01056 
01057             /* drop the request */
01058             remove_and_free_agent_snmp_session( asp );
01059             return 0;
01060         } else {
01061             /* access control setup is incorrect */
01062             send_easy_trap(SNMP_TRAP_AUTHFAIL, 0);
01063             if (asp->pdu->version != SNMP_VERSION_1 &&
01064                 asp->pdu->version != SNMP_VERSION_2c) {
01065                 asp->pdu->errstat = SNMP_ERR_AUTHORIZATIONERROR;
01066                 asp->pdu->command = SNMP_MSG_RESPONSE;
01067                 snmp_increment_statistic(STAT_SNMPOUTPKTS);
01068                 if (! snmp_send( asp->session, asp->pdu ))
01069                     snmp_free_pdu(asp->pdu);
01070                 asp->pdu = NULL;
01071                 remove_and_free_agent_snmp_session(asp);
01072                 return 1;
01073             } else {
01074                 /* drop the request */
01075                 remove_and_free_agent_snmp_session( asp );
01076                 return 0;
01077             }
01078         }
01079     }
01080 
01081     /* process the request */
01082     status = handle_pdu(asp);
01083 
01084     /* print the results in approrpiate debugging mode */
01085     DEBUGIF("results") {
01086         DEBUGMSGTL(("results","request results (status = %d): \n", status));
01087         for(var_ptr = asp->pdu->variables; var_ptr;
01088             var_ptr = var_ptr->next_variable) {
01089             char buf[SPRINT_MAX_LEN];
01090             sprint_variable(buf, var_ptr->name, var_ptr->name_length, var_ptr);
01091             DEBUGMSGTL(("results","  %s\n", buf));
01092         }
01093     }
01094 
01095     /* check for uncompleted requests */
01096     if (check_for_delegated(asp)) {
01097         /* add to delegated request chain */
01098         asp->status = status;
01099         asp->next = agent_delegated_list;
01100         agent_delegated_list = asp;
01101     } else {
01102         /* if we don't have anything outstanding (delegated), wrap up */
01103         return wrap_up_request(asp, status);
01104     }
01105 
01106     /* done */
01107     DEBUGMSGTL(("snmp_agent", "end of handle_snmp_packet, asp = %08p\n", asp));
01108     return 1;
01109 }

int handle_var_list struct agent_snmp_session  
 

struct agent_snmp_session* init_agent_snmp_session struct snmp_session *    session,
struct snmp_pdu *    pdu
 

Definition at line 812 of file snmp_agent.c.

Referenced by handle_snmp_packet().

00813 {
00814     struct agent_snmp_session  *asp;
00815 
00816     asp = (struct agent_snmp_session *) calloc(1, sizeof( struct agent_snmp_session ));
00817 
00818     if ( asp == NULL )
00819         return NULL;
00820     asp->session = session;
00821     asp->pdu      = snmp_clone_pdu(pdu);
00822     asp->orig_pdu = snmp_clone_pdu(pdu);
00823     asp->rw      = READ;
00824     asp->exact   = TRUE;
00825     asp->next    = NULL;
00826     asp->mode    = RESERVE1;
00827     asp->status  = SNMP_ERR_NOERROR;
00828     asp->index   = 0;
00829 
00830     asp->start = asp->pdu->variables;
00831     asp->end   = asp->pdu->variables;
00832     if ( asp->end != NULL )
00833         while ( asp->end->next_variable != NULL )
00834             asp->end = asp->end->next_variable;
00835 
00836     return asp;
00837 }

int init_master_agent void   
 

Definition at line 648 of file snmp_agent.c.

00649 {
00650   snmp_transport *transport;
00651   char *cptr, *cptr2;
00652   char buf[SPRINT_MAX_LEN];
00653 
00654   if (ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_ROLE) != MASTER_AGENT) {
00655     DEBUGMSGTL(("snmp_agent", "init_master_agent; not master agent\n"));
00656     return 0; /*  No error if ! MASTER_AGENT  */
00657   }
00658 
00659 #ifdef USING_AGENTX_MASTER_MODULE
00660     if ( ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_AGENTX_MASTER) == 1 )
00661         real_init_master();
00662 #endif
00663 
00664   /*  Have specific agent ports been specified?  */
00665   cptr = ds_get_string(DS_APPLICATION_ID, DS_AGENT_PORTS);
00666 
00667   if (cptr) {
00668     sprintf(buf, "%s", cptr);
00669   } else {
00670     /*  No, so just specify the default port.  */
00671     if (ds_get_int(DS_APPLICATION_ID, DS_AGENT_FLAGS) &
00672         SNMP_FLAGS_STREAM_SOCKET) {
00673       sprintf(buf, "tcp:%d", SNMP_PORT);
00674     } else {
00675       sprintf(buf, "udp:%d", SNMP_PORT);
00676     }
00677   }
00678 
00679   DEBUGMSGTL(("snmp_agent", "final port spec: %s\n", buf));
00680   cptr = strtok(buf, ",");
00681   while (cptr) {
00682     /*  Specification format: 
00683         
00684         NONE:                     (a pseudo-transport)
00685         UDP:[address:]port        (also default if no transport is specified)
00686         TCP:[address:]port        (if supported)
00687         Unix:pathname             (if supported)
00688         AAL5PVC:itf.vpi.vci       (if supported)
00689         IPX:[network]:node[/port] (if supported)
00690 
00691     */
00692 
00693     DEBUGMSGTL(("snmp_agent", "installing master agent on port %s\n", cptr));
00694 
00695     if (!cptr || !(*cptr)) {
00696       snmp_log(LOG_ERR, "improper port specification\n");
00697       return 1;
00698     }
00699 
00700     /*  Transport type specifier?  */
00701 
00702     if ((cptr2 = strchr(cptr, ':')) != NULL) {
00703       if (strncasecmp(cptr, "none", 4) == 0) {
00704         DEBUGMSGTL(("snmp_agent",
00705                  "init_master_agent; pseudo-transport \"none\" requested\n"));
00706         return 0;
00707       } else if (strncasecmp(cptr, "tcp", 3) == 0) {
00708 #ifdef SNMP_TRANSPORT_TCP_DOMAIN
00709         struct sockaddr_in addr;
00710         if (snmp_sockaddr_in(&addr, cptr2+1, 0)) {
00711           transport = snmp_tcp_transport(&addr, 1);
00712         } else {
00713           snmp_log(LOG_ERR,
00714                    "Badly formatted IP address (should be [a.b.c.d:]p)\n");
00715           return 1;
00716         }
00717 #else
00718         snmp_log(LOG_ERR, "No support for requested TCP domain\n");
00719         return 1;
00720 #endif
00721       } else if (strncasecmp(cptr, "ipx", 3) == 0) {
00722 #ifdef SNMP_TRANSPORT_IPX_DOMAIN
00723         struct sockaddr_ipx addr;
00724         if (snmp_sockaddr_ipx(&addr, cptr2+1)) {
00725           transport = snmp_ipx_transport(&addr, 1);
00726         } else {
00727           snmp_log(LOG_ERR,
00728                "Badly formatted IPX address (should be [net]:node[/port])\n");
00729           return 1;
00730         }
00731 #else
00732         snmp_log(LOG_ERR, "No support for requested IPX domain\n");
00733 #endif
00734       } else if (strncasecmp(cptr, "aal5pvc", 7) == 0) {
00735 #ifdef SNMP_TRANSPORT_AAL5PVC_DOMAIN
00736         struct sockaddr_atmpvc addr;
00737         if (sscanf(cptr2+1, "%d.%d.%d", &(addr.sap_addr.itf),
00738                    &(addr.sap_addr.vpi), &(addr.sap_addr.vci))==3) {
00739           addr.sap_family = AF_ATMPVC;
00740           transport = snmp_aal5pvc_transport(&addr, 1);
00741         } else {
00742           snmp_log(LOG_ERR,
00743                  "Badly formatted AAL5 PVC address (should be itf.vpi.vci)\n");
00744           return 1;
00745         }
00746 #else
00747         snmp_log(LOG_ERR, "No support for requested AAL5 PVC domain\n");
00748         return 1;
00749 #endif
00750       } else if (strncasecmp(cptr, "unix", 4) == 0) {
00751 #ifdef SNMP_TRANSPORT_UNIX_DOMAIN
00752         struct sockaddr_un addr;
00753         addr.sun_family = AF_UNIX;
00754         strncpy(addr.sun_path, cptr2+1, 
00755                 sizeof(addr) - (size_t) (((struct sockaddr_un *)0)->sun_path));
00756         transport = snmp_unix_transport(&addr, 1);
00757 #else
00758         snmp_log(LOG_ERR, "No support for requested Unix domain\n");
00759         return 1;
00760 #endif
00761       } else if (strncasecmp(cptr, "udp", 3) == 0) {
00762         struct sockaddr_in addr;
00763         if (snmp_sockaddr_in(&addr, cptr2+1, 0)) {
00764           transport = snmp_udp_transport(&addr, 1);
00765         } else {
00766           snmp_log(LOG_ERR,
00767                    "Badly formatted IP address (should be [a.b.c.d:]p)\n");
00768           return 1;
00769         }
00770       } else {
00771         snmp_log(LOG_ERR, "Unknown transport domain \"%s\"\n", cptr);
00772         return 1;
00773       }
00774     } else {
00775       /*  No transport type specifier; default to UDP.  */
00776       struct sockaddr_in addr;
00777       if (snmp_sockaddr_in(&addr, cptr, 0)) {
00778         transport = snmp_udp_transport(&addr, 1);
00779       } else {
00780         snmp_log(LOG_ERR,
00781                  "Badly formatted IP address (should be [a.b.c.d:]p)\n");
00782         return 1;
00783       }
00784     }
00785 
00786     if (transport == NULL) {
00787       snmp_log(LOG_ERR, "Error opening specified transport \"%s\"\n", cptr);
00788       return 1;
00789     }
00790 
00791     if (register_agent_nsap(transport) == 0) {
00792       snmp_log(LOG_ERR,
00793              "Error registering specified transport \"%s\" as an agent NSAP\n",
00794                cptr);
00795       return 1;
00796     } else {
00797       DEBUGMSGTL(("snmp_agent",
00798                   "init_master_agent; \"%s\" registered as an agent NSAP\n",
00799                   cptr));
00800     }
00801 
00802     /*  Next transport please...  */
00803     cptr = strtok(NULL, ",");
00804   }
00805 
00806   return 0;
00807 }

int marker_uptime marker_t    pm
 

Definition at line 1911 of file snmp_agent.c.

Referenced by timeval_uptime().

01912 {
01913     int res;
01914     marker_t start = (marker_t)&starttime;
01915 
01916     res = atime_diff( start, pm );
01917     return res/10;      /* atime_diff works in msec, not csec */
01918 }

int register_agent_nsap struct _snmp_transport *    t
 

Referenced by init_master_agent().

void remove_and_free_agent_snmp_session struct agent_snmp_session   asp
 

Definition at line 984 of file snmp_agent.c.

Referenced by handle_snmp_packet(), and wrap_up_request().

00985 {
00986     struct agent_snmp_session *a, **prevNext = &agent_session_list;
00987 
00988     DEBUGMSGTL(("snmp_agent", "REMOVE %08p\n", asp));
00989 
00990     for (a = agent_session_list; a != NULL; a = *prevNext) {
00991         if (a == asp) {
00992             *prevNext = a->next;
00993             a->next = NULL;
00994             free_agent_snmp_session(a);
00995             asp = NULL;
00996             break;
00997         } else {
00998             prevNext = &(a->next);
00999         }
01000     }
01001 
01002     if (a == NULL && asp != NULL) {
01003         /*  We coulnd't find it on the list, so free it anyway.  */
01004         free_agent_snmp_session(asp);
01005     }
01006 }

int set_all_requests_error agent_request_info   reqinfo,
request_info   requests,
int    error_value
 

Definition at line 1898 of file snmp_agent.c.

Referenced by multiplexer_helper_handler(), null_handler(), and read_only_helper().

01899                                              {
01900     while(requests) {
01901         set_request_error(reqinfo, requests, error_value);
01902         requests = requests->next;
01903     }
01904     return error_value;
01905 }

int set_mode_request_error int    mode,
request_info   request,
int    error_value
 

Definition at line 1853 of file snmp_agent.c.

Referenced by set_request_error().

01854                                         {
01855     if (!request)
01856         return error_value;
01857 
01858     request->processed = 1;
01859 
01860     switch(error_value) {
01861         case SNMP_NOSUCHOBJECT:
01862         case SNMP_NOSUCHINSTANCE:
01863         case SNMP_ENDOFMIBVIEW:
01864             /* these are exceptions that should be put in the varbind
01865                in the case of a GET but should be translated for a SET
01866                into a real error status code and put in the request */
01867             switch (mode) {
01868                 case MODE_GET:
01869                     request->requestvb->type = error_value;
01870                     return error_value;
01871                     
01872                 case MODE_GETNEXT:
01873                 case MODE_GETBULK:
01874                     /* ignore these.  They're illegal to set by the
01875                        client APIs for these modes */
01876                     return error_value;
01877 
01878                 default:
01879                     request->status = SNMP_ERR_NOSUCHNAME; /* WWW: correct? */
01880                     return error_value;
01881             }
01882             break; /* never get here */
01883 
01884         default:
01885             if (request->status < 0) {
01886                 /* illegal local error code.  translate to generr */
01887                 /* WWW: full translation map? */
01888                 request->status = SNMP_ERR_GENERR;
01889             } else {
01890                 /* WWW: translations and mode checking? */
01891                 request->status = error_value;
01892             }
01893             return error_value;
01894     }
01895     return error_value;
01896 }

int set_request_error agent_request_info   reqinfo,
request_info   request,
int    error_value
 

Definition at line 1845 of file snmp_agent.c.

Referenced by call_handlers(), group_requests(), instance_counter32_handler(), instance_helper_handler(), instance_long_handler(), instance_ulong_handler(), old_api_helper(), process_get_requests(), set_all_requests_error(), table_data_set_helper_handler(), and table_helper_handler().

01846                                         {
01847     if (!request || !reqinfo)
01848         return error_value;
01849 
01850     return set_mode_request_error(reqinfo->mode, request, error_value);
01851 }

void snmp_addrcache_age void   
 

Definition at line 325 of file snmp_agent.c.

00326 {
00327   int i = 0;
00328   
00329   lastAddrAge = 0;
00330   for (i = 0; i < SNMP_ADDRCACHE_SIZE; i++) {
00331     if (addrCache[i].status == SNMP_ADDRCACHE_OLD) {
00332       addrCache[i].status = SNMP_ADDRCACHE_UNUSED;
00333       if (addrCache[i].addr != NULL) {
00334         free(addrCache[i].addr);
00335         addrCache[i].addr = NULL;
00336       }
00337     }
00338     if (addrCache[i].status == SNMP_ADDRCACHE_USED) {
00339       addrCache[i].status = SNMP_ADDRCACHE_OLD;
00340     }
00341   }
00342 }

void snmp_addrcache_initialise void   
 

Definition at line 311 of file snmp_agent.c.

00312 {
00313   int i = 0;
00314   
00315   for (i = 0; i < SNMP_ADDRCACHE_SIZE; i++) {
00316     addrCache[i].addr = NULL;
00317     addrCache[i].status = SNMP_ADDRCACHE_UNUSED;
00318   }
00319 }

void snmp_agent_parse_config char *   ,
char *   
 

int snmp_check_packet struct snmp_session *   ,
struct _snmp_transport *   ,
void *   ,
int   
 

int snmp_check_parse struct snmp_session *    session,
struct snmp_pdu *    pdu,
int    result
 

int timeval_uptime struct timeval *    tv
 

Definition at line 1921 of file snmp_agent.c.

Referenced by get_agent_uptime().

01922 {
01923     return marker_uptime((marker_t)tv);
01924 }

Variable Documentation

int lastAddrAge
 

Definition at line 28 of file snmp_agent.h.

int log_addresses
 

Definition at line 24 of file snmp_agent.h.


Generated on Sat Nov 10 14:09:56 2001 for net-snmp by doxygen1.2.11 written by Dimitri van Heesch, © 1997-2001
[an error occurred while processing this directive] [an error occurred while processing this directive]

Valid CSS!


Last modified: Wednesday, 01-Aug-2018 04:41:28 UTC
For questions regarding web content and site functionality, please write to the net-snmp-users mail list.