1f06ca4afSHartmut Brandt /* 2f06ca4afSHartmut Brandt * Copyright (c) 2001-2003 3f06ca4afSHartmut Brandt * Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4f06ca4afSHartmut Brandt * All rights reserved. 5f06ca4afSHartmut Brandt * 6f06ca4afSHartmut Brandt * Author: Harti Brandt <harti@freebsd.org> 7f06ca4afSHartmut Brandt * 8135f7de5SShteryana Shopova * Copyright (c) 2010 The FreeBSD Foundation 9135f7de5SShteryana Shopova * All rights reserved. 10135f7de5SShteryana Shopova * 11135f7de5SShteryana Shopova * Portions of this software were developed by Shteryana Sotirova Shopova 12135f7de5SShteryana Shopova * under sponsorship from the FreeBSD Foundation. 13135f7de5SShteryana Shopova * 14135f7de5SShteryana Shopova * 15896052c1SHartmut Brandt * Redistribution and use in source and binary forms, with or without 16896052c1SHartmut Brandt * modification, are permitted provided that the following conditions 17896052c1SHartmut Brandt * are met: 18896052c1SHartmut Brandt * 1. Redistributions of source code must retain the above copyright 19896052c1SHartmut Brandt * notice, this list of conditions and the following disclaimer. 20f06ca4afSHartmut Brandt * 2. Redistributions in binary form must reproduce the above copyright 21f06ca4afSHartmut Brandt * notice, this list of conditions and the following disclaimer in the 22f06ca4afSHartmut Brandt * documentation and/or other materials provided with the distribution. 23f06ca4afSHartmut Brandt * 24896052c1SHartmut Brandt * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 25896052c1SHartmut Brandt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26896052c1SHartmut Brandt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27896052c1SHartmut Brandt * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 28896052c1SHartmut Brandt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29896052c1SHartmut Brandt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30896052c1SHartmut Brandt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31896052c1SHartmut Brandt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32896052c1SHartmut Brandt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33896052c1SHartmut Brandt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34896052c1SHartmut Brandt * SUCH DAMAGE. 35f06ca4afSHartmut Brandt * 36896052c1SHartmut Brandt * $Begemot: bsnmp/lib/snmp.h,v 1.30 2004/08/06 08:46:54 brandt Exp $ 37f06ca4afSHartmut Brandt * 38f06ca4afSHartmut Brandt * Header file for SNMP functions. 39f06ca4afSHartmut Brandt */ 40f06ca4afSHartmut Brandt #ifndef snmp_h_ 41f06ca4afSHartmut Brandt #define snmp_h_ 42f06ca4afSHartmut Brandt 43f06ca4afSHartmut Brandt #include <sys/types.h> 44f06ca4afSHartmut Brandt 45*8e9b3e70SHartmut Brandt #define BSNMP_MAJOR 1 46*8e9b3e70SHartmut Brandt #define BSNMP_MINOR 13 47*8e9b3e70SHartmut Brandt 48f06ca4afSHartmut Brandt #define SNMP_COMMUNITY_MAXLEN 128 49f06ca4afSHartmut Brandt #define SNMP_MAX_BINDINGS 100 50135f7de5SShteryana Shopova #define SNMP_CONTEXT_NAME_SIZ (32 + 1) 51135f7de5SShteryana Shopova #define SNMP_ENGINE_ID_SIZ 32 52135f7de5SShteryana Shopova #define SNMP_TIME_WINDOW 150 53f06ca4afSHartmut Brandt 54f06ca4afSHartmut Brandt enum snmp_syntax { 55f06ca4afSHartmut Brandt SNMP_SYNTAX_NULL = 0, 56f06ca4afSHartmut Brandt SNMP_SYNTAX_INTEGER, /* == INTEGER32 */ 57f06ca4afSHartmut Brandt SNMP_SYNTAX_OCTETSTRING, 58f06ca4afSHartmut Brandt SNMP_SYNTAX_OID, 59f06ca4afSHartmut Brandt SNMP_SYNTAX_IPADDRESS, 60f06ca4afSHartmut Brandt SNMP_SYNTAX_COUNTER, 61f06ca4afSHartmut Brandt SNMP_SYNTAX_GAUGE, /* == UNSIGNED32 */ 62f06ca4afSHartmut Brandt SNMP_SYNTAX_TIMETICKS, 63f06ca4afSHartmut Brandt 64f06ca4afSHartmut Brandt /* v2 additions */ 65f06ca4afSHartmut Brandt SNMP_SYNTAX_COUNTER64, 66f06ca4afSHartmut Brandt SNMP_SYNTAX_NOSUCHOBJECT, /* exception */ 67f06ca4afSHartmut Brandt SNMP_SYNTAX_NOSUCHINSTANCE, /* exception */ 68f06ca4afSHartmut Brandt SNMP_SYNTAX_ENDOFMIBVIEW, /* exception */ 69f06ca4afSHartmut Brandt }; 70f06ca4afSHartmut Brandt 71f06ca4afSHartmut Brandt struct snmp_value { 72f06ca4afSHartmut Brandt struct asn_oid var; 73f06ca4afSHartmut Brandt enum snmp_syntax syntax; 74f06ca4afSHartmut Brandt union snmp_values { 75f06ca4afSHartmut Brandt int32_t integer; /* also integer32 */ 76f06ca4afSHartmut Brandt struct { 77f06ca4afSHartmut Brandt u_int len; 78f06ca4afSHartmut Brandt u_char *octets; 79f06ca4afSHartmut Brandt } octetstring; 80f06ca4afSHartmut Brandt struct asn_oid oid; 81f06ca4afSHartmut Brandt u_char ipaddress[4]; 82896052c1SHartmut Brandt uint32_t uint32; /* also gauge32, counter32, 83f06ca4afSHartmut Brandt unsigned32, timeticks */ 84896052c1SHartmut Brandt uint64_t counter64; 85f06ca4afSHartmut Brandt } v; 86f06ca4afSHartmut Brandt }; 87f06ca4afSHartmut Brandt 88f06ca4afSHartmut Brandt enum snmp_version { 89f06ca4afSHartmut Brandt SNMP_Verr = 0, 90f06ca4afSHartmut Brandt SNMP_V1 = 1, 91135f7de5SShteryana Shopova SNMP_V2c = 2, 92135f7de5SShteryana Shopova SNMP_V3, 93135f7de5SShteryana Shopova }; 94135f7de5SShteryana Shopova 9572cd7a52SShteryana Shopova #define SNMP_MPM_SNMP_V1 0 9672cd7a52SShteryana Shopova #define SNMP_MPM_SNMP_V2c 1 9772cd7a52SShteryana Shopova #define SNMP_MPM_SNMP_V3 3 9872cd7a52SShteryana Shopova 99135f7de5SShteryana Shopova #define SNMP_ADM_STR32_SIZ (32 + 1) 100135f7de5SShteryana Shopova #define SNMP_AUTH_KEY_SIZ 40 101135f7de5SShteryana Shopova #define SNMP_PRIV_KEY_SIZ 32 102135f7de5SShteryana Shopova #define SNMP_USM_AUTH_SIZE 12 103135f7de5SShteryana Shopova #define SNMP_USM_PRIV_SIZE 8 104135f7de5SShteryana Shopova #define SNMP_AUTH_HMACMD5_KEY_SIZ 16 105135f7de5SShteryana Shopova #define SNMP_AUTH_HMACSHA_KEY_SIZ 20 106135f7de5SShteryana Shopova #define SNMP_PRIV_AES_KEY_SIZ 16 107135f7de5SShteryana Shopova #define SNMP_PRIV_DES_KEY_SIZ 8 108135f7de5SShteryana Shopova 109135f7de5SShteryana Shopova 110135f7de5SShteryana Shopova enum snmp_secmodel { 111135f7de5SShteryana Shopova SNMP_SECMODEL_ANY = 0, 112135f7de5SShteryana Shopova SNMP_SECMODEL_SNMPv1 = 1, 113135f7de5SShteryana Shopova SNMP_SECMODEL_SNMPv2c = 2, 114135f7de5SShteryana Shopova SNMP_SECMODEL_USM = 3, 115135f7de5SShteryana Shopova SNMP_SECMODEL_UNKNOWN 116135f7de5SShteryana Shopova }; 117135f7de5SShteryana Shopova 118135f7de5SShteryana Shopova enum snmp_usm_level { 119135f7de5SShteryana Shopova SNMP_noAuthNoPriv = 1, 120135f7de5SShteryana Shopova SNMP_authNoPriv = 2, 121135f7de5SShteryana Shopova SNMP_authPriv = 3 122135f7de5SShteryana Shopova }; 123135f7de5SShteryana Shopova 124135f7de5SShteryana Shopova enum snmp_authentication { 125135f7de5SShteryana Shopova SNMP_AUTH_NOAUTH = 0, 126135f7de5SShteryana Shopova SNMP_AUTH_HMAC_MD5, 127135f7de5SShteryana Shopova SNMP_AUTH_HMAC_SHA 128135f7de5SShteryana Shopova }; 129135f7de5SShteryana Shopova 130135f7de5SShteryana Shopova enum snmp_privacy { 131135f7de5SShteryana Shopova SNMP_PRIV_NOPRIV = 0, 132135f7de5SShteryana Shopova SNMP_PRIV_DES = 1, 133135f7de5SShteryana Shopova SNMP_PRIV_AES 134135f7de5SShteryana Shopova }; 135135f7de5SShteryana Shopova 136135f7de5SShteryana Shopova struct snmp_engine { 137135f7de5SShteryana Shopova uint8_t engine_id[SNMP_ENGINE_ID_SIZ]; 138135f7de5SShteryana Shopova uint32_t engine_len; 139135f7de5SShteryana Shopova int32_t engine_boots; 140135f7de5SShteryana Shopova int32_t engine_time; 141135f7de5SShteryana Shopova int32_t max_msg_size; 142135f7de5SShteryana Shopova }; 143135f7de5SShteryana Shopova 144135f7de5SShteryana Shopova struct snmp_user { 145135f7de5SShteryana Shopova char sec_name[SNMP_ADM_STR32_SIZ]; 146135f7de5SShteryana Shopova enum snmp_authentication auth_proto; 147135f7de5SShteryana Shopova enum snmp_privacy priv_proto; 148135f7de5SShteryana Shopova uint8_t auth_key[SNMP_AUTH_KEY_SIZ]; 149135f7de5SShteryana Shopova uint8_t priv_key[SNMP_PRIV_KEY_SIZ]; 150f06ca4afSHartmut Brandt }; 151f06ca4afSHartmut Brandt 152f06ca4afSHartmut Brandt struct snmp_pdu { 153f06ca4afSHartmut Brandt char community[SNMP_COMMUNITY_MAXLEN + 1]; 154f06ca4afSHartmut Brandt enum snmp_version version; 155f06ca4afSHartmut Brandt u_int type; 156f06ca4afSHartmut Brandt 157135f7de5SShteryana Shopova /* SNMPv3 PDU header fields */ 158135f7de5SShteryana Shopova int32_t identifier; 159135f7de5SShteryana Shopova uint8_t flags; 160135f7de5SShteryana Shopova int32_t security_model; 161135f7de5SShteryana Shopova struct snmp_engine engine; 162135f7de5SShteryana Shopova 163135f7de5SShteryana Shopova /* Associated USM user parameters */ 164135f7de5SShteryana Shopova struct snmp_user user; 165135f7de5SShteryana Shopova uint8_t msg_digest[SNMP_USM_AUTH_SIZE]; 166135f7de5SShteryana Shopova uint8_t msg_salt[SNMP_USM_PRIV_SIZE]; 167135f7de5SShteryana Shopova 168135f7de5SShteryana Shopova /* View-based Access Model */ 169135f7de5SShteryana Shopova /* XXX: put in separate structure - conflicts with struct snmp_context */ 170135f7de5SShteryana Shopova uint32_t context_engine_len; 171135f7de5SShteryana Shopova uint8_t context_engine[SNMP_ENGINE_ID_SIZ]; 172135f7de5SShteryana Shopova char context_name[SNMP_CONTEXT_NAME_SIZ]; 173135f7de5SShteryana Shopova 174f06ca4afSHartmut Brandt /* trap only */ 175f06ca4afSHartmut Brandt struct asn_oid enterprise; 176f06ca4afSHartmut Brandt u_char agent_addr[4]; 177f06ca4afSHartmut Brandt int32_t generic_trap; 178f06ca4afSHartmut Brandt int32_t specific_trap; 179896052c1SHartmut Brandt uint32_t time_stamp; 180f06ca4afSHartmut Brandt 181f06ca4afSHartmut Brandt /* others */ 182f06ca4afSHartmut Brandt int32_t request_id; 183f06ca4afSHartmut Brandt int32_t error_status; 184f06ca4afSHartmut Brandt int32_t error_index; 185f06ca4afSHartmut Brandt 186f06ca4afSHartmut Brandt /* fixes for encoding */ 187135f7de5SShteryana Shopova size_t outer_len; 18806983448SShteryana Shopova asn_len_t scoped_len; 189f06ca4afSHartmut Brandt u_char *outer_ptr; 190135f7de5SShteryana Shopova u_char *digest_ptr; 191135f7de5SShteryana Shopova u_char *encrypted_ptr; 192135f7de5SShteryana Shopova u_char *scoped_ptr; 193f06ca4afSHartmut Brandt u_char *pdu_ptr; 194f06ca4afSHartmut Brandt u_char *vars_ptr; 195f06ca4afSHartmut Brandt 196135f7de5SShteryana Shopova 197f06ca4afSHartmut Brandt struct snmp_value bindings[SNMP_MAX_BINDINGS]; 198f06ca4afSHartmut Brandt u_int nbindings; 199f06ca4afSHartmut Brandt }; 200f06ca4afSHartmut Brandt #define snmp_v1_pdu snmp_pdu 201f06ca4afSHartmut Brandt 202f06ca4afSHartmut Brandt #define SNMP_PDU_GET 0 203f06ca4afSHartmut Brandt #define SNMP_PDU_GETNEXT 1 204f06ca4afSHartmut Brandt #define SNMP_PDU_RESPONSE 2 205f06ca4afSHartmut Brandt #define SNMP_PDU_SET 3 206f06ca4afSHartmut Brandt #define SNMP_PDU_TRAP 4 /* v1 */ 207f06ca4afSHartmut Brandt #define SNMP_PDU_GETBULK 5 /* v2 */ 208f06ca4afSHartmut Brandt #define SNMP_PDU_INFORM 6 /* v2 */ 209f06ca4afSHartmut Brandt #define SNMP_PDU_TRAP2 7 /* v2 */ 210f06ca4afSHartmut Brandt #define SNMP_PDU_REPORT 8 /* v2 */ 211f06ca4afSHartmut Brandt 212f06ca4afSHartmut Brandt #define SNMP_ERR_NOERROR 0 213f06ca4afSHartmut Brandt #define SNMP_ERR_TOOBIG 1 214f06ca4afSHartmut Brandt #define SNMP_ERR_NOSUCHNAME 2 /* v1 */ 215f06ca4afSHartmut Brandt #define SNMP_ERR_BADVALUE 3 /* v1 */ 216f06ca4afSHartmut Brandt #define SNMP_ERR_READONLY 4 /* v1 */ 217f06ca4afSHartmut Brandt #define SNMP_ERR_GENERR 5 218f06ca4afSHartmut Brandt #define SNMP_ERR_NO_ACCESS 6 /* v2 */ 219f06ca4afSHartmut Brandt #define SNMP_ERR_WRONG_TYPE 7 /* v2 */ 220f06ca4afSHartmut Brandt #define SNMP_ERR_WRONG_LENGTH 8 /* v2 */ 221f06ca4afSHartmut Brandt #define SNMP_ERR_WRONG_ENCODING 9 /* v2 */ 222f06ca4afSHartmut Brandt #define SNMP_ERR_WRONG_VALUE 10 /* v2 */ 223f06ca4afSHartmut Brandt #define SNMP_ERR_NO_CREATION 11 /* v2 */ 224f06ca4afSHartmut Brandt #define SNMP_ERR_INCONS_VALUE 12 /* v2 */ 225f06ca4afSHartmut Brandt #define SNMP_ERR_RES_UNAVAIL 13 /* v2 */ 226f06ca4afSHartmut Brandt #define SNMP_ERR_COMMIT_FAILED 14 /* v2 */ 227f06ca4afSHartmut Brandt #define SNMP_ERR_UNDO_FAILED 15 /* v2 */ 228f06ca4afSHartmut Brandt #define SNMP_ERR_AUTH_ERR 16 /* v2 */ 229f06ca4afSHartmut Brandt #define SNMP_ERR_NOT_WRITEABLE 17 /* v2 */ 230f06ca4afSHartmut Brandt #define SNMP_ERR_INCONS_NAME 18 /* v2 */ 231f06ca4afSHartmut Brandt 232f06ca4afSHartmut Brandt #define SNMP_TRAP_COLDSTART 0 233f06ca4afSHartmut Brandt #define SNMP_TRAP_WARMSTART 1 234f06ca4afSHartmut Brandt #define SNMP_TRAP_LINKDOWN 2 235f06ca4afSHartmut Brandt #define SNMP_TRAP_LINKUP 3 236f06ca4afSHartmut Brandt #define SNMP_TRAP_AUTHENTICATION_FAILURE 4 237f06ca4afSHartmut Brandt #define SNMP_TRAP_EGP_NEIGHBOR_LOSS 5 238f06ca4afSHartmut Brandt #define SNMP_TRAP_ENTERPRISE 6 239f06ca4afSHartmut Brandt 240f06ca4afSHartmut Brandt enum snmp_code { 241f06ca4afSHartmut Brandt SNMP_CODE_OK = 0, 242f06ca4afSHartmut Brandt SNMP_CODE_FAILED, 243f06ca4afSHartmut Brandt SNMP_CODE_BADVERS, 244f06ca4afSHartmut Brandt SNMP_CODE_BADLEN, 245f06ca4afSHartmut Brandt SNMP_CODE_BADENC, 246f06ca4afSHartmut Brandt SNMP_CODE_OORANGE, 247135f7de5SShteryana Shopova SNMP_CODE_BADSECLEVEL, 248135f7de5SShteryana Shopova SNMP_CODE_NOTINTIME, 249135f7de5SShteryana Shopova SNMP_CODE_BADUSER, 250135f7de5SShteryana Shopova SNMP_CODE_BADENGINE, 251135f7de5SShteryana Shopova SNMP_CODE_BADDIGEST, 252135f7de5SShteryana Shopova SNMP_CODE_EDECRYPT 253f06ca4afSHartmut Brandt }; 254f06ca4afSHartmut Brandt 255135f7de5SShteryana Shopova #define SNMP_MSG_AUTH_FLAG 0x1 256135f7de5SShteryana Shopova #define SNMP_MSG_PRIV_FLAG 0x2 257135f7de5SShteryana Shopova #define SNMP_MSG_REPORT_FLAG 0x4 258135f7de5SShteryana Shopova #define SNMP_MSG_AUTODISCOVER 0x80 259135f7de5SShteryana Shopova 260f06ca4afSHartmut Brandt void snmp_value_free(struct snmp_value *); 261f06ca4afSHartmut Brandt int snmp_value_parse(const char *, enum snmp_syntax, union snmp_values *); 262f06ca4afSHartmut Brandt int snmp_value_copy(struct snmp_value *, const struct snmp_value *); 263f06ca4afSHartmut Brandt 264f06ca4afSHartmut Brandt void snmp_pdu_free(struct snmp_pdu *); 26572cd7a52SShteryana Shopova void snmp_pdu_init_secparams(struct snmp_pdu *); 266f06ca4afSHartmut Brandt enum snmp_code snmp_pdu_decode(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *); 267135f7de5SShteryana Shopova enum snmp_code snmp_pdu_decode_header(struct asn_buf *, struct snmp_pdu *); 268135f7de5SShteryana Shopova enum snmp_code snmp_pdu_decode_scoped(struct asn_buf *, struct snmp_pdu *, int32_t *); 269135f7de5SShteryana Shopova enum snmp_code snmp_pdu_encode(struct snmp_pdu *, struct asn_buf *); 270135f7de5SShteryana Shopova enum snmp_code snmp_pdu_decode_secmode(struct asn_buf *, struct snmp_pdu *); 271f06ca4afSHartmut Brandt 27270af00a1SHartmut Brandt int snmp_pdu_snoop(const struct asn_buf *); 27370af00a1SHartmut Brandt 274f06ca4afSHartmut Brandt void snmp_pdu_dump(const struct snmp_pdu *pdu); 275f06ca4afSHartmut Brandt 276135f7de5SShteryana Shopova enum snmp_code snmp_passwd_to_keys(struct snmp_user *, char *); 277135f7de5SShteryana Shopova enum snmp_code snmp_get_local_keys(struct snmp_user *, uint8_t *, uint32_t); 278135f7de5SShteryana Shopova enum snmp_code snmp_calc_keychange(struct snmp_user *, uint8_t *); 279135f7de5SShteryana Shopova 280f06ca4afSHartmut Brandt extern void (*snmp_error)(const char *, ...); 281f06ca4afSHartmut Brandt extern void (*snmp_printf)(const char *, ...); 282f06ca4afSHartmut Brandt 283f06ca4afSHartmut Brandt #define TRUTH_MK(F) ((F) ? 1 : 2) 284f06ca4afSHartmut Brandt #define TRUTH_GET(T) (((T) == 1) ? 1 : 0) 285f06ca4afSHartmut Brandt #define TRUTH_OK(T) ((T) == 1 || (T) == 2) 286f06ca4afSHartmut Brandt 287f06ca4afSHartmut Brandt #endif 288