summaryrefslogtreecommitdiff
path: root/include/net-snmp/library/snmp_transport.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/net-snmp/library/snmp_transport.h')
-rw-r--r--include/net-snmp/library/snmp_transport.h317
1 files changed, 317 insertions, 0 deletions
diff --git a/include/net-snmp/library/snmp_transport.h b/include/net-snmp/library/snmp_transport.h
new file mode 100644
index 0000000..4162897
--- /dev/null
+++ b/include/net-snmp/library/snmp_transport.h
@@ -0,0 +1,317 @@
+#ifndef _SNMP_TRANSPORT_H
+#define _SNMP_TRANSPORT_H
+
+#include <sys/types.h>
+
+#if HAVE_SYS_SOCKET_H
+#ifdef solaris2
+#define _XPG4_2
+#endif
+
+#if defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
+#define _LINUX_SOURCE_COMPAT
+#endif
+
+#include <sys/socket.h>
+
+#ifdef solaris2
+# ifndef CMSG_SPACE
+# define CMSG_SPACE(l) \
+ ((unsigned int)_CMSG_HDR_ALIGN(sizeof (struct cmsghdr) + (l)))
+# define CMSG_LEN(l) (_CMSG_HDR_ALIGN(sizeof(struct cmsghdr)) + (l))
+# endif
+#endif
+#endif /* HAVE_SYS_SOCKET_H */
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#include <net-snmp/library/asn1.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Some transport-type constants. */
+
+#ifndef NETSNMP_STREAM_QUEUE_LEN
+#define NETSNMP_STREAM_QUEUE_LEN 5
+#endif
+
+/* Some transport-type flags. */
+
+#define NETSNMP_TRANSPORT_FLAG_STREAM 0x01
+#define NETSNMP_TRANSPORT_FLAG_LISTEN 0x02
+#define NETSNMP_TRANSPORT_FLAG_TUNNELED 0x04
+#define NETSNMP_TRANSPORT_FLAG_TMSTATE 0x08 /* indicates opaque is a
+ TSM tmStateReference */
+#define NETSNMP_TRANSPORT_FLAG_EMPTY_PKT 0x10
+#define NETSNMP_TRANSPORT_FLAG_OPENED 0x20 /* f_open called */
+#define NETSNMP_TRANSPORT_FLAG_HOSTNAME 0x80 /* for fmtaddr hook */
+
+/* The standard SNMP domains. */
+
+NETSNMP_IMPORT oid netsnmpUDPDomain[]; /* = { 1, 3, 6, 1, 6, 1, 1 }; */
+NETSNMP_IMPORT oid netsnmpCLNSDomain[]; /* = { 1, 3, 6, 1, 6, 1, 2 }; */
+NETSNMP_IMPORT oid netsnmpCONSDomain[]; /* = { 1, 3, 6, 1, 6, 1, 3 }; */
+NETSNMP_IMPORT oid netsnmpDDPDomain[]; /* = { 1, 3, 6, 1, 6, 1, 4 }; */
+NETSNMP_IMPORT oid netsnmpIPXDomain[]; /* = { 1, 3, 6, 1, 6, 1, 5 }; */
+NETSNMP_IMPORT size_t netsnmpUDPDomain_len;
+NETSNMP_IMPORT size_t netsnmpCLNSDomain_len;
+NETSNMP_IMPORT size_t netsnmpCONSDomain_len;
+NETSNMP_IMPORT size_t netsnmpDDPDomain_len;
+NETSNMP_IMPORT size_t netsnmpIPXDomain_len;
+
+/* Structure which stores transport security model specific parameters */
+/* isms-secshell-11 section 4.1 */
+
+/* contents documented in draft-ietf-isms-transport-security-model
+ Section 3.2 */
+/* note: VACM only allows <= 32 so this is overkill till another ACM comes */
+#define NETSNMP_TM_MAX_SECNAME 256
+
+typedef union netsnmp_sockaddr_storage_u {
+ struct sockaddr sa;
+ struct sockaddr_in sin;
+#ifdef NETSNMP_ENABLE_IPV6
+ struct sockaddr_in6 sin6;
+#endif
+} netsnmp_sockaddr_storage;
+
+typedef struct netsnmp_addr_pair_s {
+ netsnmp_sockaddr_storage remote_addr;
+ netsnmp_sockaddr_storage local_addr;
+} netsnmp_addr_pair;
+
+typedef struct netsnmp_indexed_addr_pair_s {
+ netsnmp_sockaddr_storage remote_addr;
+ netsnmp_sockaddr_storage local_addr;
+ int if_index;
+} netsnmp_indexed_addr_pair;
+
+typedef struct netsnmp_tmStateReference_s {
+ oid transportDomain[MAX_OID_LEN];
+ size_t transportDomainLen;
+ char securityName[NETSNMP_TM_MAX_SECNAME];
+ size_t securityNameLen;
+ int requestedSecurityLevel;
+ int transportSecurityLevel;
+ char sameSecurity;
+ char sessionID[8];
+
+ char have_addresses;
+ netsnmp_indexed_addr_pair addresses;
+
+ void *otherTransportOpaque; /* XXX: May have mem leak issues */
+} netsnmp_tmStateReference;
+
+/* Structure which defines the transport-independent API. */
+
+struct snmp_session;
+
+typedef struct netsnmp_transport_s {
+ /* The transport domain object identifier. */
+
+ const oid *domain;
+ int domain_length; /* In sub-IDs, not octets. */
+
+ /* Local transport address (in relevant SNMP-style encoding). */
+
+ unsigned char *local;
+ int local_length; /* In octets. */
+
+ /* Remote transport address (in relevant SNMP-style encoding). */
+
+ unsigned char *remote;
+ int remote_length; /* In octets. */
+
+ /* The actual socket. */
+
+ int sock;
+
+ /* Flags (see #definitions above). */
+
+ unsigned int flags;
+
+ /* Protocol-specific opaque data pointer. */
+
+ void *data;
+ int data_length;
+
+ /* Maximum size of PDU that can be sent/received by this transport. */
+
+ size_t msgMaxSize;
+
+#ifdef FOR_STANDARDS_COMPLIANCE_OR_FUTURE_USE
+ /* TM state reference per ISMS WG solution */
+ netsnmp_tmStateReference *tmStateRef;
+#endif
+
+ /* tunneled transports */
+ struct netsnmp_transport_s * base_transport;
+
+ /* Callbacks. Arguments are:
+ *
+ * "this" pointer, fd, buf, size, *opaque, *opaque_length
+ */
+
+ int (*f_recv) (struct netsnmp_transport_s *, void *,
+ int, void **, int *);
+ int (*f_send) (struct netsnmp_transport_s *, void *,
+ int, void **, int *);
+ int (*f_close) (struct netsnmp_transport_s *);
+
+ /* Optional: opening can occur during creation if more appropriate */
+ struct netsnmp_transport_s * (*f_open) (struct netsnmp_transport_s *);
+
+ /* This callback is only necessary for stream-oriented transports. */
+
+ int (*f_accept) (struct netsnmp_transport_s *);
+
+ /* Optional callback to format a transport address. */
+
+ char *(*f_fmtaddr)(struct netsnmp_transport_s *, void *, int);
+
+ /* Optional callback to support extra configuration token/value pairs */
+ /* return non-zero on error */
+ int (*f_config)(struct netsnmp_transport_s *, const char *,
+ const char *);
+
+ /* Optional callback that is called after the first transport is
+ cloned to the second */
+ int (*f_copy)(struct netsnmp_transport_s *,
+ struct netsnmp_transport_s *);
+
+ /* Setup initial session config if special things are needed */
+ int (*f_setup_session)(struct netsnmp_transport_s *,
+ struct snmp_session *);
+
+ /* allocated host name identifier; used by configuration system
+ to load localhost.conf for host-specific configuration */
+ u_char *identifier; /* udp:localhost:161 -> "localhost" */
+} netsnmp_transport;
+
+typedef struct netsnmp_transport_list_s {
+ netsnmp_transport *transport;
+ struct netsnmp_transport_list_s *next;
+} netsnmp_transport_list;
+
+typedef struct netsnmp_tdomain_s {
+ const oid *name;
+ size_t name_length;
+ const char **prefix;
+
+ /*
+ * The f_create_from_tstring field is deprecated, please do not use it
+ * for new code and try to migrate old code away from using it.
+ */
+ netsnmp_transport *(*f_create_from_tstring) (const char *, int);
+
+ netsnmp_transport *(*f_create_from_ostring) (const u_char *, size_t, int);
+
+ struct netsnmp_tdomain_s *next;
+
+ netsnmp_transport *(*f_create_from_tstring_new) (const char *, int,
+ const char*);
+
+} netsnmp_tdomain;
+
+void init_snmp_transport(void);
+
+/* Some utility functions. */
+
+char *netsnmp_transport_peer_string(netsnmp_transport *t, void *data, int len);
+
+int netsnmp_transport_send(netsnmp_transport *t, void *data, int len,
+ void **opaque, int *olength);
+int netsnmp_transport_recv(netsnmp_transport *t, void *data, int len,
+ void **opaque, int *olength);
+
+int netsnmp_transport_add_to_list(netsnmp_transport_list **transport_list,
+ netsnmp_transport *transport);
+int netsnmp_transport_remove_from_list(netsnmp_transport_list **transport_list,
+ netsnmp_transport *transport);
+int netsnmp_sockaddr_size(struct sockaddr *sa);
+
+
+/*
+ * Return an exact (deep) copy of t, or NULL if there is a memory allocation
+ * problem (for instance).
+ */
+
+netsnmp_transport *netsnmp_transport_copy(netsnmp_transport *t);
+
+
+/* Free an netsnmp_transport. */
+
+NETSNMP_IMPORT
+void netsnmp_transport_free(netsnmp_transport *t);
+
+
+/*
+ * If the passed oid (in_oid, in_len) corresponds to a supported transport
+ * domain, return 1; if not return 0. If out_oid is not NULL and out_len is
+ * not NULL, then the "internal" oid which should be used to identify this
+ * domain (e.g. in pdu->tDomain etc.) is written to *out_oid and its length to
+ * *out_len.
+ */
+
+NETSNMP_IMPORT
+int netsnmp_tdomain_support(const oid *in_oid, size_t in_len,
+ const oid **out_oid, size_t *out_len);
+
+int netsnmp_tdomain_register(netsnmp_tdomain *domain);
+
+int netsnmp_tdomain_unregister(netsnmp_tdomain *domain);
+
+NETSNMP_IMPORT
+void netsnmp_clear_tdomain_list(void);
+
+void netsnmp_tdomain_init(void);
+
+NETSNMP_IMPORT
+netsnmp_transport *netsnmp_tdomain_transport(const char *str,
+ int local,
+ const char *default_domain);
+
+NETSNMP_IMPORT
+netsnmp_transport *netsnmp_tdomain_transport_full(const char *application,
+ const char *str,
+ int local,
+ const char *default_domain,
+ const char *default_target);
+
+NETSNMP_IMPORT
+netsnmp_transport *netsnmp_tdomain_transport_oid(const oid * dom,
+ size_t dom_len,
+ const u_char * o,
+ size_t o_len,
+ int local);
+
+NETSNMP_IMPORT
+netsnmp_transport*
+netsnmp_transport_open_client(const char* application, const char* str);
+
+NETSNMP_IMPORT
+netsnmp_transport*
+netsnmp_transport_open_server(const char* application, const char* str);
+
+netsnmp_transport*
+netsnmp_transport_open(const char* application, const char* str, int local);
+
+typedef struct netsnmp_transport_config_s {
+ char *key;
+ char *value;
+} netsnmp_transport_config;
+
+NETSNMP_IMPORT
+int netsnmp_transport_config_compare(netsnmp_transport_config *left,
+ netsnmp_transport_config *right);
+NETSNMP_IMPORT
+netsnmp_transport_config *netsnmp_transport_create_config(char *key,
+ char *value);
+#ifdef __cplusplus
+}
+#endif
+#endif/*_SNMP_TRANSPORT_H*/