summaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorMartijn van Duren <martijn@cvs.openbsd.org>2020-06-30 16:59:39 +0000
committerMartijn van Duren <martijn@cvs.openbsd.org>2020-06-30 16:59:39 +0000
commit8e9a1f4a984e391d34de7c154c8caebff78ac414 (patch)
treeb3e375b8cfcedc493a327f786e8b6a9aebf278e6 /usr.sbin
parentc04a65304d8d2798482aac1467fc7248dfe8d423 (diff)
Allow relayd to compile without reaching back into snmpd directory for
agentx header. OK denis@
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/relayd/Makefile4
-rw-r--r--usr.sbin/relayd/snmp.h452
2 files changed, 454 insertions, 2 deletions
diff --git a/usr.sbin/relayd/Makefile b/usr.sbin/relayd/Makefile
index 5f33e639509..9ff3173f784 100644
--- a/usr.sbin/relayd/Makefile
+++ b/usr.sbin/relayd/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.32 2017/07/03 22:21:47 espie Exp $
+# $OpenBSD: Makefile,v 1.33 2020/06/30 16:59:38 martijn Exp $
PROG= relayd
SRCS= parse.y
@@ -11,7 +11,7 @@ MAN= relayd.8 relayd.conf.5
LDADD= -levent -ltls -lssl -lcrypto -lutil
DPADD= ${LIBEVENT} ${LIBSSL} ${LIBCRYPTO} ${LIBUTIL}
-CFLAGS+= -Wall -I${.CURDIR} -I${.CURDIR}/../snmpd
+CFLAGS+= -Wall -I${.CURDIR}
CFLAGS+= -Wstrict-prototypes -Wmissing-prototypes
CFLAGS+= -Wmissing-declarations
CFLAGS+= -Wshadow -Wpointer-arith
diff --git a/usr.sbin/relayd/snmp.h b/usr.sbin/relayd/snmp.h
new file mode 100644
index 00000000000..dadf1539fd5
--- /dev/null
+++ b/usr.sbin/relayd/snmp.h
@@ -0,0 +1,452 @@
+/* $OpenBSD: snmp.h,v 1.1 2020/06/30 16:59:38 martijn Exp $ */
+
+/*
+ * Copyright (c) 2007, 2008, 2012 Reyk Floeter <reyk@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, 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.
+ */
+
+#ifndef SNMPD_SNMP_H
+#define SNMPD_SNMP_H
+
+#include <sys/types.h>
+#include <endian.h>
+
+/*
+ * SNMP IMSG interface
+ */
+
+#define SNMP_MAX_OID_STRLEN 128 /* max size of the OID _string_ */
+#define SNMP_SOCKET "/var/run/snmpd.sock"
+#define AGENTX_SOCKET "/var/run/agentx.sock"
+#define SNMP_RESTRICTED_SOCKET "/var/run/snmpd.rsock"
+
+enum snmp_type {
+ SNMP_IPADDR = 0,
+ SNMP_COUNTER32 = 1,
+ SNMP_GAUGE32 = 2,
+ SNMP_UNSIGNED32 = 2,
+ SNMP_TIMETICKS = 3,
+ SNMP_OPAQUE = 4,
+ SNMP_NSAPADDR = 5,
+ SNMP_COUNTER64 = 6,
+ SNMP_UINTEGER32 = 7,
+
+ SNMP_INTEGER32 = 100,
+ SNMP_BITSTRING = 101,
+ SNMP_OCTETSTRING = 102,
+ SNMP_NULL = 103,
+ SNMP_OBJECT = 104
+};
+
+enum snmp_imsg_ctl {
+ IMSG_SNMP_DUMMY = 1000, /* something that works everywhere */
+ IMSG_SNMP_ELEMENT,
+ IMSG_SNMP_END,
+ IMSG_SNMP_LOCK, /* enable restricted mode */
+ IMSG_SNMP_AGENTX
+};
+
+struct snmp_imsg_hdr {
+ u_int32_t imsg_type;
+ u_int16_t imsg_len;
+ u_int16_t imsg_flags;
+ u_int32_t imsg_peerid;
+ u_int32_t imsg_pid;
+};
+
+struct snmp_imsg {
+ char snmp_oid[SNMP_MAX_OID_STRLEN];
+ u_int8_t snmp_type;
+ u_int16_t snmp_len;
+};
+
+/*
+ * SNMP BER types
+ */
+
+enum snmp_version {
+ SNMP_V1 = 0,
+ SNMP_V2 = 1, /* SNMPv2c */
+ SNMP_V3 = 3
+};
+
+enum snmp_context {
+ SNMP_C_GETREQ = 0,
+ SNMP_C_GETNEXTREQ = 1,
+ SNMP_C_GETRESP = 2,
+ SNMP_C_SETREQ = 3,
+ SNMP_C_TRAP = 4,
+
+ /* SNMPv2 */
+ SNMP_C_GETBULKREQ = 5,
+ SNMP_C_INFORMREQ = 6,
+ SNMP_C_TRAPV2 = 7,
+ SNMP_C_REPORT = 8
+};
+
+enum snmp_application {
+ SNMP_T_IPADDR = 0,
+ SNMP_T_COUNTER32 = 1,
+ SNMP_T_GAUGE32 = 2,
+ SNMP_T_UNSIGNED32 = 2,
+ SNMP_T_TIMETICKS = 3,
+ SNMP_T_OPAQUE = 4,
+ SNMP_T_NSAPADDR = 5,
+ SNMP_T_COUNTER64 = 6,
+ SNMP_T_UINTEGER32 = 7
+};
+
+enum snmp_generic_trap {
+ SNMP_TRAP_COLDSTART = 0,
+ SNMP_TRAP_WARMSTART = 1,
+ SNMP_TRAP_LINKDOWN = 2,
+ SNMP_TRAP_LINKUP = 3,
+ SNMP_TRAP_AUTHFAILURE = 4,
+ SNMP_TRAP_EGPNEIGHLOSS = 5,
+ SNMP_TRAP_ENTERPRISE = 6
+};
+
+enum snmp_error {
+ SNMP_ERROR_NONE = 0,
+ SNMP_ERROR_TOOBIG = 1,
+ SNMP_ERROR_NOSUCHNAME = 2,
+ SNMP_ERROR_BADVALUE = 3,
+ SNMP_ERROR_READONLY = 4,
+ SNMP_ERROR_GENERR = 5,
+
+ /* SNMPv2 */
+ SNMP_ERROR_NOACCESS = 6,
+ SNMP_ERROR_WRONGTYPE = 7,
+ SNMP_ERROR_WRONGLENGTH = 8,
+ SNMP_ERROR_WRONGENC = 9,
+ SNMP_ERROR_WRONGVALUE = 10,
+ SNMP_ERROR_NOCREATION = 11,
+ SNMP_ERROR_INCONVALUE = 12,
+ SNMP_ERROR_RESUNAVAIL = 13, /* EGAIN */
+ SNMP_ERROR_COMMITFAILED = 14,
+ SNMP_ERROR_UNDOFAILED = 15,
+ SNMP_ERROR_AUTHERROR = 16,
+ SNMP_ERROR_NOTWRITABLE = 17,
+ SNMP_ERROR_INCONNAME = 18
+};
+
+enum snmp_security_model {
+ SNMP_SEC_ANY = 0,
+ SNMP_SEC_SNMPv1 = 1,
+ SNMP_SEC_SNMPv2c = 2,
+ SNMP_SEC_USM = 3,
+ SNMP_SEC_TSM = 4
+};
+
+#define SNMP_MSGFLAG_AUTH 0x01
+#define SNMP_MSGFLAG_PRIV 0x02
+#define SNMP_MSGFLAG_SECMASK (SNMP_MSGFLAG_AUTH | SNMP_MSGFLAG_PRIV)
+#define SNMP_MSGFLAG_REPORT 0x04
+
+#define SNMP_MAX_TIMEWINDOW 150 /* RFC3414 */
+
+#define SNMP_MIN_OID_LEN 2 /* OBJECT */
+#define SNMP_MAX_OID_LEN 32 /* OBJECT */
+
+struct snmp_oid {
+ u_int32_t o_id[SNMP_MAX_OID_LEN + 1];
+ size_t o_n;
+};
+
+/* AgentX protocol, as outlined in RFC 2741 */
+
+/* version */
+#define AGENTX_VERSION 1
+
+/* type */
+#define AGENTX_OPEN 1
+#define AGENTX_CLOSE 2
+#define AGENTX_REGISTER 3
+#define AGENTX_UNREGISTER 4
+#define AGENTX_GET 5
+#define AGENTX_GET_NEXT 6
+#define AGENTX_GET_BULK 7
+#define AGENTX_TEST_SET 8
+#define AGENTX_COMMIT_SET 9
+#define AGENTX_UNDO_SET 10
+#define AGENTX_CLEANUP_SET 11
+#define AGENTX_NOTIFY 12
+#define AGENTX_PING 13
+#define AGENTX_INDEX_ALLOCATE 14
+#define AGENTX_INDEX_DEALLOCATE 15
+#define AGENTX_ADD_AGENT_CAPS 16
+#define AGENTX_REMOVE_AGENT_CAPS 17
+#define AGENTX_RESPONSE 18
+
+/* error return codes */
+#define AGENTX_ERR_NONE 0
+#define AGENTX_ERR_OPEN_FAILED 256
+#define AGENTX_ERR_NOT_OPEN 257
+#define AGENTX_ERR_INDEX_WRONG_TYPE 258
+#define AGENTX_ERR_INDEX_ALREADY_ALLOCATED 259
+#define AGENTX_ERR_INDEX_NONE_AVAILABLE 260
+#define AGENTX_ERR_INDEX_NOT_ALLOCATED 261
+#define AGENTX_ERR_UNSUPPORTED_CONTEXT 262
+#define AGENTX_ERR_DUPLICATE_REGISTRATION 263
+#define AGENTX_ERR_UNKNOWN_REGISTRATION 264
+#define AGENTX_ERR_UNKNOWN_AGENT_CAPS 265
+#define AGENTX_ERR_PARSE_ERROR 266
+#define AGENTX_ERR_REQUEST_DENIED 267
+#define AGENTX_ERR_PROCESSING_ERROR 268
+
+/* flags */
+#define AGENTX_INSTANCE_REGISTRATION 0x01
+#define AGENTX_NEW_INDEX 0x02
+#define AGENTX_ANY_INDEX 0x04
+#define AGENTX_NON_DEFAULT_CONTEXT 0x08
+#define AGENTX_NETWORK_BYTE_ORDER 0x10
+#define AGENTX_FLAGS_MASK 0x1f
+
+/* encoded data types */
+#define AGENTX_INTEGER 2
+#define AGENTX_OCTET_STRING 4
+#define AGENTX_NULL 5
+#define AGENTX_OBJECT_IDENTIFIER 6
+#define AGENTX_IP_ADDRESS 64
+#define AGENTX_COUNTER32 65
+#define AGENTX_GAUGE32 66
+#define AGENTX_TIME_TICKS 67
+#define AGENTX_OPAQUE 68
+#define AGENTX_COUNTER64 70
+#define AGENTX_NO_SUCH_OBJECT 128
+#define AGENTX_NO_SUCH_INSTANCE 129
+#define AGENTX_END_OF_MIB_VIEW 130
+
+/* for registered MIB overlap */
+#define AGENTX_REGISTER_PRIO_DEFAULT 127
+
+/* reasons for request of close */
+#define AGENTX_CLOSE_OTHER 1
+#define AGENTX_CLOSE_PARSE_ERROR 2
+#define AGENTX_CLOSE_PROTOCOL_ERROR 3
+#define AGENTX_CLOSE_TIMEOUTS 4
+#define AGENTX_CLOSE_SHUTDOWN 5
+#define AGENTX_CLOSE_BY_MANAGER 6
+
+#define AGENTX_DEFAULT_TIMEOUT 3
+
+#define MIN_OID_LEN 2 /* OBJECT */
+#define MAX_OID_LEN 32 /* OBJECT */
+
+/*
+ * Protocol header prefixed to all messages
+ */
+struct agentx_hdr {
+ uint8_t version;
+ uint8_t type;
+ uint8_t flags;
+ uint8_t reserved;
+ uint32_t sessionid; /* chosen by agent */
+ uint32_t transactid; /* chosen by subagent */
+ uint32_t packetid; /* per-request id */
+ uint32_t length;
+} __packed;
+
+/*
+ * Prefixed to a series of 4-byte values indicating the OID
+ */
+struct agentx_oid_hdr {
+ uint8_t n_subid; /* # of oid elements (named in RFC) */
+ uint8_t prefix; /* if not 0, OID is 1.3.6.1.<prefix> */
+ uint8_t include; /* is OID included in search range */
+ uint8_t reserved; /* always 0 */
+} __packed;
+
+struct agentx_response_data {
+ uint32_t sysuptime; /* uptime of SNMP context */
+ uint16_t error; /* status of request */
+ uint16_t index; /* index of failed variable binding */
+} __packed;
+
+struct agentx_open_timeout {
+ uint8_t timeout;
+ uint8_t reserved[3];
+} __packed;
+
+struct agentx_register_hdr {
+ uint8_t timeout;
+ uint8_t priority;
+ uint8_t subrange;
+ uint8_t reserved;
+} __packed;
+
+struct agentx_unregister_hdr {
+ uint8_t reserved1;
+ uint8_t priority;
+ uint8_t subrange;
+ uint8_t reserved2;
+} __packed;
+
+struct agentx_null_oid {
+ uint8_t padding[4];
+} __packed;
+
+#define AGENTX_NULL_OID { 0, 0, 0, 0 }
+
+struct agentx_varbind_hdr {
+ uint16_t type;
+ uint16_t reserved;
+} __packed;
+
+struct agentx_response {
+ struct agentx_hdr hdr;
+ struct agentx_response_data data;
+} __packed;
+
+struct agentx_close_request_data {
+ uint8_t reason;
+ uint8_t padding[3];
+} __packed;
+
+struct agentx_close_request {
+ struct agentx_hdr hdr;
+ struct agentx_close_request_data data;
+} __packed;
+
+struct agentx_getbulk_repeaters {
+ uint16_t nonrepeaters;
+ uint16_t maxrepetitions;
+} __packed;
+
+struct agentx_pdu {
+ uint8_t *buffer;
+ uint8_t *ptr;
+ uint8_t *ioptr;
+ size_t buflen;
+ size_t datalen;
+ struct agentx_hdr *hdr;
+
+ char *context;
+ uint32_t contextlen;
+
+ void *cookie;
+ struct agentx_pdu *request; /* request this is a response to */
+ TAILQ_ENTRY(agentx_pdu) entry;
+};
+TAILQ_HEAD(agentx_pdulist, agentx_pdu);
+
+struct agentx_handle {
+ int fd;
+ uint32_t sessionid;
+ uint32_t transactid;
+ uint32_t packetid;
+ int timeout; /* in seconds */
+ int error;
+ int erridx;
+
+ struct agentx_pdulist w;
+ struct agentx_pdulist inflight;
+
+ struct agentx_pdu *r;
+};
+
+struct agentx_search_range {
+ struct snmp_oid start;
+ struct snmp_oid end;
+ int include; /* is start oid included in search range */
+};
+
+struct agentx_handle *
+ snmp_agentx_alloc(int);
+struct agentx_handle *
+ snmp_agentx_open(const char *, char *, struct snmp_oid *);
+struct agentx_handle *
+ snmp_agentx_fdopen(int, char *, struct snmp_oid *);
+int snmp_agentx_response(struct agentx_handle *, struct agentx_pdu *);
+int snmp_agentx_open_response(struct agentx_handle *, struct agentx_pdu *);
+struct agentx_pdu *
+ snmp_agentx_open_pdu(struct agentx_handle *, char *descr,
+ struct snmp_oid *);
+struct agentx_pdu *
+ snmp_agentx_close_pdu(struct agentx_handle *, uint8_t);
+int snmp_agentx_close(struct agentx_handle *, uint8_t);
+void snmp_agentx_free(struct agentx_handle *);
+int snmp_agentx_ping(struct agentx_handle *);
+struct agentx_pdu *
+ snmp_agentx_ping_pdu(void);
+struct agentx_pdu *
+ snmp_agentx_notify_pdu(struct snmp_oid *);
+struct agentx_pdu *
+ snmp_agentx_request(struct agentx_handle *, struct agentx_pdu *);
+int snmp_agentx_varbind(struct agentx_pdu *, struct snmp_oid *, int,
+ void *, int);
+int snmp_agentx_send(struct agentx_handle *, struct agentx_pdu *);
+int snmp_agentx_enqueue(struct agentx_handle *, struct agentx_pdu *);
+int snmp_agentx_flush(struct agentx_handle *);
+struct agentx_pdu *
+ snmp_agentx_recv(struct agentx_handle *);
+struct agentx_pdu *
+ snmp_agentx_response_pdu(int, int, int);
+struct agentx_pdu *
+ snmp_agentx_register_pdu(struct snmp_oid *, int, int, int);
+struct agentx_pdu *
+ snmp_agentx_unregister_pdu(struct snmp_oid *, int, int);
+struct agentx_pdu *
+ snmp_agentx_get_pdu(struct snmp_oid *, int);
+struct agentx_pdu *
+ snmp_agentx_getnext_pdu(struct snmp_oid *, int);
+char *snmp_agentx_read_octetstr(struct agentx_pdu *, int *);
+int snmp_agentx_read_oid(struct agentx_pdu *, struct snmp_oid *);
+int snmp_agentx_read_searchrange(struct agentx_pdu *,
+ struct agentx_search_range *);
+int snmp_agentx_read_raw(struct agentx_pdu *, void *, int);
+int snmp_agentx_copy_raw(struct agentx_pdu *, void *, int);
+char *snmp_agentx_type2name(int);
+int snmp_agentx_read_int(struct agentx_pdu *, uint32_t *);
+int snmp_agentx_read_int64(struct agentx_pdu *, uint64_t *);
+int snmp_agentx_raw(struct agentx_pdu *, void *, int);
+int snmp_agentx_read_vbhdr(struct agentx_pdu *, struct
+ agentx_varbind_hdr *);
+struct agentx_pdu *snmp_agentx_pdu_alloc(void);
+void snmp_agentx_pdu_free(struct agentx_pdu *);
+char *snmp_oid2string(struct snmp_oid *, char *, size_t);
+int snmp_oid_cmp(struct snmp_oid *, struct snmp_oid *);
+void snmp_oid_increment(struct snmp_oid *);
+
+#if BYTE_ORDER == BIG_ENDIAN
+
+static __inline int
+snmp_agentx_byteorder_native(struct agentx_hdr *h)
+{
+ return ((h->flags & AGENTX_NETWORK_BYTE_ORDER) != 0);
+}
+
+#define AGENTX_LOCAL_BYTE_ORDER_FLAG AGENTX_NETWORK_BYTE_ORDER
+#define snmp_agentx_int_byteswap(_i) htole32(_i)
+#define snmp_agentx_int16_byteswap(_i) htole16(_i)
+#define snmp_agentx_int64_byteswap(_i) htole64(_i)
+
+#elif BYTE_ORDER == LITTLE_ENDIAN
+
+static __inline int
+snmp_agentx_byteorder_native(struct agentx_hdr *h)
+{
+ return ((h->flags & AGENTX_NETWORK_BYTE_ORDER) == 0);
+}
+
+#define AGENTX_LOCAL_BYTE_ORDER_FLAG 0
+#define snmp_agentx_int_byteswap(_i) htobe32(_i)
+#define snmp_agentx_int16_byteswap(_i) htobe16(_i)
+#define snmp_agentx_int64_byteswap(_i) htobe64(_i)
+
+#else
+#error "Unknown host byte order"
+#endif
+
+#endif /* SNMPD_SNMP_H */