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 */