summaryrefslogtreecommitdiff
path: root/include/net-snmp/library/snmp_api.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/net-snmp/library/snmp_api.h')
-rw-r--r--include/net-snmp/library/snmp_api.h1087
1 files changed, 1087 insertions, 0 deletions
diff --git a/include/net-snmp/library/snmp_api.h b/include/net-snmp/library/snmp_api.h
new file mode 100644
index 0000000..cb61ef7
--- /dev/null
+++ b/include/net-snmp/library/snmp_api.h
@@ -0,0 +1,1087 @@
+/* Portions of this file are subject to the following copyright(s). See
+ * the Net-SNMP's COPYING file for more details and other copyrights
+ * that may apply:
+ */
+/*
+ * Portions of this file are copyrighted by:
+ * Copyright © 2003 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms specified in the COPYING file
+ * distributed with the Net-SNMP package.
+ */
+#ifndef SNMP_API_H
+#define SNMP_API_H
+
+/*
+ * @file snmp_api.h - API for access to snmp.
+ *
+ * @addtogroup library
+ *
+ * Caution: when using this library in a multi-threaded application,
+ * the values of global variables "snmp_errno" and "snmp_detail"
+ * cannot be reliably determined. Suggest using snmp_error()
+ * to obtain the library error codes.
+ *
+ * @{
+ */
+
+#ifndef DONT_SHARE_ERROR_WITH_OTHER_THREADS
+#define SET_SNMP_ERROR(x) snmp_errno=(x)
+#else
+#define SET_SNMP_ERROR(x)
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/***********************************************************
+ Copyright 1989 by Carnegie Mellon University
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of CMU not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+******************************************************************/
+
+/** @typedef struct variable_list netsnmp_variable_list
+ * Typedefs the variable_list struct into netsnmp_variable_list */
+struct variable_list;
+typedef struct variable_list netsnmp_variable_list;
+struct timeval;
+struct netsnmp_transport_s;
+
+#define USM_AUTH_KU_LEN 32
+#define USM_PRIV_KU_LEN 32
+
+/** @typedef struct snmp_pdu to netsnmp_pdu
+ * Typedefs the snmp_pdu struct into netsnmp_pdu */
+/** @struct snmp_pdu
+ * The snmp protocol data unit.
+ */
+typedef struct snmp_pdu {
+
+ /*
+ * Protocol-version independent fields
+ */
+ /** snmp version */
+ long version;
+ /** Type of this PDU */
+ int command;
+ /** Request id - note: not incremented on retries */
+ long reqid;
+ /** Message id for V3 messages note: incremented for each retry */
+ long msgid;
+ /** Unique ID for incoming transactions */
+ long transid;
+ /** Session id for AgentX messages */
+ long sessid;
+ /** Error status (non_repeaters in GetBulk) */
+ long errstat;
+ /** Error index (max_repetitions in GetBulk) */
+ long errindex;
+ /** Uptime */
+ u_long time;
+ u_long flags;
+
+ int securityModel;
+ /** noAuthNoPriv, authNoPriv, authPriv */
+ int securityLevel;
+ int msgParseModel;
+
+ /**
+ * Transport-specific opaque data. This replaces the IP-centric address
+ * field.
+ */
+
+ void *transport_data;
+ int transport_data_length;
+
+ /**
+ * The actual transport domain. This SHOULD NOT BE FREE()D.
+ */
+
+ const oid *tDomain;
+ size_t tDomainLen;
+
+ netsnmp_variable_list *variables;
+
+
+ /*
+ * SNMPv1 & SNMPv2c fields
+ */
+ /** community for outgoing requests. */
+ u_char *community;
+ /** length of community name. */
+ size_t community_len;
+
+ /*
+ * Trap information
+ */
+ /** System OID */
+ oid *enterprise;
+ size_t enterprise_length;
+ /** trap type */
+ long trap_type;
+ /** specific type */
+ long specific_type;
+ /** This is ONLY used for v1 TRAPs */
+ unsigned char agent_addr[4];
+
+ /*
+ * SNMPv3 fields
+ */
+ /** context snmpEngineID */
+ u_char *contextEngineID;
+ /** Length of contextEngineID */
+ size_t contextEngineIDLen;
+ /** authoritative contextName */
+ char *contextName;
+ /** Length of contextName */
+ size_t contextNameLen;
+ /** authoritative snmpEngineID for security */
+ u_char *securityEngineID;
+ /** Length of securityEngineID */
+ size_t securityEngineIDLen;
+ /** on behalf of this principal */
+ char *securityName;
+ /** Length of securityName. */
+ size_t securityNameLen;
+
+ /*
+ * AgentX fields
+ * (also uses SNMPv1 community field)
+ */
+ int priority;
+ int range_subid;
+
+ void *securityStateRef;
+} netsnmp_pdu;
+
+struct snmp_session;
+
+/** @typedef struct snmp_session netsnmp_session
+ * Typedefs the snmp_session struct intonetsnmp_session */
+typedef struct snmp_session netsnmp_session;
+
+typedef int (*snmp_callback) (int, netsnmp_session *, int,
+ netsnmp_pdu *, void *);
+typedef int (*netsnmp_callback) (int, netsnmp_session *, int,
+ netsnmp_pdu *, void *);
+/** @struct snmp_session
+ * The snmp session structure.
+ */
+struct snmp_session {
+ /*
+ * Protocol-version independent fields
+ */
+ /** snmp version */
+ long version;
+ /** Number of retries before timeout. */
+ int retries;
+ /** Number of uS until first timeout, then exponential backoff */
+ long timeout;
+ u_long flags;
+ struct snmp_session *subsession;
+ struct snmp_session *next;
+
+ /** name or address of default peer (may include transport specifier and/or port number) */
+ char *peername;
+ /** UDP port number of peer. (NO LONGER USED - USE peername INSTEAD) */
+ u_short remote_port;
+ /** My Domain name or dotted IP address, 0 for default */
+ char *localname;
+ /** My UDP port number, 0 for default, picked randomly */
+ u_short local_port;
+ /**
+ * Authentication function or NULL if null authentication is used
+ */
+ u_char *(*authenticator) (u_char *, size_t *, u_char *, size_t);
+ /** Function to interpret incoming data */
+ netsnmp_callback callback;
+ /**
+ * Pointer to data that the callback function may consider important
+ */
+ void *callback_magic;
+ /** copy of system errno */
+ int s_errno;
+ /** copy of library errno */
+ int s_snmp_errno;
+ /** Session id - AgentX only */
+ long sessid;
+
+ /*
+ * SNMPv1 & SNMPv2c fields
+ */
+ /** community for outgoing requests. */
+ u_char *community;
+ /** Length of community name. */
+ size_t community_len;
+ /** Largest message to try to receive. */
+ size_t rcvMsgMaxSize;
+ /** Largest message to try to send. */
+ size_t sndMsgMaxSize;
+
+ /*
+ * SNMPv3 fields
+ */
+ /** are we the authoritative engine? */
+ u_char isAuthoritative;
+ /** authoritative snmpEngineID */
+ u_char *contextEngineID;
+ /** Length of contextEngineID */
+ size_t contextEngineIDLen;
+ /** initial engineBoots for remote engine */
+ u_int engineBoots;
+ /** initial engineTime for remote engine */
+ u_int engineTime;
+ /** authoritative contextName */
+ char *contextName;
+ /** Length of contextName */
+ size_t contextNameLen;
+ /** authoritative snmpEngineID */
+ u_char *securityEngineID;
+ /** Length of contextEngineID */
+ size_t securityEngineIDLen;
+ /** on behalf of this principal */
+ char *securityName;
+ /** Length of securityName. */
+ size_t securityNameLen;
+
+ /** auth protocol oid */
+ oid *securityAuthProto;
+ /** Length of auth protocol oid */
+ size_t securityAuthProtoLen;
+ /** Ku for auth protocol XXX */
+ u_char securityAuthKey[USM_AUTH_KU_LEN];
+ /** Length of Ku for auth protocol */
+ size_t securityAuthKeyLen;
+ /** Kul for auth protocol */
+ u_char *securityAuthLocalKey;
+ /** Length of Kul for auth protocol XXX */
+ size_t securityAuthLocalKeyLen;
+
+ /** priv protocol oid */
+ oid *securityPrivProto;
+ /** Length of priv protocol oid */
+ size_t securityPrivProtoLen;
+ /** Ku for privacy protocol XXX */
+ u_char securityPrivKey[USM_PRIV_KU_LEN];
+ /** Length of Ku for priv protocol */
+ size_t securityPrivKeyLen;
+ /** Kul for priv protocol */
+ u_char *securityPrivLocalKey;
+ /** Length of Kul for priv protocol XXX */
+ size_t securityPrivLocalKeyLen;
+
+ /** snmp security model, v1, v2c, usm */
+ int securityModel;
+ /** noAuthNoPriv, authNoPriv, authPriv */
+ int securityLevel;
+ /** target param name */
+ char *paramName;
+
+ /**
+ * security module specific
+ */
+ void *securityInfo;
+
+ /**
+ * use as you want data
+ *
+ * used by 'SNMP_FLAGS_RESP_CALLBACK' handling in the agent
+ * XXX: or should we add a new field into this structure?
+ */
+ void *myvoid;
+};
+
+/*
+ * A list of all the outstanding requests for a particular session.
+ */
+#ifdef SNMP_NEED_REQUEST_LIST
+typedef struct request_list {
+ struct request_list *next_request;
+ long request_id; /* request id */
+ long message_id; /* message id */
+ netsnmp_callback callback; /* user callback per request (NULL if unused) */
+ void *cb_data; /* user callback data per request (NULL if unused) */
+ int retries; /* Number of retries */
+ u_long timeout; /* length to wait for timeout */
+ struct timeval time; /* Time this request was made */
+ struct timeval expire; /* time this request is due to expire */
+ struct snmp_session *session;
+ netsnmp_pdu *pdu; /* The pdu for this request
+ * (saved so it can be retransmitted */
+} netsnmp_request_list;
+#endif /* SNMP_NEED_REQUEST_LIST */
+
+ /*
+ * Set fields in session and pdu to the following to get a default or unconfigured value.
+ */
+#define SNMP_DEFAULT_COMMUNITY_LEN 0 /* to get a default community name */
+#define SNMP_DEFAULT_RETRIES -1
+#define SNMP_DEFAULT_TIMEOUT -1
+#define SNMP_DEFAULT_REMPORT 0
+#define SNMP_DEFAULT_REQID -1
+#define SNMP_DEFAULT_MSGID -1
+#define SNMP_DEFAULT_ERRSTAT -1
+#define SNMP_DEFAULT_ERRINDEX -1
+#define SNMP_DEFAULT_ADDRESS 0
+#define SNMP_DEFAULT_PEERNAME NULL
+#define SNMP_DEFAULT_ENTERPRISE_LENGTH 0
+#define SNMP_DEFAULT_TIME 0
+#define SNMP_DEFAULT_VERSION -1
+#define SNMP_DEFAULT_SECMODEL -1
+#define SNMP_DEFAULT_CONTEXT ""
+#ifndef NETSNMP_DISABLE_MD5
+#define SNMP_DEFAULT_AUTH_PROTO usmHMACMD5AuthProtocol
+#else
+#define SNMP_DEFAULT_AUTH_PROTO usmHMACSHA1AuthProtocol
+#endif
+#define SNMP_DEFAULT_AUTH_PROTOLEN USM_LENGTH_OID_TRANSFORM
+#ifndef NETSNMP_DISABLE_DES
+#define SNMP_DEFAULT_PRIV_PROTO usmDESPrivProtocol
+#else
+#define SNMP_DEFAULT_PRIV_PROTO usmAESPrivProtocol
+#endif
+#define SNMP_DEFAULT_PRIV_PROTOLEN USM_LENGTH_OID_TRANSFORM
+
+ NETSNMP_IMPORT const char *snmp_api_errstring(int);
+ NETSNMP_IMPORT void snmp_perror(const char *);
+ NETSNMP_IMPORT void snmp_set_detail(const char *);
+
+#define SNMP_MAX_MSG_SIZE 1472 /* ethernet MTU minus IP/UDP header */
+#define SNMP_MAX_MSG_V3_HDRS (4+3+4+7+7+3+7+16) /* fudge factor=16 */
+#define SNMP_MAX_ENG_SIZE 32
+#define SNMP_MAX_SEC_NAME_SIZE 256
+#define SNMP_MAX_CONTEXT_SIZE 256
+#define SNMP_SEC_PARAM_BUF_SIZE 256
+
+ /*
+ * set to one to ignore unauthenticated Reports
+ */
+#define SNMPV3_IGNORE_UNAUTH_REPORTS 0
+
+ /*
+ * authoritative engine definitions
+ */
+#define SNMP_SESS_NONAUTHORITATIVE 0 /* should be 0 to default to this */
+#define SNMP_SESS_AUTHORITATIVE 1 /* don't learn engineIDs */
+#define SNMP_SESS_UNKNOWNAUTH 2 /* sometimes (like NRs) */
+
+ /*
+ * to determine type of Report from varbind_list
+ */
+#define REPORT_STATS_LEN 9
+#define REPORT_snmpUnknownSecurityModels_NUM 1
+#define REPORT_snmpInvalidMsgs_NUM 2
+#define REPORT_usmStatsUnsupportedSecLevels_NUM 1
+#define REPORT_usmStatsNotInTimeWindows_NUM 2
+#define REPORT_usmStatsUnknownUserNames_NUM 3
+#define REPORT_usmStatsUnknownEngineIDs_NUM 4
+#define REPORT_usmStatsWrongDigests_NUM 5
+#define REPORT_usmStatsDecryptionErrors_NUM 6
+
+#define SNMP_DETAIL_SIZE 512
+
+#define SNMP_FLAGS_RESP_CALLBACK 0x400 /* Additional callback on response */
+#define SNMP_FLAGS_USER_CREATED 0x200 /* USM user has been created */
+#define SNMP_FLAGS_DONT_PROBE 0x100 /* don't probe for an engineID */
+#define SNMP_FLAGS_STREAM_SOCKET 0x80
+#define SNMP_FLAGS_LISTENING 0x40 /* Server stream sockets only */
+#define SNMP_FLAGS_SUBSESSION 0x20
+#define SNMP_FLAGS_STRIKE2 0x02
+#define SNMP_FLAGS_STRIKE1 0x01
+
+#define CLEAR_SNMP_STRIKE_FLAGS(x) \
+ x &= ~(SNMP_FLAGS_STRIKE2|SNMP_FLAGS_STRIKE1)
+
+ /*
+ * returns '1' if the session is to be regarded as dead,
+ * otherwise set the strike flags appropriately, and return 0
+ */
+#define SET_SNMP_STRIKE_FLAGS(x) \
+ (( x & SNMP_FLAGS_STRIKE2 ) ? 1 : \
+ ((( x & SNMP_FLAGS_STRIKE1 ) ? ( x |= SNMP_FLAGS_STRIKE2 ) : \
+ ( x |= SNMP_FLAGS_STRIKE1 )), \
+ 0))
+
+ /*
+ * Error return values.
+ *
+ * SNMPERR_SUCCESS is the non-PDU "success" code.
+ *
+ * XXX These should be merged with SNMP_ERR_* defines and confined
+ * to values < 0. ???
+ */
+#define SNMPERR_SUCCESS (0) /* XXX Non-PDU "success" code. */
+#define SNMPERR_GENERR (-1)
+#define SNMPERR_BAD_LOCPORT (-2)
+#define SNMPERR_BAD_ADDRESS (-3)
+#define SNMPERR_BAD_SESSION (-4)
+#define SNMPERR_TOO_LONG (-5)
+#define SNMPERR_NO_SOCKET (-6)
+#define SNMPERR_V2_IN_V1 (-7)
+#define SNMPERR_V1_IN_V2 (-8)
+#define SNMPERR_BAD_REPEATERS (-9)
+#define SNMPERR_BAD_REPETITIONS (-10)
+#define SNMPERR_BAD_ASN1_BUILD (-11)
+#define SNMPERR_BAD_SENDTO (-12)
+#define SNMPERR_BAD_PARSE (-13)
+#define SNMPERR_BAD_VERSION (-14)
+#define SNMPERR_BAD_SRC_PARTY (-15)
+#define SNMPERR_BAD_DST_PARTY (-16)
+#define SNMPERR_BAD_CONTEXT (-17)
+#define SNMPERR_BAD_COMMUNITY (-18)
+#define SNMPERR_NOAUTH_DESPRIV (-19)
+#define SNMPERR_BAD_ACL (-20)
+#define SNMPERR_BAD_PARTY (-21)
+#define SNMPERR_ABORT (-22)
+#define SNMPERR_UNKNOWN_PDU (-23)
+#define SNMPERR_TIMEOUT (-24)
+#define SNMPERR_BAD_RECVFROM (-25)
+#define SNMPERR_BAD_ENG_ID (-26)
+#define SNMPERR_BAD_SEC_NAME (-27)
+#define SNMPERR_BAD_SEC_LEVEL (-28)
+#define SNMPERR_ASN_PARSE_ERR (-29)
+#define SNMPERR_UNKNOWN_SEC_MODEL (-30)
+#define SNMPERR_INVALID_MSG (-31)
+#define SNMPERR_UNKNOWN_ENG_ID (-32)
+#define SNMPERR_UNKNOWN_USER_NAME (-33)
+#define SNMPERR_UNSUPPORTED_SEC_LEVEL (-34)
+#define SNMPERR_AUTHENTICATION_FAILURE (-35)
+#define SNMPERR_NOT_IN_TIME_WINDOW (-36)
+#define SNMPERR_DECRYPTION_ERR (-37)
+#define SNMPERR_SC_GENERAL_FAILURE (-38)
+#define SNMPERR_SC_NOT_CONFIGURED (-39)
+#define SNMPERR_KT_NOT_AVAILABLE (-40)
+#define SNMPERR_UNKNOWN_REPORT (-41)
+#define SNMPERR_USM_GENERICERROR (-42)
+#define SNMPERR_USM_UNKNOWNSECURITYNAME (-43)
+#define SNMPERR_USM_UNSUPPORTEDSECURITYLEVEL (-44)
+#define SNMPERR_USM_ENCRYPTIONERROR (-45)
+#define SNMPERR_USM_AUTHENTICATIONFAILURE (-46)
+#define SNMPERR_USM_PARSEERROR (-47)
+#define SNMPERR_USM_UNKNOWNENGINEID (-48)
+#define SNMPERR_USM_NOTINTIMEWINDOW (-49)
+#define SNMPERR_USM_DECRYPTIONERROR (-50)
+#define SNMPERR_NOMIB (-51)
+#define SNMPERR_RANGE (-52)
+#define SNMPERR_MAX_SUBID (-53)
+#define SNMPERR_BAD_SUBID (-54)
+#define SNMPERR_LONG_OID (-55)
+#define SNMPERR_BAD_NAME (-56)
+#define SNMPERR_VALUE (-57)
+#define SNMPERR_UNKNOWN_OBJID (-58)
+#define SNMPERR_NULL_PDU (-59)
+#define SNMPERR_NO_VARS (-60)
+#define SNMPERR_VAR_TYPE (-61)
+#define SNMPERR_MALLOC (-62)
+#define SNMPERR_KRB5 (-63)
+#define SNMPERR_PROTOCOL (-64)
+#define SNMPERR_OID_NONINCREASING (-65)
+
+#define SNMPERR_MAX (-65)
+
+#define non_repeaters errstat
+#define max_repetitions errindex
+
+typedef union {
+ long *integer;
+ u_char *string;
+ oid *objid;
+ u_char *bitstring;
+ struct counter64 *counter64;
+#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
+ float *floatVal;
+ double *doubleVal;
+ /*
+ * t_union *unionVal;
+ */
+#endif /* NETSNMP_WITH_OPAQUE_SPECIAL_TYPES */
+} netsnmp_vardata;
+
+
+/** @struct variable_list
+ * The netsnmp variable list binding structure, it's typedef'd to
+ * netsnmp_variable_list.
+ */
+struct variable_list {
+ /** NULL for last variable */
+ struct variable_list *next_variable;
+ /** Object identifier of variable */
+ oid *name;
+ /** number of subid's in name */
+ size_t name_length;
+ /** ASN type of variable */
+ u_char type;
+ /** value of variable */
+ netsnmp_vardata val;
+ /** the length of the value to be copied into buf */
+ size_t val_len;
+ /** buffer to hold the OID */
+ oid name_loc[MAX_OID_LEN];
+ /** 90 percentile < 40. */
+ u_char buf[40];
+ /** (Opaque) hook for additional data */
+ void *data;
+ /** callback to free above */
+ void (*dataFreeHook)(void *);
+ int index;
+};
+
+
+
+ /*
+ * 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_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
+ */
+ int snmp_close(netsnmp_session *);
+ 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.
+ */
+ 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.
+ */
+ 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.
+ */
+ void snmp_read(fd_set *);
+
+
+
+ /*
+ * void
+ * snmp_free_pdu(pdu)
+ * netsnmp_pdu *pdu;
+ *
+ * Frees the pdu and any malloc'd data associated with it.
+ */
+ void snmp_free_pdu(netsnmp_pdu *);
+
+ void snmp_free_var(netsnmp_variable_list *); /* frees just this one */
+
+ void snmp_free_varbind(netsnmp_variable_list * var); /* frees all in list */
+
+ /*
+ * 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)
+ */
+ int snmp_select_info(int *, fd_set *, struct timeval *,
+ 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.
+ */
+
+ void snmp_timeout(void);
+
+
+ /*
+ * This routine must be supplied by the application:
+ *
+ * u_char *authenticator(pdu, length, community, community_len)
+ * u_char *pdu; The rest of the PDU to be authenticated
+ * int *length; The length of the PDU (updated by the authenticator)
+ * u_char *community; The community name to authenticate under.
+ * int community_len The length of the community name.
+ *
+ * Returns the authenticated pdu, or NULL if authentication failed.
+ * If null authentication is used, the authenticator in snmp_session can be
+ * set to NULL(0).
+ */
+
+
+
+ /*
+ * This routine must be supplied by the application:
+ *
+ * int callback(operation, session, reqid, pdu, magic)
+ * int operation;
+ * netsnmp_session *session; The session authenticated under.
+ * int reqid; The request id of this pdu (0 for TRAP)
+ * netsnmp_pdu *pdu; The pdu information.
+ * void *magic A link to the data for this routine.
+ *
+ * Returns 1 if request was successful, 0 if it should be kept pending.
+ * Any data in the pdu must be copied because it will be freed elsewhere.
+ * Operations are defined below:
+ */
+
+#define NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE 1
+#define NETSNMP_CALLBACK_OP_TIMED_OUT 2
+#define NETSNMP_CALLBACK_OP_SEND_FAILED 3
+#define NETSNMP_CALLBACK_OP_CONNECT 4
+#define NETSNMP_CALLBACK_OP_DISCONNECT 5
+
+ long snmp_get_next_msgid(void);
+ long snmp_get_next_reqid(void);
+ long snmp_get_next_sessid(void);
+ long snmp_get_next_transid(void);
+
+ int snmp_oid_compare(const oid *, size_t, const oid *,
+ size_t);
+ int snmp_oid_ncompare(const oid *, size_t, const oid *,
+ size_t, size_t);
+ int snmp_oidtree_compare(const oid *, size_t, const oid *,
+ size_t);
+ int snmp_oidsubtree_compare(const oid *, size_t, const oid *,
+ size_t);
+ int netsnmp_oid_compare_ll(const oid * in_name1,
+ size_t len1, const oid * in_name2,
+ size_t len2, size_t *offpt);
+ int netsnmp_oid_equals(const oid *, size_t, const oid *,
+ size_t);
+ int netsnmp_oid_tree_equals(const oid *, size_t, const oid *,
+ size_t);
+ NETSNMP_IMPORT
+ int netsnmp_oid_is_subtree(const oid *, size_t, const oid *,
+ size_t);
+ int netsnmp_oid_find_prefix(const oid * in_name1, size_t len1,
+ const oid * in_name2, size_t len2);
+ void init_snmp(const char *);
+ u_char *snmp_pdu_build(netsnmp_pdu *, u_char *, size_t *);
+#ifdef NETSNMP_USE_REVERSE_ASNENCODING
+ u_char *snmp_pdu_rbuild(netsnmp_pdu *, u_char *, size_t *);
+#endif
+ int snmpv3_parse(netsnmp_pdu *, u_char *, size_t *,
+ u_char **, netsnmp_session *);
+ int snmpv3_packet_build(netsnmp_session *,
+ netsnmp_pdu *pdu, u_char * packet,
+ size_t * out_length,
+ u_char * pdu_data,
+ size_t pdu_data_len);
+ int snmpv3_packet_rbuild(netsnmp_session *,
+ netsnmp_pdu *pdu, u_char * packet,
+ size_t * out_length,
+ u_char * pdu_data,
+ size_t pdu_data_len);
+ int snmpv3_make_report(netsnmp_pdu *pdu, int error);
+ int snmpv3_get_report_type(netsnmp_pdu *pdu);
+ int snmp_pdu_parse(netsnmp_pdu *pdu, u_char * data,
+ size_t * length);
+ u_char *snmpv3_scopedPDU_parse(netsnmp_pdu *pdu, u_char * cp,
+ size_t * length);
+ void snmp_store(const char *type);
+ void snmp_shutdown(const char *type);
+ netsnmp_variable_list *snmp_pdu_add_variable(netsnmp_pdu *, const oid *,
+ size_t, u_char, const u_char *,
+ size_t);
+ netsnmp_variable_list *snmp_varlist_add_variable(netsnmp_variable_list
+ ** varlist,
+ const oid * name,
+ size_t name_length,
+ u_char type,
+ const u_char * value,
+ size_t len);
+ int snmp_add_var(netsnmp_pdu *, const oid *, size_t, char,
+ const char *);
+ oid *snmp_duplicate_objid(const oid * objToCopy, size_t);
+ u_int snmp_increment_statistic(int which);
+ u_int snmp_increment_statistic_by(int which, int count);
+ u_int snmp_get_statistic(int which);
+ void snmp_init_statistics(void);
+ int create_user_from_session(netsnmp_session * session);
+ int snmp_get_fd_for_session(struct snmp_session *sessp);
+
+ /*
+ * New re-allocating reverse encoding functions.
+ */
+#ifdef NETSNMP_USE_REVERSE_ASNENCODING
+
+ int snmpv3_packet_realloc_rbuild(u_char ** pkt, size_t * pkt_len,
+ size_t * offset,
+ netsnmp_session * session,
+ netsnmp_pdu *pdu, u_char * pdu_data,
+ size_t pdu_data_len);
+
+ int snmp_pdu_realloc_rbuild(u_char ** pkt, size_t * pkt_len,
+ size_t * offset, netsnmp_pdu *pdu);
+#endif
+
+
+
+ /*
+ * Extended open; fpre_parse has changed.
+ */
+
+ netsnmp_session *snmp_open_ex(netsnmp_session *,
+ int (*fpre_parse) (netsnmp_session *,
+ struct
+ netsnmp_transport_s *,
+ void *, int),
+ int (*fparse) (netsnmp_session *,
+ netsnmp_pdu *, u_char *,
+ size_t),
+ int (*fpost_parse) (netsnmp_session *,
+ netsnmp_pdu *, int),
+ int (*fbuild) (netsnmp_session *,
+ netsnmp_pdu *, u_char *,
+ size_t *),
+ int (*frbuild) (netsnmp_session *,
+ netsnmp_pdu *, u_char **,
+ size_t *, size_t *),
+ int (*fcheck) (u_char *, size_t));
+
+ /*
+ * provided for backwards compatability. Don't use these functions.
+ * See snmp_debug.h and snmp_debug.c instead.
+ */
+
+ void snmp_set_do_debugging(int);
+ int snmp_get_do_debugging(void);
+
+
+ /*
+ * snmp_error - return error data
+ * Inputs : address of errno, address of snmp_errno, address of string
+ * Caller must free the string returned after use.
+ */
+ void snmp_error(netsnmp_session *, int *, int *, char **);
+ /*
+ * 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)
+ */
+
+ void snmp_sess_init(netsnmp_session *);
+ void *snmp_sess_open(netsnmp_session *);
+ void *snmp_sess_pointer(netsnmp_session *);
+ netsnmp_session *snmp_sess_session(void *);
+
+ /*
+ * Return the netsnmp_transport structure associated with the given opaque
+ * pointer.
+ */
+
+ struct netsnmp_transport_s *snmp_sess_transport(void *);
+ void snmp_sess_transport_set(void *,
+ struct netsnmp_transport_s *);
+
+ /*
+ * EXPERIMENTAL API EXTENSIONS ------------------------------------------
+ *
+ * snmp_sess_add_ex, snmp_sess_add, snmp_add
+ *
+ * Analogous to snmp_open family of functions, but taking an
+ * netsnmp_transport pointer as an extra argument. Unlike snmp_open et
+ * al. it doesn't attempt to interpret the in_session->peername as a
+ * transport endpoint specifier, but instead uses the supplied transport.
+ * JBPN
+ *
+ */
+
+ void *snmp_sess_add_ex(netsnmp_session *,
+ struct netsnmp_transport_s *,
+ int (*fpre_parse) (netsnmp_session *,
+ struct
+ netsnmp_transport_s
+ *, void *, int),
+ int (*fparse) (netsnmp_session *,
+ struct snmp_pdu *,
+ u_char *, size_t),
+ int (*fpost_parse) (netsnmp_session *,
+ struct snmp_pdu *,
+ int),
+ int (*fbuild) (netsnmp_session *,
+ struct snmp_pdu *,
+ u_char *, size_t *),
+ int (*frbuild) (netsnmp_session *,
+ struct snmp_pdu *,
+ u_char **, size_t *,
+ size_t *),
+ int (*fcheck) (u_char *, size_t),
+ netsnmp_pdu *(*fcreate_pdu) (struct
+ netsnmp_transport_s
+ *,
+ void *,
+ size_t));
+
+ void *snmp_sess_add(netsnmp_session *,
+ struct netsnmp_transport_s *,
+ int (*fpre_parse) (netsnmp_session *,
+ struct
+ netsnmp_transport_s *,
+ void *, int),
+ int (*fpost_parse) (netsnmp_session *,
+ netsnmp_pdu *, int));
+
+ netsnmp_session *snmp_add(netsnmp_session *,
+ struct netsnmp_transport_s *,
+ int (*fpre_parse) (netsnmp_session *,
+ struct netsnmp_transport_s
+ *, void *, int),
+ int (*fpost_parse) (netsnmp_session *,
+ netsnmp_pdu *, int));
+ netsnmp_session *snmp_add_full(netsnmp_session * in_session,
+ struct netsnmp_transport_s *transport,
+ int (*fpre_parse) (netsnmp_session *,
+ struct
+ netsnmp_transport_s
+ *, void *, int),
+ int (*fparse) (netsnmp_session *,
+ netsnmp_pdu *, u_char *,
+ size_t),
+ int (*fpost_parse) (netsnmp_session *,
+ netsnmp_pdu *, int),
+ int (*fbuild) (netsnmp_session *,
+ netsnmp_pdu *, u_char *,
+ size_t *),
+ int (*frbuild) (netsnmp_session *,
+ netsnmp_pdu *,
+ u_char **, size_t *,
+ size_t *),
+ int (*fcheck) (u_char *, size_t),
+ netsnmp_pdu *(*fcreate_pdu) (struct
+ netsnmp_transport_s
+ *, void *,
+ size_t)
+ );
+
+ /*
+ * use return value from snmp_sess_open as void * parameter
+ */
+
+ int snmp_sess_send(void *, netsnmp_pdu *);
+ int snmp_sess_async_send(void *, netsnmp_pdu *,
+ netsnmp_callback, void *);
+ int snmp_sess_select_info(void *, int *, fd_set *,
+ struct timeval *, int *);
+ int snmp_sess_read(void *, fd_set *);
+ void snmp_sess_timeout(void *);
+ int snmp_sess_close(void *);
+
+ void snmp_sess_error(void *, int *, int *, char **);
+ void netsnmp_sess_log_error(int priority,
+ const char *prog_string,
+ netsnmp_session * ss);
+ void snmp_sess_perror(const char *prog_string,
+ netsnmp_session * ss);
+ const char * snmp_pdu_type(int type);
+
+ /*
+ * end single session API
+ */
+
+ /*
+ * generic statistic counters
+ */
+
+ /*
+ * snmpv3 statistics
+ */
+
+ /*
+ * mpd stats
+ */
+#define STAT_SNMPUNKNOWNSECURITYMODELS 0
+#define STAT_SNMPINVALIDMSGS 1
+#define STAT_SNMPUNKNOWNPDUHANDLERS 2
+#define STAT_MPD_STATS_START STAT_SNMPUNKNOWNSECURITYMODELS
+#define STAT_MPD_STATS_END STAT_SNMPUNKNOWNPDUHANDLERS
+
+ /*
+ * usm stats
+ */
+#define STAT_USMSTATSUNSUPPORTEDSECLEVELS 3
+#define STAT_USMSTATSNOTINTIMEWINDOWS 4
+#define STAT_USMSTATSUNKNOWNUSERNAMES 5
+#define STAT_USMSTATSUNKNOWNENGINEIDS 6
+#define STAT_USMSTATSWRONGDIGESTS 7
+#define STAT_USMSTATSDECRYPTIONERRORS 8
+#define STAT_USM_STATS_START STAT_USMSTATSUNSUPPORTEDSECLEVELS
+#define STAT_USM_STATS_END STAT_USMSTATSDECRYPTIONERRORS
+
+ /*
+ * snmp counters
+ */
+#define STAT_SNMPINPKTS 9
+#define STAT_SNMPOUTPKTS 10
+#define STAT_SNMPINBADVERSIONS 11
+#define STAT_SNMPINBADCOMMUNITYNAMES 12
+#define STAT_SNMPINBADCOMMUNITYUSES 13
+#define STAT_SNMPINASNPARSEERRS 14
+ /*
+ * #define STAT_SNMPINBADTYPES 15
+ */
+#define STAT_SNMPINTOOBIGS 16
+#define STAT_SNMPINNOSUCHNAMES 17
+#define STAT_SNMPINBADVALUES 18
+#define STAT_SNMPINREADONLYS 19
+#define STAT_SNMPINGENERRS 20
+#define STAT_SNMPINTOTALREQVARS 21
+#define STAT_SNMPINTOTALSETVARS 22
+#define STAT_SNMPINGETREQUESTS 23
+#define STAT_SNMPINGETNEXTS 24
+#define STAT_SNMPINSETREQUESTS 25
+#define STAT_SNMPINGETRESPONSES 26
+#define STAT_SNMPINTRAPS 27
+#define STAT_SNMPOUTTOOBIGS 28
+#define STAT_SNMPOUTNOSUCHNAMES 29
+#define STAT_SNMPOUTBADVALUES 30
+ /*
+ * #define STAT_SNMPOUTREADONLYS 31
+ */
+#define STAT_SNMPOUTGENERRS 32
+#define STAT_SNMPOUTGETREQUESTS 33
+#define STAT_SNMPOUTGETNEXTS 34
+#define STAT_SNMPOUTSETREQUESTS 35
+#define STAT_SNMPOUTGETRESPONSES 36
+#define STAT_SNMPOUTTRAPS 37
+ /*
+ * AUTHTRAPENABLE 38
+ */
+#define STAT_SNMPSILENTDROPS 39
+#define STAT_SNMPPROXYDROPS 40
+#define STAT_SNMP_STATS_START STAT_SNMPINPKTS
+#define STAT_SNMP_STATS_END STAT_SNMPPROXYDROPS
+
+ /*
+ * target mib counters
+ */
+#define STAT_SNMPUNAVAILABLECONTEXTS 41
+#define STAT_SNMPUNKNOWNCONTEXTS 42
+#define STAT_TARGET_STATS_START STAT_SNMPUNAVAILABLECONTEXTS
+#define STAT_TARGET_STATS_END STAT_SNMPUNKNOWNCONTEXTS
+
+#define MAX_STATS 43
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* SNMP_API_H */