blob: 88dbc41c3eafbbf846e8718013393e3d235b2617 [file] [log] [blame]
#ifndef NET_SNMP_SESSION_API_H
#define NET_SNMP_SESSION_API_H
/**
* Library API routines concerned with specifying and using SNMP "sessions"
* including sending and receiving requests.
*/
#include <net-snmp/types.h>
#ifdef __cplusplus
extern "C" {
#endif
NETSNMP_IMPORT
void snmp_sess_init(netsnmp_session *);
/*
* netsnmp_session *snmp_open(session)
* netsnmp_session *session;
*
* Sets up the session with the snmp_session information provided
* by the user. Then opens and binds the necessary UDP port.
* A handle to the created session is returned (this is different than
* the pointer passed to snmp_open()). On any error, NULL is returned
* and snmp_errno is set to the appropriate error code.
*/
NETSNMP_IMPORT
netsnmp_session *snmp_open(netsnmp_session *);
/*
* int snmp_close(session)
* netsnmp_session *session;
*
* Close the input session. Frees all data allocated for the session,
* dequeues any pending requests, and closes any sockets allocated for
* the session. Returns 0 on error, 1 otherwise.
*
* snmp_close_sessions() does the same thing for all open sessions
*/
NETSNMP_IMPORT
int snmp_close(netsnmp_session *);
NETSNMP_IMPORT
int snmp_close_sessions(void);
/*
* int snmp_send(session, pdu)
* netsnmp_session *session;
* netsnmp_pdu *pdu;
*
* Sends the input pdu on the session after calling snmp_build to create
* a serialized packet. If necessary, set some of the pdu data from the
* session defaults. Add a request corresponding to this pdu to the list
* of outstanding requests on this session, then send the pdu.
* Returns the request id of the generated packet if applicable, otherwise 1.
* On any error, 0 is returned.
* The pdu is freed by snmp_send() unless a failure occured.
*/
NETSNMP_IMPORT
int snmp_send(netsnmp_session *, netsnmp_pdu *);
/*
* int snmp_async_send(session, pdu, callback, cb_data)
* netsnmp_session *session;
* netsnmp_pdu *pdu;
* netsnmp_callback callback;
* void *cb_data;
*
* Sends the input pdu on the session after calling snmp_build to create
* a serialized packet. If necessary, set some of the pdu data from the
* session defaults. Add a request corresponding to this pdu to the list
* of outstanding requests on this session and store callback and data,
* then send the pdu.
* Returns the request id of the generated packet if applicable, otherwise 1.
* On any error, 0 is returned.
* The pdu is freed by snmp_send() unless a failure occured.
*/
NETSNMP_IMPORT
int snmp_async_send(netsnmp_session *, netsnmp_pdu *,
netsnmp_callback, void *);
/*
* void snmp_read(fdset)
* fd_set *fdset;
*
* Checks to see if any of the fd's set in the fdset belong to
* snmp. Each socket with it's fd set has a packet read from it
* and snmp_parse is called on the packet received. The resulting pdu
* is passed to the callback routine for that session. If the callback
* routine returns successfully, the pdu and it's request are deleted.
*/
NETSNMP_IMPORT
void snmp_read(fd_set *);
/*
* snmp_read2() is similar to snmp_read(), but accepts a pointer to a
* large file descriptor set instead of a pointer to a regular file
* descriptor set.
*/
NETSNMP_IMPORT
void snmp_read2(netsnmp_large_fd_set *);
NETSNMP_IMPORT
int snmp_synch_response(netsnmp_session *, netsnmp_pdu *,
netsnmp_pdu **);
/*
* int snmp_select_info(numfds, fdset, timeout, block)
* int *numfds;
* fd_set *fdset;
* struct timeval *timeout;
* int *block;
*
* Returns info about what snmp requires from a select statement.
* numfds is the number of fds in the list that are significant.
* All file descriptors opened for SNMP are OR'd into the fdset.
* If activity occurs on any of these file descriptors, snmp_read
* should be called with that file descriptor set.
*
* The timeout is the latest time that SNMP can wait for a timeout. The
* select should be done with the minimum time between timeout and any other
* timeouts necessary. This should be checked upon each invocation of select.
* If a timeout is received, snmp_timeout should be called to check if the
* timeout was for SNMP. (snmp_timeout is idempotent)
*
* Block is 1 if the select is requested to block indefinitely, rather than
* time out. If block is input as 1, the timeout value will be treated as
* undefined, but it must be available for setting in snmp_select_info. On
* return, if block is true, the value of timeout will be undefined.
*
* snmp_select_info returns the number of open sockets. (i.e. The number
* of sessions open)
*/
NETSNMP_IMPORT
int snmp_select_info(int *, fd_set *, struct timeval *,
int *);
/*
* snmp_select_info2() is similar to snmp_select_info(), but accepts a
* pointer to a large file descriptor set instead of a pointer to a
* regular file descriptor set.
*/
NETSNMP_IMPORT
int snmp_select_info2(int *, netsnmp_large_fd_set *,
struct timeval *, int *);
#define NETSNMP_SELECT_NOFLAGS 0x00
#define NETSNMP_SELECT_NOALARMS 0x01
NETSNMP_IMPORT
int snmp_sess_select_info_flags(void *, int *, fd_set *,
struct timeval *, int *, int);
int snmp_sess_select_info2_flags(void *, int *,
netsnmp_large_fd_set *,
struct timeval *, int *, int);
/*
* void snmp_timeout();
*
* snmp_timeout should be called whenever the timeout from snmp_select_info
* expires, but it is idempotent, so snmp_timeout can be polled (probably a
* cpu expensive proposition). snmp_timeout checks to see if any of the
* sessions have an outstanding request that has timed out. If it finds one
* (or more), and that pdu has more retries available, a new packet is formed
* from the pdu and is resent. If there are no more retries available, the
* callback for the session is used to alert the user of the timeout.
*/
NETSNMP_IMPORT
void snmp_timeout(void);
/*
* single session API.
*
* These functions perform similar actions as snmp_XX functions,
* but operate on a single session only.
*
* Synopsis:
void * sessp;
netsnmp_session session, *ss;
netsnmp_pdu *pdu, *response;
snmp_sess_init(&session);
session.retries = ...
session.remote_port = ...
sessp = snmp_sess_open(&session);
ss = snmp_sess_session(sessp);
if (ss == NULL)
exit(1);
...
if (ss->community) free(ss->community);
ss->community = strdup(gateway);
ss->community_len = strlen(gateway);
...
snmp_sess_synch_response(sessp, pdu, &response);
...
snmp_sess_close(sessp);
* See also:
* snmp_sess_synch_response, in snmp_client.h.
* Notes:
* 1. Invoke snmp_sess_session after snmp_sess_open.
* 2. snmp_sess_session return value is an opaque pointer.
* 3. Do NOT free memory returned by snmp_sess_session.
* 4. Replace snmp_send(ss,pdu) with snmp_sess_send(sessp,pdu)
*/
NETSNMP_IMPORT
void *snmp_sess_open(netsnmp_session *);
NETSNMP_IMPORT
void *snmp_sess_pointer(netsnmp_session *);
NETSNMP_IMPORT
netsnmp_session *snmp_sess_session(void *);
NETSNMP_IMPORT
netsnmp_session *snmp_sess_session_lookup(void *);
/*
* use return value from snmp_sess_open as void * parameter
*/
NETSNMP_IMPORT
int snmp_sess_send(void *, netsnmp_pdu *);
NETSNMP_IMPORT
int snmp_sess_async_send(void *, netsnmp_pdu *,
netsnmp_callback, void *);
NETSNMP_IMPORT
int snmp_sess_select_info(void *, int *, fd_set *,
struct timeval *, int *);
NETSNMP_IMPORT
int snmp_sess_select_info2(void *, int *,
netsnmp_large_fd_set *,
struct timeval *, int *);
/*
* Returns 0 if success, -1 if fail.
*/
NETSNMP_IMPORT
int snmp_sess_read(void *, fd_set *);
/*
* Similar to snmp_sess_read(), but accepts a pointer to a large file
* descriptor set instead of a pointer to a file descriptor set.
*/
NETSNMP_IMPORT
int snmp_sess_read2(void *,
netsnmp_large_fd_set *);
NETSNMP_IMPORT
void snmp_sess_timeout(void *);
NETSNMP_IMPORT
int snmp_sess_close(void *);
NETSNMP_IMPORT
int snmp_sess_synch_response(void *, netsnmp_pdu *,
netsnmp_pdu **);
#ifdef __cplusplus
}
#endif
/*
* Having extracted the main ("public API") calls relevant
* to this area of the Net-SNMP project, the next step is to
* identify the related "public internal API" routines.
*
* In due course, these should probably be gathered
* together into a companion 'library/session_api.h' header file.
* [Or some suitable name]
*
* But for the time being, the expectation is that the
* traditional headers that provided the above definitions
* will probably also cover the relevant internal API calls.
* Hence they are listed here:
*/
#include <net-snmp/library/snmp_api.h>
#include <net-snmp/library/snmp_client.h>
#include <net-snmp/library/asn1.h>
#include <net-snmp/library/callback.h>
#include <net-snmp/library/snmp_transport.h>
#include <net-snmp/library/snmp_service.h>
#include <net-snmp/library/snmpCallbackDomain.h>
#ifdef NETSNMP_TRANSPORT_UNIX_DOMAIN
#include <net-snmp/library/snmpUnixDomain.h>
#endif
#ifdef NETSNMP_TRANSPORT_UDP_DOMAIN
#include <net-snmp/library/snmpUDPDomain.h>
#endif
#ifdef NETSNMP_TRANSPORT_TCP_DOMAIN
#include <net-snmp/library/snmpTCPDomain.h>
#endif
#ifdef NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
#include <net-snmp/library/snmpUDPIPv6Domain.h>
#endif
#ifdef NETSNMP_TRANSPORT_TCPIPV6_DOMAIN
#include <net-snmp/library/snmpTCPIPv6Domain.h>
#endif
#ifdef NETSNMP_TRANSPORT_IPX_DOMAIN
#include <net-snmp/library/snmpIPXDomain.h>
#endif
#ifdef NETSNMP_TRANSPORT_AAL5PVC_DOMAIN
#include <net-snmp/library/snmpAAL5PVCDomain.h>
#endif
#include <net-snmp/library/ucd_compat.h>
#endif /* NET_SNMP_SESSION_API_H */