xref: /freebsd/contrib/bsnmp/lib/snmp.h (revision 8e9b3e707151d136ec95e7f1d37556e39c1e228c)
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