Mercurial > nand-ecoscentric
diff packages/net/snmp/lib/current/include/snmp_api.h @ 103:95f3e12a6327 ecos-sw-2000-06-23
Merge from eCos master repository on 2000-06-23-16:41:10-BST
| author | jlarmour |
|---|---|
| date | Fri, 23 Jun 2000 17:06:31 +0000 |
| parents | |
| children | e0c0827131d1 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/net/snmp/lib/current/include/snmp_api.h @@ -0,0 +1,847 @@ +//========================================================================== +// +// ./lib/current/include/snmp_api.h +// +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//####UCDSNMPCOPYRIGHTBEGIN#### +// +// ------------------------------------------- +// +// Portions of this software may have been derived from the UCD-SNMP +// project, <http://ucd-snmp.ucdavis.edu/> from the University of +// California at Davis, which was originally based on the Carnegie Mellon +// University SNMP implementation. Portions of this software are therefore +// covered by the appropriate copyright disclaimers included herein. +// +// The release used was version 4.1.2 of May 2000. "ucd-snmp-4.1.2" +// ------------------------------------------- +// +//####UCDSNMPCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): hmt +// Contributors: hmt +// Date: 2000-05-30 +// Purpose: Port of UCD-SNMP distribution to eCos. +// Description: +// +// +//####DESCRIPTIONEND#### +// +//========================================================================== +/******************************************************************** + Copyright 1989, 1991, 1992 by Carnegie Mellon University + + Derivative Work - +Copyright 1996, 1998, 1999, 2000 The Regents of the University of California + + 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 appears in all copies and +that both that copyright notice and this permission notice appear in +supporting documentation, and that the name of CMU and The Regents of +the University of California not be used in advertising or publicity +pertaining to distribution of the software without specific written +permission. + +CMU AND THE REGENTS OF THE UNIVERSITY OF CALIFORNIA DISCLAIM ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CMU OR +THE REGENTS OF THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR ANY SPECIAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING +FROM THE 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. +*********************************************************************/ +#ifndef SNMP_API_H +#define SNMP_API_H + +/* + * snmp_api.h - API for access to snmp. + * + * 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. +******************************************************************/ + + +struct variable_list; +struct timeval; + + + /* + * Mimic size and alignment of 'struct sockaddr_storage' (see RFC 2553) + * But retain field names of traditional 'struct sockaddr' + */ + +#define _UCD_SS_MAXSIZE 92 /* <= sizeof( sockaddr_un ) */ +#define _UCD_SS_ALIGNSIZE (sizeof (long)) + +#define _UCD_SS_PAD1SIZE (_UCD_SS_ALIGNSIZE - sizeof( unsigned short )) +#define _UCD_SS_PAD2SIZE (_UCD_SS_MAXSIZE - \ + (sizeof( unsigned short ) + _UCD_SS_PAD1SIZE + _UCD_SS_ALIGNSIZE )) + +typedef struct { + +#ifdef STRUCT_SOCKADDR_HAS_SA_UNION_SA_GENERIC_SA_FAMILY2 + /* + * Certain systems (notably Irix 6.x) have a non-traditional + * socket structure, and #define the traditional field names. + * This local definition should reproduce this structure, and still + * be large enough to handle any necessary Unix domain addresses. + */ + union { + struct { +#ifdef _HAVE_SA_LEN + unsigned char sa_len2; + unsigned char sa_family2; +#else + unsigned short sa_family2; +#endif + char sa_data2[ _UCD_SS_PAD1SIZE ]; + } sa_generic; + long sa_align; + char sa_pad2[ _UCD_SS_PAD2SIZE ]; + } sa_union; + +#else + +#ifdef STRUCT_SOCKADDR_HAS_SA_LEN + unsigned char sa_len; + unsigned char sa_family; +#else + unsigned short sa_family; +#endif + char sa_data[ _UCD_SS_PAD1SIZE ]; + long sa_align; + char sa_pad2[ _UCD_SS_PAD2SIZE ]; +#endif + +} snmp_ipaddr; + +#define USM_AUTH_KU_LEN 32 +#define USM_PRIV_KU_LEN 32 + +struct snmp_pdu { + + /* + * Protocol-version independent fields + */ + long version; + int command; /* Type of this PDU */ + long reqid; /* Request id - note: not incremented on retries */ + long msgid; /* Message id for V3 messages + * note: incremented for each retry */ + long transid; /* Unique ID for incoming transactions */ + long sessid; /* Session id for AgentX messages */ + long errstat; /* Error status (non_repeaters in GetBulk) */ + long errindex; /* Error index (max_repetitions in GetBulk) */ + u_long time; /* Uptime */ + u_long flags; + + int securityModel; + int securityLevel; /* noAuthNoPriv, authNoPriv, authPriv */ + int msgParseModel; + + snmp_ipaddr address; /* Address of peer or trap destination */ + + struct variable_list *variables; + + + /* + * SNMPv1 & SNMPv2c fields + */ + u_char *community; /* community for outgoing requests. */ + size_t community_len; /* Length of community name. */ + + /* + * Trap information + */ + oid *enterprise; /* System OID */ + size_t enterprise_length; + long trap_type; /* trap type */ + long specific_type; /* specific type */ + snmp_ipaddr agent_addr; + + /* + * SNMPv3 fields + */ + u_char *contextEngineID; /* context snmpEngineID */ + size_t contextEngineIDLen; /* Length of contextEngineID */ + char *contextName; /* authoritative contextName */ + size_t contextNameLen; /* Length of contextName */ + u_char *securityEngineID; /* authoritative snmpEngineID for security */ + size_t securityEngineIDLen;/* Length of securityEngineID */ + char *securityName; /* on behalf of this principal */ + size_t securityNameLen; /* Length of securityName. */ + + /* + * AgentX fields + * (also uses SNMPv1 community field) + */ + int priority; + int range_subid; + + void * securityStateRef; +}; + +struct snmp_session; +typedef int (*snmp_callback) (int, struct snmp_session *, int, struct snmp_pdu *, void *); + +struct snmp_session { + /* + * Protocol-version independent fields + */ + long version; + int retries; /* Number of retries before timeout. */ + long timeout; /* Number of uS until first timeout, then exponential backoff */ + u_long flags; + struct snmp_session *subsession; + struct snmp_session *next; + + char *peername; /* Domain name or dotted IP address of default peer */ + u_short remote_port;/* UDP port number of peer. */ + u_short local_port; /* My UDP port number, 0 for default, picked randomly */ + /* Authentication function or NULL if null authentication is used */ + u_char *(*authenticator) (u_char *, size_t *, u_char *, size_t); + snmp_callback callback; /* Function to interpret incoming data */ + /* Pointer to data that the callback function may consider important */ + void *callback_magic; + + int s_errno; /* copy of system errno */ + int s_snmp_errno; /* copy of library errno */ + long sessid; /* Session id - AgentX only */ + + /* + * SNMPv1 & SNMPv2c fields + */ + u_char *community; /* community for outgoing requests. */ + size_t community_len; /* Length of community name. */ + + /* + * SNMPv3 fields + */ + u_char *contextEngineID; /* authoritative snmpEngineID */ + size_t contextEngineIDLen; /* Length of contextEngineID */ + u_int engineBoots; /* initial engineBoots for remote engine */ + u_int engineTime; /* initial engineTime for remote engine */ + char *contextName; /* authoritative contextName */ + size_t contextNameLen; /* Length of contextName */ + u_char *securityEngineID; /* authoritative snmpEngineID */ + size_t securityEngineIDLen; /* Length of contextEngineID */ + char *securityName; /* on behalf of this principal */ + size_t securityNameLen; /* Length of securityName. */ + oid *securityAuthProto; /* auth protocol oid */ + size_t securityAuthProtoLen; /* Length of auth protocol oid */ + u_char securityAuthKey[USM_AUTH_KU_LEN]; /* Ku for auth protocol XXX */ + size_t securityAuthKeyLen; /* Length of Ku for auth protocol */ + oid *securityPrivProto; /* priv protocol oid */ + size_t securityPrivProtoLen; /* Length of priv protocol oid */ + u_char securityPrivKey[USM_PRIV_KU_LEN]; /* Ku for privacy protocol XXX */ + size_t securityPrivKeyLen; /* Length of Ku for priv protocol */ + int securityModel; + int securityLevel; /* noAuthNoPriv, authNoPriv, authPriv */ +}; + +/* + * A list of all the outstanding requests for a particular session. + */ +#ifdef SNMP_NEED_REQUEST_LIST +struct request_list { + struct request_list *next_request; + long request_id; /* request id */ + long message_id; /* message id */ + snmp_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; + struct snmp_pdu *pdu; /* The pdu for this request + (saved so it can be retransmitted */ +}; +#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_CONTEXT "" +#define SNMP_DEFAULT_AUTH_PROTO usmHMACMD5AuthProtocol +#define SNMP_DEFAULT_AUTH_PROTOLEN USM_LENGTH_OID_TRANSFORM +#define SNMP_DEFAULT_PRIV_PROTO usmDESPrivProtocol +#define SNMP_DEFAULT_PRIV_PROTOLEN USM_LENGTH_OID_TRANSFORM + +extern const char *snmp_api_errstring (int); +extern void snmp_perror (const char *); +extern void snmp_set_detail (const char *); + +#define SNMP_MAX_MSG_SIZE 1472 /* ethernet MTU minus IP/UDP header */ +#define SNMP_MAX_ENG_SIZE 32 +#define SNMP_MAX_SEC_NAME_SIZE 256 +#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 +/* 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_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 + +/* + * 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_MAX (-62) + +#define non_repeaters errstat +#define max_repetitions errindex + + +struct variable_list { + struct variable_list *next_variable; /* NULL for last variable */ + oid *name; /* Object identifier of variable */ + size_t name_length; /* number of subid's in name */ + u_char type; /* ASN type of variable */ + union { /* value of variable */ + long *integer; + u_char *string; + oid *objid; + u_char *bitstring; + struct counter64 *counter64; +#ifdef OPAQUE_SPECIAL_TYPES + float *floatVal; + double *doubleVal; +/* t_union *unionVal; */ +#endif /* OPAQUE_SPECIAL_TYPES */ + } val; + size_t val_len; + oid name_loc[MAX_OID_LEN]; /* 90 percentile < 24. */ + u_char buf[40]; /* 90 percentile < 40. */ +}; + + + +/* + * struct snmp_session *snmp_open(session) + * struct snmp_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. + */ +struct snmp_session *snmp_open (struct snmp_session *); + +/* + * int snmp_close(session) + * struct snmp_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 (struct snmp_session *); +int snmp_close_sessions (void); + + +/* + * int snmp_send(session, pdu) + * struct snmp_session *session; + * struct snmp_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 (struct snmp_session *, struct snmp_pdu *); + +/* + * int snmp_async_send(session, pdu, callback, cb_data) + * struct snmp_session *session; + * struct snmp_pdu *pdu; + * snmp_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 (struct snmp_session *, struct snmp_pdu *, + snmp_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) + * struct snmp_pdu *pdu; + * + * Frees the pdu and any malloc'd data associated with it. + */ +void snmp_free_pdu (struct snmp_pdu *); + +void snmp_free_var (struct variable_list *); + +void snmp_free_varbind(struct variable_list *var); + +/* + * 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; + * struct snmp_session *session; The session authenticated under. + * int reqid; The request id of this pdu (0 for TRAP) + * struct snmp_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 RECEIVED_MESSAGE 1 +#define TIMED_OUT 2 + +long snmp_get_next_msgid(void); +long snmp_get_next_reqid(void); +long snmp_get_next_sessid(void); +long snmp_get_next_transid(void); +/* provide for backwards compatibility */ +void snmp_set_dump_packet(int); +int snmp_get_dump_packet(void); +void snmp_set_quick_print(int); +int snmp_get_quick_print(void); +void snmp_set_suffix_only(int); +int snmp_get_suffix_only(void); +void snmp_set_full_objid(int); +int snmp_get_full_objid(void); +void snmp_set_random_access(int); +int snmp_get_random_access(void); + +int snmp_oid_compare (const oid *, size_t, const oid *, size_t); +void init_snmp (const char *); +u_char *snmp_pdu_build (struct snmp_pdu *, u_char *, size_t *); +int snmpv3_parse(struct snmp_pdu *, u_char *, size_t *, u_char **); +int snmpv3_dparse(struct snmp_pdu *, u_char *, size_t *, u_char **, int); +int snmpv3_packet_build(struct snmp_pdu *pdu, u_char *packet, size_t *out_length, u_char *pdu_data, size_t pdu_data_len); +int snmpv3_make_report(struct snmp_pdu *pdu, int error); +int snmpv3_get_report_type(struct snmp_pdu *pdu); +int snmp_pdu_parse(struct snmp_pdu *pdu, u_char *data, size_t *length); +int snmp_pdu_dparse(struct snmp_pdu *pdu, u_char *data, size_t *length, int); +u_char* snmpv3_scopedPDU_parse(struct snmp_pdu *pdu, u_char *cp, size_t *length); +u_char* snmpv3_scopedPDU_dparse(struct snmp_pdu *pdu, u_char *cp, size_t *length, int); +void snmp_shutdown(const char *type); +struct variable_list *snmp_pdu_add_variable (struct snmp_pdu *, oid *, size_t, u_char, u_char *, size_t); +struct variable_list *snmp_varlist_add_variable(struct variable_list **varlist, + oid *name, size_t name_length, u_char type, u_char *value, size_t len); +int hex_to_binary (const char *, u_char *); +int ascii_to_binary (const char *, u_char *); +int snmp_add_var (struct snmp_pdu *, oid*, size_t, char, const char *); +oid *snmp_duplicate_objid(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(struct snmp_session *session); + +/* extended open */ +struct snmp_session *snmp_open_ex (struct snmp_session *, + int (*fpre_parse) (struct snmp_session *, snmp_ipaddr), + int (*fparse) (struct snmp_session *, struct snmp_pdu *, u_char *, size_t), + int (*fpost_parse) (struct snmp_session *, struct snmp_pdu *, int), + int (*fbuild) (struct snmp_session *, struct snmp_pdu *, u_char *, 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. +*/ +#if HAVE_STDARG_H +void DEBUGP (const char *, ...); +#else +void DEBUGP (va_alist); +#endif +void DEBUGPOID(oid *, size_t); +void snmp_set_do_debugging (int); +int snmp_get_do_debugging (void); + +#ifdef CMU_COMPATIBLE +extern int snmp_dump_packet; +extern int quick_print; +#endif + +size_t snmp_socket_length (int family); + +/* + * 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 (struct snmp_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; + struct snmp_session session, *ss; + struct snmp_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 (struct snmp_session *); +void * snmp_sess_open (struct snmp_session *); +struct snmp_session * snmp_sess_session (void *); + +/* use return value from snmp_sess_open as void * parameter */ + +int snmp_sess_send (void *, struct snmp_pdu *); +int snmp_sess_async_send (void *, struct snmp_pdu *, + snmp_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 snmp_sess_perror (const char *prog_string, struct snmp_session *ss); + +/* 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_SNMPOUTTRAPS + +#define MAX_STATS 41 + +#ifdef __cplusplus +} +#endif + +#endif /* SNMP_API_H */
