blob: 5e80a45b714ad032815cc0b06e2e07a9bc3a4338 [file] [log] [blame]
#ifndef NET_SNMP_TYPES_H
#define NET_SNMP_TYPES_H
/**
* Definitions of data structures, used within the library API.
*/
#include <stdio.h>
#ifndef NET_SNMP_CONFIG_H
#error "Please include <net-snmp/net-snmp-config.h> before this file"
#endif
/*
* For 'timeval'
*/
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#endif
#include <sys/types.h>
#if 1
/*
* If neither the Microsoft winsock header file nor the MinGW winsock header
* file has already been included, do this now.
*/
# if defined(HAVE_WINSOCK2_H) && defined(HAVE_WS2TCPIP_H)
# if !defined(__MINGW32__) && !defined(HAVE_WIN32_PLATFORM_SDK) && \
_MSC_VER -0 <= 1200 && _WIN32_WINNT -0 >= 0x0400
/*
* When using the MSVC 6 header files, including <winsock2.h> when
* _WIN32_WINNT >= 0x0400 results in a compilation error. Hence include
* <windows.h> instead, because <winsock2.h> is included from inside
* <windows.h> when _WIN32_WINNT >= 0x0400. The SDK version of <windows.h>
* does not include <winsock2.h> however.
*/
# include <windows.h>
# else
# include <winsock2.h>
# endif
# include <ws2tcpip.h>
# elif defined(HAVE_WINSOCK_H)
# include <winsock.h>
# endif
#endif
#if defined(WIN32) && !defined(cygwin)
typedef HANDLE netsnmp_pid_t;
#define NETSNMP_NO_SUCH_PROCESS INVALID_HANDLE_VALUE
#else
/*
* Note: on POSIX-compliant systems, pid_t is defined in <sys/types.h>.
* And if pid_t has not been defined in <sys/types.h>, AC_TYPE_PID_T ensures
* that a pid_t definition is present in net-snmp-config.h.
*/
typedef pid_t netsnmp_pid_t;
#define NETSNMP_NO_SUCH_PROCESS -1
#endif
#if HAVE_NETINET_IN_H
#include <netinet/in.h> /* For definition of in_addr_t */
#endif
#include <net-snmp/library/oid.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifndef HAVE_SOCKLEN_T
typedef u_int socklen_t;
#endif
#ifndef HAVE_IN_ADDR_T
/*
* The type in_addr_t must match the type of sockaddr_in::sin_addr.
* For MSVC and MinGW32, this is u_long.
*/
typedef u_long in_addr_t;
#endif
#ifndef HAVE_SSIZE_T
#if defined(__INT_MAX__) && __INT_MAX__ == 2147483647
typedef int ssize_t;
#else
typedef long ssize_t;
#endif
#endif
#ifndef HAVE_NFDS_T
typedef unsigned long int nfds_t;
#endif
/*
* For the initial release, this will just refer to the
* relevant UCD header files.
* In due course, the types and structures relevant to the
* Net-SNMP API will be identified, and defined here directly.
*
* But for the time being, this header file is primarily a placeholder,
* to allow application writers to adopt the new header file names.
*/
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;
#define MAX_OID_LEN 128 /* max subid's in an oid */
/** @typedef struct variable_list netsnmp_variable_list
* Typedefs the variable_list struct into netsnmp_variable_list */
/** @struct variable_list
* The netsnmp variable list binding structure, it's typedef'd to
* netsnmp_variable_list.
*/
typedef 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_variable_list;
/** @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 {
#define non_repeaters errstat
#define max_repetitions errindex
/*
* 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;
/** @typedef struct snmp_session netsnmp_session
* Typedefs the snmp_session struct intonetsnmp_session */
struct snmp_session;
typedef struct snmp_session netsnmp_session;
#define USM_AUTH_KU_LEN 32
#define USM_PRIV_KU_LEN 32
typedef int (*snmp_callback) (int, netsnmp_session *, int,
netsnmp_pdu *, void *);
typedef int (*netsnmp_callback) (int, netsnmp_session *, int,
netsnmp_pdu *, void *);
struct netsnmp_container_s;
/** @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;
/**
* transport specific configuration
*/
struct netsnmp_container_s *transport_configuration;
/**
* 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;
};
#include <net-snmp/library/types.h>
#include <net-snmp/definitions.h>
#include <net-snmp/library/snmp_api.h>
#ifdef __cplusplus
}
#endif
#endif /* NET_SNMP_TYPES_H */