xref: /openbsd/lib/libagentx/ax.h (revision 6f5d9364)
1*6f5d9364Smartijn /*	$OpenBSD: ax.h,v 1.5 2023/10/24 08:54:52 martijn Exp $ */
281180db9Smartijn /*
381180db9Smartijn  * Copyright (c) 2019 Martijn van Duren <martijn@openbsd.org>
481180db9Smartijn  *
581180db9Smartijn  * Permission to use, copy, modify, and distribute this software for any
681180db9Smartijn  * purpose with or without fee is hereby granted, provided that the above
781180db9Smartijn  * copyright notice and this permission notice appear in all copies.
881180db9Smartijn  *
981180db9Smartijn  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1081180db9Smartijn  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1181180db9Smartijn  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1281180db9Smartijn  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1381180db9Smartijn  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1481180db9Smartijn  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1581180db9Smartijn  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1681180db9Smartijn  */
1781180db9Smartijn 
1881180db9Smartijn #include <stdint.h>
1981180db9Smartijn 
2081180db9Smartijn #define AX_PDU_FLAG_INSTANCE_REGISTRATION (1 << 0)
2181180db9Smartijn #define AX_PDU_FLAG_NEW_INDEX (1 << 1)
2281180db9Smartijn #define AX_PDU_FLAG_ANY_INDEX (1 << 2)
2381180db9Smartijn #define AX_PDU_FLAG_NON_DEFAULT_CONTEXT (1 << 3)
2481180db9Smartijn #define AX_PDU_FLAG_NETWORK_BYTE_ORDER (1 << 4)
2581180db9Smartijn 
2681180db9Smartijn #define AX_PRIORITY_DEFAULT 127
2781180db9Smartijn 
2881180db9Smartijn enum ax_byte_order {
2981180db9Smartijn 	AX_BYTE_ORDER_BE,
3081180db9Smartijn 	AX_BYTE_ORDER_LE
3181180db9Smartijn };
3281180db9Smartijn 
3381180db9Smartijn #if BYTE_ORDER == BIG_ENDIAN
3481180db9Smartijn #define AX_BYTE_ORDER_NATIVE AX_BYTE_ORDER_BE
3581180db9Smartijn #else
3681180db9Smartijn #define AX_BYTE_ORDER_NATIVE AX_BYTE_ORDER_LE
3781180db9Smartijn #endif
3881180db9Smartijn 
3981180db9Smartijn enum ax_pdu_type {
4081180db9Smartijn 	AX_PDU_TYPE_OPEN		= 1,
4181180db9Smartijn 	AX_PDU_TYPE_CLOSE		= 2,
4281180db9Smartijn 	AX_PDU_TYPE_REGISTER		= 3,
4381180db9Smartijn 	AX_PDU_TYPE_UNREGISTER		= 4,
4481180db9Smartijn 	AX_PDU_TYPE_GET			= 5,
4581180db9Smartijn 	AX_PDU_TYPE_GETNEXT		= 6,
4681180db9Smartijn 	AX_PDU_TYPE_GETBULK		= 7,
4781180db9Smartijn 	AX_PDU_TYPE_TESTSET		= 8,
4881180db9Smartijn 	AX_PDU_TYPE_COMMITSET		= 9,
4981180db9Smartijn 	AX_PDU_TYPE_UNDOSET		= 10,
5081180db9Smartijn 	AX_PDU_TYPE_CLEANUPSET		= 11,
5181180db9Smartijn 	AX_PDU_TYPE_NOTIFY		= 12,
5281180db9Smartijn 	AX_PDU_TYPE_PING		= 13,
5381180db9Smartijn 	AX_PDU_TYPE_INDEXALLOCATE	= 14,
5481180db9Smartijn 	AX_PDU_TYPE_INDEXDEALLOCATE	= 15,
5581180db9Smartijn 	AX_PDU_TYPE_ADDAGENTCAPS	= 16,
5681180db9Smartijn 	AX_PDU_TYPE_REMOVEAGENTCAPS	= 17,
5781180db9Smartijn 	AX_PDU_TYPE_RESPONSE		= 18
5881180db9Smartijn };
5981180db9Smartijn 
6081180db9Smartijn enum ax_pdu_error {
6181180db9Smartijn 	AX_PDU_ERROR_NOERROR			= 0,
6281180db9Smartijn 	AX_PDU_ERROR_GENERR			= 5,
6381180db9Smartijn 	AX_PDU_ERROR_NOACCESS			= 6,
6481180db9Smartijn 	AX_PDU_ERROR_WRONGTYPE			= 7,
6581180db9Smartijn 	AX_PDU_ERROR_WRONGLENGTH		= 8,
6681180db9Smartijn 	AX_PDU_ERROR_WRONGENCODING		= 9,
6781180db9Smartijn 	AX_PDU_ERROR_WRONGVALUE			= 10,
6881180db9Smartijn 	AX_PDU_ERROR_NOCREATION			= 11,
6981180db9Smartijn 	AX_PDU_ERROR_INCONSISTENTVALUE		= 12,
7081180db9Smartijn 	AX_PDU_ERROR_RESOURCEUNAVAILABLE	= 13,
7181180db9Smartijn 	AX_PDU_ERROR_COMMITFAILED		= 14,
7281180db9Smartijn 	AX_PDU_ERROR_UNDOFAILED			= 15,
7381180db9Smartijn 	AX_PDU_ERROR_NOTWRITABLE		= 17,
7481180db9Smartijn 	AX_PDU_ERROR_INCONSISTENTNAME		= 18,
7581180db9Smartijn 	AX_PDU_ERROR_OPENFAILED			= 256,
7681180db9Smartijn 	AX_PDU_ERROR_NOTOPEN			= 257,
7781180db9Smartijn 	AX_PDU_ERROR_INDEXWRONGTYPE		= 258,
7881180db9Smartijn 	AX_PDU_ERROR_INDEXALREADYALLOCATED	= 259,
7981180db9Smartijn 	AX_PDU_ERROR_INDEXNONEAVAILABLE		= 260,
8081180db9Smartijn 	AX_PDU_ERROR_INDEXNOTALLOCATED		= 261,
8181180db9Smartijn 	AX_PDU_ERROR_UNSUPPORTEDCONETXT		= 262,
8281180db9Smartijn 	AX_PDU_ERROR_DUPLICATEREGISTRATION	= 263,
8381180db9Smartijn 	AX_PDU_ERROR_UNKNOWNREGISTRATION	= 264,
8481180db9Smartijn 	AX_PDU_ERROR_UNKNOWNAGENTCAPS		= 265,
8581180db9Smartijn 	AX_PDU_ERROR_PARSEERROR			= 266,
8681180db9Smartijn 	AX_PDU_ERROR_REQUESTDENIED		= 267,
8781180db9Smartijn 	AX_PDU_ERROR_PROCESSINGERROR		= 268
8881180db9Smartijn };
8981180db9Smartijn 
9081180db9Smartijn enum ax_data_type {
9181180db9Smartijn 	AX_DATA_TYPE_INTEGER		= 2,
9281180db9Smartijn 	AX_DATA_TYPE_OCTETSTRING	= 4,
9381180db9Smartijn 	AX_DATA_TYPE_NULL		= 5,
9481180db9Smartijn 	AX_DATA_TYPE_OID		= 6,
9581180db9Smartijn 	AX_DATA_TYPE_IPADDRESS		= 64,
9681180db9Smartijn 	AX_DATA_TYPE_COUNTER32		= 65,
9781180db9Smartijn 	AX_DATA_TYPE_GAUGE32		= 66,
9881180db9Smartijn 	AX_DATA_TYPE_TIMETICKS		= 67,
9981180db9Smartijn 	AX_DATA_TYPE_OPAQUE		= 68,
10081180db9Smartijn 	AX_DATA_TYPE_COUNTER64		= 70,
10181180db9Smartijn 	AX_DATA_TYPE_NOSUCHOBJECT	= 128,
10281180db9Smartijn 	AX_DATA_TYPE_NOSUCHINSTANCE	= 129,
10381180db9Smartijn 	AX_DATA_TYPE_ENDOFMIBVIEW	= 130
10481180db9Smartijn };
10581180db9Smartijn 
10681180db9Smartijn enum ax_close_reason {
10781180db9Smartijn 	AX_CLOSE_OTHER			= 1,
10881180db9Smartijn 	AX_CLOSEN_PARSEERROR		= 2,
10981180db9Smartijn 	AX_CLOSE_PROTOCOLERROR		= 3,
11081180db9Smartijn 	AX_CLOSE_TIMEOUTS		= 4,
11181180db9Smartijn 	AX_CLOSE_SHUTDOWN		= 5,
11281180db9Smartijn 	AX_CLOSE_BYMANAGER		= 6
11381180db9Smartijn };
11481180db9Smartijn 
11581180db9Smartijn struct ax {
11681180db9Smartijn 	int ax_fd;
11781180db9Smartijn 	enum ax_byte_order ax_byteorder;
11881180db9Smartijn 	uint8_t *ax_rbuf;
11981180db9Smartijn 	size_t ax_rblen;
12081180db9Smartijn 	size_t ax_rbsize;
12181180db9Smartijn 	uint8_t *ax_wbuf;
12281180db9Smartijn 	size_t ax_wblen;
12381180db9Smartijn 	size_t ax_wbtlen;
12481180db9Smartijn 	size_t ax_wbsize;
12581180db9Smartijn 	uint32_t *ax_packetids;
12681180db9Smartijn 	size_t ax_packetidsize;
12781180db9Smartijn };
12881180db9Smartijn 
12981180db9Smartijn #ifndef AX_PRIMITIVE
13081180db9Smartijn #define AX_PRIMITIVE
13181180db9Smartijn 
13281180db9Smartijn #define AX_OID_MAX_LEN 128
13381180db9Smartijn 
13481180db9Smartijn struct ax_oid {
13581180db9Smartijn 	uint8_t aoi_include;
13681180db9Smartijn 	uint32_t aoi_id[AX_OID_MAX_LEN];
13781180db9Smartijn 	size_t aoi_idlen;
13881180db9Smartijn };
13981180db9Smartijn 
14081180db9Smartijn struct ax_ostring {
14181180db9Smartijn 	unsigned char *aos_string;
14281180db9Smartijn 	uint32_t aos_slen;
14381180db9Smartijn };
14481180db9Smartijn #endif
14581180db9Smartijn 
14681180db9Smartijn struct ax_searchrange {
14781180db9Smartijn 	struct ax_oid asr_start;
14881180db9Smartijn 	struct ax_oid asr_stop;
14981180db9Smartijn };
15081180db9Smartijn 
15181180db9Smartijn struct ax_pdu_header {
15281180db9Smartijn 	uint8_t	aph_version;
15381180db9Smartijn 	uint8_t	aph_type;
15481180db9Smartijn 	uint8_t	aph_flags;
15581180db9Smartijn 	uint8_t	aph_reserved;
15681180db9Smartijn 	uint32_t aph_sessionid;
15781180db9Smartijn 	uint32_t aph_transactionid;
15881180db9Smartijn 	uint32_t aph_packetid;
15981180db9Smartijn 	uint32_t aph_plength;
16081180db9Smartijn };
16181180db9Smartijn 
16281180db9Smartijn struct ax_varbind {
16381180db9Smartijn 	enum ax_data_type avb_type;
16481180db9Smartijn 	struct ax_oid avb_oid;
16581180db9Smartijn 	union ax_data {
1661b6ededeSmartijn 		int32_t avb_int32;
16781180db9Smartijn 		uint32_t avb_uint32;
16881180db9Smartijn 		uint64_t avb_uint64;
16981180db9Smartijn 		struct ax_ostring avb_ostring;
17081180db9Smartijn 		struct ax_oid avb_oid;
17181180db9Smartijn 	} avb_data;
17281180db9Smartijn };
17381180db9Smartijn 
17481180db9Smartijn struct ax_pdu {
17581180db9Smartijn 	struct ax_pdu_header ap_header;
17681180db9Smartijn 	struct ax_ostring ap_context;
17781180db9Smartijn 	union {
17881180db9Smartijn 		struct ax_pdu_searchrangelist {
17981180db9Smartijn 			size_t ap_nsr;
18081180db9Smartijn 			struct ax_searchrange *ap_sr;
18181180db9Smartijn 		} ap_srl;
18281180db9Smartijn 		struct ax_pdu_getbulk {
18381180db9Smartijn 			uint16_t ap_nonrep;
18481180db9Smartijn 			uint16_t ap_maxrep;
18581180db9Smartijn 			struct ax_pdu_searchrangelist ap_srl;
18681180db9Smartijn 		} ap_getbulk;
18781180db9Smartijn 		struct ax_pdu_varbindlist {
18881180db9Smartijn 			struct ax_varbind *ap_varbind;
18981180db9Smartijn 			size_t ap_nvarbind;
19081180db9Smartijn 		} ap_vbl;
19181180db9Smartijn 		struct ax_pdu_response {
19281180db9Smartijn 			uint32_t ap_uptime;
19381180db9Smartijn 			enum ax_pdu_error ap_error;
19481180db9Smartijn 			uint16_t ap_index;
19581180db9Smartijn 			struct ax_varbind *ap_varbindlist;
19681180db9Smartijn 			size_t ap_nvarbind;
19781180db9Smartijn 		} ap_response;
19881180db9Smartijn 		void *ap_raw;
19981180db9Smartijn 	} ap_payload;
20081180db9Smartijn };
20181180db9Smartijn 
20281180db9Smartijn struct ax *ax_new(int);
20381180db9Smartijn void ax_free(struct ax *);
20481180db9Smartijn struct ax_pdu *ax_recv(struct ax *);
20581180db9Smartijn ssize_t ax_send(struct ax *);
20681180db9Smartijn uint32_t ax_open(struct ax *, uint8_t, struct ax_oid *,
20781180db9Smartijn     struct ax_ostring *);
20881180db9Smartijn uint32_t ax_close(struct ax *, uint32_t, enum ax_close_reason);
20981180db9Smartijn uint32_t ax_indexallocate(struct ax *, uint8_t, uint32_t,
21081180db9Smartijn     struct ax_ostring *, struct ax_varbind *, size_t);
21181180db9Smartijn uint32_t ax_indexdeallocate(struct ax *, uint32_t,
21281180db9Smartijn     struct ax_ostring *, struct ax_varbind *, size_t);
21381180db9Smartijn uint32_t ax_addagentcaps(struct ax *, uint32_t, struct ax_ostring *,
21481180db9Smartijn     struct ax_oid *, struct ax_ostring *);
21581180db9Smartijn uint32_t ax_removeagentcaps(struct ax *, uint32_t,
21681180db9Smartijn     struct ax_ostring *, struct ax_oid *);
21781180db9Smartijn uint32_t ax_register(struct ax *, uint8_t, uint32_t,
21881180db9Smartijn     struct ax_ostring *, uint8_t, uint8_t, uint8_t, struct ax_oid *,
21981180db9Smartijn     uint32_t);
22081180db9Smartijn uint32_t ax_unregister(struct ax *, uint32_t, struct ax_ostring *,
22181180db9Smartijn     uint8_t, uint8_t, struct ax_oid *, uint32_t);
22281180db9Smartijn int ax_response(struct ax *, uint32_t, uint32_t, uint32_t,
223*6f5d9364Smartijn     uint32_t, uint16_t, uint16_t, struct ax_varbind *, size_t);
22481180db9Smartijn void ax_pdu_free(struct ax_pdu *);
22581180db9Smartijn void ax_varbind_free(struct ax_varbind *);
22681180db9Smartijn const char *ax_error2string(enum ax_pdu_error);
22781180db9Smartijn const char *ax_pdutype2string(enum ax_pdu_type);
22881180db9Smartijn const char *ax_oid2string(struct ax_oid *);
22981180db9Smartijn const char *ax_oidrange2string(struct ax_oid *, uint8_t, uint32_t);
23081180db9Smartijn const char *ax_varbind2string(struct ax_varbind *);
23181180db9Smartijn const char *ax_closereason2string(enum ax_close_reason);
23281180db9Smartijn int ax_oid_cmp(struct ax_oid *, struct ax_oid *);
23381180db9Smartijn int ax_oid_add(struct ax_oid *, uint32_t);
234