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